【问题标题】:Can't understand the buffer overflow example in "The Art of Exploitation"看不懂“剥削的艺术”中的缓冲区溢出示例
【发布时间】:2013-03-11 03:13:39
【问题描述】:

我的问题与this one 非常相似但不一样。

我在书中运行了相同的exploit_notesearch.c 示例:Hacking, the Art of Exploitation on my 64-bit OS, Archlinux,但它不起作用。

从上面的链接我了解到它不能在大多数 64 位系统上运行。但我仍然不明白为什么程序必须这样做:ret = (unsigned int)&i - offset。为什么我不能这样做:ret = (unsigned)shellcode 以便我可以将易受攻击的程序的返回地址替换为 shellcode 的起始地址?

【问题讨论】:

  • &i - offset 用于链接问题(“this one”)以获取buffer 的地址(变量存储在...Wat?堆上),而不是shellcode(静态变量)。
  • 但是我在gdb中发现指向的地址缓冲区比&i小得多(如果使用的内存不多,堆地址应该比堆栈地址小得多吗?)。但是示例将偏移量设置为 270,我认为它假设这两个地址很接近。

标签: security buffer-overflow exploit shellcode


【解决方案1】:

ret = (unsigned)shellcode 将使ret 等于程序中shellcode 数组的地址。但是那个地址不是你的恶意代码在目标程序中的地址(notesearch.c)。目标进程会将其searchstring 放入堆栈,这样您的恶意代码也会放入目标进程的堆栈。

在过去,进程的内存布局通常具有高度确定性 - 攻击者通常可以很好地预测堆栈缓冲区的位置(特别是如果他们确切知道目标软件的哪个版本正在被攻击)。所以很容易知道searchstring 和你的shellcode 的确切地址是什么。

然而,今天,许多操作系统都会执行 ASLR。所以攻击者试图执行注入堆栈的shellcode必须首先找到堆栈。系统掩盖了攻击者的相关内存地址。这些值必须被猜测,并且由于应用程序崩溃(Segmentation Fault),错误的猜测通常无法恢复。

当涉及一些猜测时,为了提高成功的机会,活动的 shellcode 通常会在大量可执行的机器代码之前执行,这些机器代码没有执行任何有用的操作 - 称为“NOP sled”或“NOP slide”。

所以即使ret = (unsigned int)&i - offset 也无法确保你的shellcode 会成功执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 2017-04-08
    • 1970-01-01
    • 2019-04-17
    相关资源
    最近更新 更多