Stack Overflow(Shellcoder' s手册)

时间:2015-09-26 05:15:15

标签: security gdb stack overflow shellcode

我目前正在关注Shellcoder's Handbook (2nd edition)的错误。 这本书有点过时但仍然相当不错。我现在的问题是,我无法猜测我的有效负载需要多长时间我试图遵循每一步(并使用相同的参数运行gdb)并且我试图猜测缓冲区的起始位置,但我不会#39确切地知道。我也是新手,所以它是有道理的。

我的易受攻击的程序包含strcpy()buffer[512]。我想让堆栈溢出,所以我用程序运行了一些A(作为Shellcoders手册的Erratas)。我想找出有效载荷需要多长时间(没有ASLR)所以理论上我只需要找到缓冲区的位置。

由于我是新的,我无法发布图片,但本书的首选输出有一个完整的4行' A(0x41414141),我的就像这样:

(gdb) x/20xw $esp - 532         
0xbffff968 : 0x0000000  0xbfffffa0e 0x41414141 0x41414141
0xbffff968   0x41414141 0x41414141  0x00004141 0x0804834

那是什么地址?我怎么知道这个缓冲区的起始位置?我想这样做,所以我可以继续使用这本书。我意识到缓冲区位于那里,因为我运行的是A语言。但是,如果我想找到有效载荷需要多长时间,我需要它开始的点。

2 个答案:

答案 0 :(得分:0)

我不确定你是否正确复制了gdb的输出。您使用了命令x/20xw,这表示您要检查20个32位字的内存,显示为十六进制。因此,显示的每个数据项应包含0x后跟8个字符。你有一些只有7,有些有9.我会假设你手工复制了文本并犯了一些错误。

地址是行上显示的第一个项目,因此,对于第一行,地址为0xbffff968,这是该行上第一个字节的地址。从那里你可以通过计算来计算出该行上每个其他字节的地址。

你的第二行看起来有些混乱,你有相同的地址,而且你也错过了:字符,我再次假设这只是复制的结果。我希望第二行的地址为0xbffff978

如果缓冲区以0x41414141的第一个单词开头,那么它位于地址0xbffff970,虽然更简单的方法来计算变量的地址只是向gdb询问地址变量,所以,在你的情况下,一旦gdb在buffer在范围内的地方停止:

(gdb) p &buffer
$1 = (char (*)[512]) 0xbffff970

答案 1 :(得分:0)

Metasploit有一个很好的工具来帮助计算偏移量。它将生成包含唯一模式的字符串。使用此模式(以及使用模式后EIP的值或任何其他位置),您可以看到缓冲区应该有多大,可以准确地写入EIP或其他任何位置。

打开metasploit framework3文件夹中的tools文件夹(我使用的是metasploit 3的linux版本)。你应该找到一个名为pattern_create.rb的工具。创建一个5000个字符的模式并将其写入文件:

root@bt:/pentest/exploits/framework3/tools# ./pattern_create.rb
Usage: pattern_create.rb length [set a] [set b] [set c]
root@bt:/pentest/exploits/framework3/tools# ./pattern_create.rb 5000 

然后只需用工具的输出替换A. 运行应用程序并等待应用程序再次死亡,并记下EIP或其他任何位置的内容。 然后使用第二个metasploit工具在写入EIP或其他任何位置之前计算缓冲区的确切长度,使用EIP的值或任何其他位置(基于模式文件)和缓冲区的长度来提供它:

root@bt:/pentest/exploits/framework3/tools# ./pattern_offset.rb 0x356b4234 5000
1094
root@bt:/pentest/exploits/framework3/tools#
  1. 这是覆盖EIP或其他任何位置所需的缓冲区长度。