NO CTF NO LIFE

Boston Key Party CTF 2014 100 risc_emu

這次為期36小時
題目很多 而且有些感覺很有趣
可惜周六有點事情 這次沒辦法全程參與
最後只拿到500分 好弱 ORZ


這題是模擬 RISC CPU 的程式
類型是 Pwning , ELF x64
能執行類似 ARM 語法的模擬器

RISC CPU Emulator BkP 2014
Give me your bytecode!
Please give me your bytecode base64'd:
aaaa
Got it, executing aaaa now!
I don't recognize opcode 0x69

我們可以給它一個 bytecode(須加密成base64)
格式為 [opcode] [dst] [src] [value] (會依據指令不同有所分別)
dst就是模擬的register
位於程式heap的某些區段
能接受的指令有9種:
add,addi,sub,subi,xor,and,mul,div,term

reverse以後發現處理指令的方式位於0x401c66
是以一個function table儲存每個指令的address
再由call eax的方式去執行
接著繼續trace發現一個有趣的事情
大部分的指令在dst都有做過濾
如果>=8就會回傳ERROR!
只有addisubi不會!
這邊可以任意竄改0x604b50+0xff範圍之內的的值
0x604b50~0x604b70是模擬器中register的值
而0x604c10開始就是function table
我們可以竄改function table到我們要的eip

到這邊為止都是正確的思路
接下來我浪費了將近5小時在做exploit...
我發現不管輸入多長的字串
emu會切割成好幾個4 byte的指令並執行
後面可以塞shellcode
接著我企圖透過addi將其中一個function的值由0x40xxxx
覆寫成0x60xxxx 也就是buf的位置
但是由於emu每次執行完指令後回將return value存在heap中
執行超過12個指令將會蓋到題目的heap guard
將會出現:

*** HEAP FUCKERY DETECTED ***: /home/dada/wargame/risc_emu/emu terminated *
Obtained 4 stack frames.
/home/dada/wargame/risc_emu/emu() [0x4025f6]
/home/dada/wargame/risc_emu/emu() [0x401bb2]
/lib/x86_64-linux-gnu/libc.so.6(_libc_start_main+0xed) [0x7ffff722976d]
/home/dada/wargame/risc
emu/emu() [0x401379]

但是如果我們輸入不只4byte
後面的指令會繼續被執行
並不會馬上將return value存到heap
於是還是可以將function table寫成buf的位置
一切都就緒後我發現還是無法成功
why? 因為這題有DEP 囧!!!!!!!
所以這一段基本上都是白費工夫
因為所有能塞shellcode的區段根本沒辦法執行 Orz

到這邊我就很賭爛的去睡覺了
隔天起來突然發現這題原來got裡有一個system()....
而且很剛好 在call eax到emu function的時候
剛好edi指向的是buf的位置.....OTZ (呼叫system()參數指標也是放在edi)
所以這題只要:

  1. 用addi去改function table中一個function的值 ex:term
  2. 第一個byte放\x09(term的opcode),後面接system的參數

就可以任意執行指令了 ORZ
此外這題已經把stdout dup到socket
所以只要system("cat key")以後就有key了

flag"stupid_boston_leprechauns_and_geohots