【问题标题】:Running own code with a buffer overflow exploit使用缓冲区溢出漏洞运行自己的代码
【发布时间】:2017-11-18 14:38:07
【问题描述】:

我正在尝试了解缓冲区溢出漏洞,更具体地说,是如何使用它来运行自己的代码 - 例如通过启动我们自己的恶意应用程序或任何类似的东西。

虽然我确实理解使用 gets() 函数的缓冲区溢出漏洞的想法(用足够长的字符串覆盖返回地址,然后跳转到所述地址),但有一些事情我很难理解真正的应用,那些是:

  • 我是否将自己的代码放入返回地址后面的字符串中?如果是这样,我怎么知道要跳转到的地址?如果没有,我应该在哪里跳转,实际代码在哪里?

  • 运行代码的实际有效负载是我自己正在运行的软件,而其他程序只是跳入其中,还是有效负载中提供了所有指令?或者更具体地说,缓冲区溢出漏洞利用实现实际上是什么样的?

  • 地址(或任何指令)包含 0 时该怎么办? get() 函数在读取 0 时停止读取,那么如何解决这个问题呢?

作为一项家庭作业,我正在尝试利用一个非常简单的程序,该程序只需使用gets()(ASLR 关闭)请求输入,然后打印它。虽然我可以找到调用它的函数的内存地址和返回值,但我就是不知道如何实际实现漏洞利用。

【问题讨论】:

  • 您通常会在其中一个共享库中查找 jmp 到 rsp 之类的指令。由于共享库总是在已知地址加载,因此您可以从外部确定一个此类函数的地址。
  • 这可能是 Sec.SE 的最佳匹配

标签: c security x86 buffer-overflow exploit


【解决方案1】:

您了解更改返回地址如何让您跳转到任意位置。

但是由于您已正确识别,您不知道您将要执行的代码加载到何处。您只是将其复制到本地缓冲区(主要是堆栈上的某个位置)。

但是有一些东西总是指向这个堆栈,它是堆栈指针寄存器。 (假设 x64 为 %rsp)。

假设您的自定义代码位于堆栈顶部。 (它可以是一个偏移量,但也可以类似地进行管理)。

现在我们需要一个指令 1.允许我们跳转到esp 2. 位于固定地址。

所以大多数二进制文件都使用某种共享库。在 Windows 上,您有 kernel32.dll。在加载这个库的所有程序中,它总是映射到相同的地址。所以你知道这个库中每条指令的确切位置。

你所要做的就是反汇编一个这样的库并找到类似的指令

jmp *%rsp // or a sequence of instructions that lets you jump to an offset

那么这条指令的地址就是你要放置的返回地址应该在的地方。 该函数将返回然后跳转到堆栈(当然你需要一个可执行堆栈)。然后它会执行你的任意代码。

希望能消除一些关于如何让漏洞利用运行的困惑。

回答您的其他问题-

是的,您可以直接将代码放入缓冲区。或者,如果您可以找到您想要执行的确切代码(同样在共享库中),您可以直接跳转到该代码。

是的,gets 会在 \n 和 0 处停止。但通常你可以通过稍微改变你的指令来编写完全不使用这些字节的代码来逃避。

您尝试不同的指令并检查组装的字节。

【讨论】:

  • 非常感谢,让我意识到我可以简单地跳转到 ESP(可以是缓冲区的起点)突然帮助我意识到这一切是如何工作的。
猜你喜欢
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 2013-02-01
相关资源
最近更新 更多