我目前正在关注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语言。但是,如果我想找到有效载荷需要多长时间,我需要它开始的点。
答案 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#