Stack Overflow(Shellcoder 手册)
Stack Overflow (Shellcoder's Handbook)
我目前正在关注 Shellcoder's Handbook (2nd edition) 的勘误表。
这本书有点过时,但还是很不错的。我现在的问题是我无法猜测我的有效载荷需要多长时间 我尝试按照每个步骤进行操作(并且 运行 gdb 具有相同的参数)并且我试图猜测缓冲区从哪里开始,但我不知道确切地知道。我对此也有点陌生,所以它很有意义。
我有一个易受攻击的程序 strcpy()
和 buffer[512]
。我想让堆栈溢出,所以我 运行 为程序打了一些 A(作为 Shellcoders 手册的勘误表)。我想找到有效载荷需要多长时间(没有 ASLR)所以理论上我只需要找到缓冲区的位置。
由于我是新手,所以我不能 post 图片,但是本书的首选输出有完整的 4 行“A”(0x41414141),而我的是这样的:
(gdb) x/20xw $esp - 532
0xbffff968 : 0x0000000 0xbfffffa0e 0x41414141 0x41414141
0xbffff968 0x41414141 0x41414141 0x00004141 0x0804834
那是什么地址?我怎么知道这个缓冲区从哪里开始?我想这样做,这样我就可以继续写这本书。我意识到缓冲区就在那里,因为我 运行 的 A。但是如果我想找到有效负载需要多长时间,我需要它开始的点。
我不确定您是否正确复制了 gdb 的输出。您使用了命令 x/20xw
,这表示您要检查内存中的 20 个 32 位字,显示为十六进制。因此,显示的每项数据应由 0x
后跟 8 个字符组成。有些只有 7 个,有些只有 9 个。我假设您是手抄文本并犯了一些错误。
地址是该行显示的第一个项目,因此,对于第一行,地址是0xbffff968
,这是该行第一个字节的地址。从那里您可以通过计数找出该行中每个其他字节的地址。
你的第二行看起来有点乱,你有相同的地址,而且你还缺少 :
字符,我再次假设这只是复制的结果。我希望第二行的地址是 0xbffff978
.
如果缓冲区以 0x41414141
的第一个字开头,那么它位于地址 0xbffff970
,尽管找出变量地址的更简单方法是向 gdb 询问地址变量的,因此,在您的情况下,一旦 gdb 在 buffer
范围内的位置停止:
(gdb) p &buffer
= (char (*)[512]) 0xbffff970
Metasploit 有一个很好的工具来帮助计算偏移量。它将生成一个包含独特模式的字符串。使用此模式(以及 EIP 的值或使用该模式后的任何其他位置),您可以看到缓冲区应该有多大才能准确写入 EIP 或任何其他位置。
打开 metasploit framework3 文件夹中的 tools 文件夹(我使用的是 linux 版本的 metasploit 3)。您应该找到一个名为 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#
- 这是覆盖 EIP 或任何其他位置所需的缓冲区长度。
我目前正在关注 Shellcoder's Handbook (2nd edition) 的勘误表。 这本书有点过时,但还是很不错的。我现在的问题是我无法猜测我的有效载荷需要多长时间 我尝试按照每个步骤进行操作(并且 运行 gdb 具有相同的参数)并且我试图猜测缓冲区从哪里开始,但我不知道确切地知道。我对此也有点陌生,所以它很有意义。
我有一个易受攻击的程序 strcpy()
和 buffer[512]
。我想让堆栈溢出,所以我 运行 为程序打了一些 A(作为 Shellcoders 手册的勘误表)。我想找到有效载荷需要多长时间(没有 ASLR)所以理论上我只需要找到缓冲区的位置。
由于我是新手,所以我不能 post 图片,但是本书的首选输出有完整的 4 行“A”(0x41414141),而我的是这样的:
(gdb) x/20xw $esp - 532
0xbffff968 : 0x0000000 0xbfffffa0e 0x41414141 0x41414141
0xbffff968 0x41414141 0x41414141 0x00004141 0x0804834
那是什么地址?我怎么知道这个缓冲区从哪里开始?我想这样做,这样我就可以继续写这本书。我意识到缓冲区就在那里,因为我 运行 的 A。但是如果我想找到有效负载需要多长时间,我需要它开始的点。
我不确定您是否正确复制了 gdb 的输出。您使用了命令 x/20xw
,这表示您要检查内存中的 20 个 32 位字,显示为十六进制。因此,显示的每项数据应由 0x
后跟 8 个字符组成。有些只有 7 个,有些只有 9 个。我假设您是手抄文本并犯了一些错误。
地址是该行显示的第一个项目,因此,对于第一行,地址是0xbffff968
,这是该行第一个字节的地址。从那里您可以通过计数找出该行中每个其他字节的地址。
你的第二行看起来有点乱,你有相同的地址,而且你还缺少 :
字符,我再次假设这只是复制的结果。我希望第二行的地址是 0xbffff978
.
如果缓冲区以 0x41414141
的第一个字开头,那么它位于地址 0xbffff970
,尽管找出变量地址的更简单方法是向 gdb 询问地址变量的,因此,在您的情况下,一旦 gdb 在 buffer
范围内的位置停止:
(gdb) p &buffer
= (char (*)[512]) 0xbffff970
Metasploit 有一个很好的工具来帮助计算偏移量。它将生成一个包含独特模式的字符串。使用此模式(以及 EIP 的值或使用该模式后的任何其他位置),您可以看到缓冲区应该有多大才能准确写入 EIP 或任何其他位置。
打开 metasploit framework3 文件夹中的 tools 文件夹(我使用的是 linux 版本的 metasploit 3)。您应该找到一个名为 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#
- 这是覆盖 EIP 或任何其他位置所需的缓冲区长度。