2015-09-26 123 views
0

我目前正在以下为Shellcoder's Handbook (2nd edition)的勘误表。这本书有点过时了,但还是很不错的。我的问题现在的问题是,我不能想我需要的有效载荷多久,是我试图按照每一个步骤(和运行GDB使用相同参数),我试图猜测缓冲区开始的地方,但我不知道到底。我对此也很新,所以这很有道理。堆栈溢出(Shellcoder手册)

我有一个易受攻击的程序strcpy()buffer[512]。我想让堆栈溢出,所以我使用程序运行一些A(如Shellcoders Handbook的Erratas)。我想找到有效载荷需要多长时间(无ASLR),因此理论上我只需要找到缓冲区的位置。

由于我新的,我不能张贴图片,但是从书中的首选输出有一个完整的4行的“A的(0x41414141),而我是这样的:

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

什么地址是?我如何知道这个缓冲区在哪里启动?我想这样做,所以我可以继续与这本书合作。我意识到缓冲区是在那里,因为我跑的是A。但是如果我想知道有效载荷需要多长时间,我需要从哪里开始。

+0

你可以在imgur上传的图片,并可以分享这里。 –

回答

0

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

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

你的第二行看起来有点搞砸了,你有相同的地址,并且你还错过了:这个字符,我再次假设这只是复制的结果。我期望第二行的地址是0xbffff978

如果缓冲区以0x41414141的第一个字开始,那么这是在地址0xbffff970,虽然找出变量地址的更简单的方法就是向gdb询问变量的地址,所以在你的情况下一旦GDB停止在一个地方buffer的范围是:

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

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

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

[email protected]:/pentest/exploits/framework3/tools# ./pattern_create.rb 
Usage: pattern_create.rb length [set a] [set b] [set c] 
[email protected]:/pentest/exploits/framework3/tools# ./pattern_create.rb 5000 

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

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

非常有用! – wiz