一个CTF示例向您展示了简单而强大的One Gadget工具。

一个CTF示例向您展示了简单而强大的One Gadget工具。

时间:2021-3-8 作者:admin

一个供开发的小工具

一个小工具是一行C代码:execve(“/bin”, 0, 0);。显然,这段代码产生了一个外壳。如果您能够在内存中找到并运行它,您将得到一个shell!看见?轻松有力!

幸运的是,它存在于Libc中。大多数程序都使用Libc!Libc是一个C库文件。One_Gadget工具查找这些文件中出现的所有代码。

著名的小工具

(LinuxOS):通过运行GEMInstallOne_Gadget下载该工具。然后,您可以轻松地在这样的终端中运行它:one_gadget /usr/lib/x86_64-linux-gnu/libc-2.31.so。参数是通向Libc文件的路径。它可能会在你的机器上改变。这将产生以下输出:

一个CTF示例向您展示了简单而强大的One Gadget工具。

execve(“/bin”, r12, r13) is the one gadget。在运行这之前,您需要确保这两行约束都是真/满意的。一个小工具变成在满execve(“/bin/sh”, 0, 0) 只有足约束的情况下。0xcbcda是Libc文件中小工具的偏移量。为了知道内存中小工具的地址,还需要知道内存中Libc文件的基本地址:小工具的内存地址=Libc文件的内存基地址加上Libc文件中的小工具的偏移量。

一个具体的ctf示例向您展示如何一步一步地使用该工具。

环境设置与介绍

首先,下载这个档案。它来自于这个平台 > Pwn > [BJDCTF 2nd]one_gadget。然后,运行它,并生成以下输出:
here is the gift for u:0x7f784418acb0 Give me your one gadget:如果您拆解可执行文件,您会发现礼物实际上是Libc函数的地址。printf。它可能在每次不同的执行中发生变化。您还会发现可执行文件要求您输入一个小工具的地址。可执行文件将在给定地址执行一个小工具。现在让我们看看我们将如何执行一个小工具。

克服CTF问题

以下是步骤:

  1. 在gdb上安装支持以下命令的插件vmmap。我使用全球环境基金。
  2. 跑gdb problem。现在,gdb读取可执行文件。然后,使用命令“r”在gdb下运行程序。接下来,按“ctrl+c”将控件返回给gdb。现在,我们可以使用命令检查内存。vmmap。在输出中,您会注意到下面的图片显示了Libc文件的路径。这是这个程序中使用的Libc。现在我们想在Libc文件中找到其中一些小工具。一个CTF示例向您展示了简单而强大的One Gadget工具。
  3. 退出gdb进程。现在,跑one_gadget /usr/lib/x86_64-linux-gnu/Libc-2.31.so。你需要改变通往你的道路。您将在输出中观察到类似于第3节中的图片。现在,我们在Libc文件中有了一个小工具的偏移量:0xcbcda。
  4. 您还需要找到Libc函数的偏移量。printf。运行以下命令:objdump -tT /usr/lib/x86_64-linux-gnu/Libc-2.31.so | grep ” printf”。您需要用您的路径替换到Libc文件的路径。下面的图片是输出。第一列是偏移量。所以.的偏移量printf是:0x56cb0。一个CTF示例向您展示了简单而强大的One Gadget工具。
  5. 重新启动gdb:gdb问题。在Main设置一个断点:b main。运行程序:r。现在,您将看到程序在主函数处停止。使用以下命令一次运行一行代码:n。如果您看到这样的输出:here is the gift for u:0x7ffff7e3bcb0,用我在第3节中给出的公式计算一个小工具的地址:gadget address = Libc base address + gadget offset = printf address – printf offset + gadget offset = 0x7ffff7e3bcb0 – 0x56cb0 + 0xcbcda = 0x7ffff7eb0cda = 1407373527646.
  6. 继续运行程序的n。现在,看看下面的图片。在.之后printf函数执行后,您将看到输出:给我您的一个小工具。但是,现在不是输入一个小工具地址的合适时机。你得等到红色scanf函数被执行。这时您需要输入一个小工具地址。一个CTF示例向您展示了简单而强大的One Gadget工具。
  7. 在运行scanf函数,现在是输入您的一个小工具地址的时候了。输入十进制格式的地址,而不是十六进制格式!就我而言,这是140737352764634。请小心从现在开始,因为一些魔术即将发生。在.之后scanf函数,下面是将要执行的机器代码。从$pc指针,你看到这三行代码在做什么了吗?它们将内存中的一个值[RBP-0x18]移动到RDX。运行这三行代码之后,您将发现RDX存储了一个小工具地址!然后call rdx去执行一个小工具!一个CTF示例向您展示了简单而强大的One Gadget工具。
  8. 运行代码直到call rdx,但不要跑call rdx!为什么?回想一下,在我们能够成功地执行一个小工具之前,需要满足一些约束。制约因素是:r12 == NULL && r13 == NULL。现在,让我观察它们是什么(如下图所示)。显然,r12不是空的。我们需要使用命令:set将其设置为空。$r12 = 0。现在,如果运行以下命令:p $r12,你会发现r12变成零。一个CTF示例向您展示了简单而强大的One Gadget工具。
  9. 现在,我们可以跑了call rdx。这一次,我们继续执行以下命令:c。马上就会产生一个贝壳!
一个CTF示例向您展示了简单而强大的One Gadget工具。

摘要

这篇文章使用了一个具体的CTF问题,向您展示了如何一步一步地查找和执行一个小工具,并最终生成一个shell。如果你喜欢这篇文章,请帮我在你的社交媒体上分享。非常感谢!

如果你想需要软件开发,可以点以下链接进行询问

版权所有:https://www.eraycloud.com 转载请注明出处