r0ops
r0ops: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xb16f0af4069e5f9972c2bbb85360187144163125, stripped
首先程式會在 listen on 13337 port 接著執行位於 0xDEAD3AF 上的函數:
sub_DEAD3AF()
會 recv 4096 個 byte,接著 呼叫 memcpy()
複製一些資料 最後把 rsp
修改為 0xE0AF8A0
後執行 ret
如同題目名稱, rsp
指向的資料區塊是個 rop chain... 透過肉眼辨識配合 ida pro 重新命名可以很快的把這些 function address 整理成對應的指令:
接者轉換成類 asm 格式:
不難發現 register 間的資料轉移都是夾在 add rsi, 8
與 sub rsi, 8
之間
再進一步簡化翻譯出 c code,其中 flag[8]
為我們送出的內容:
整理一下整個流程,簡單來說程式會從 port 13337 讀取 8 個 64bits 整數,計算出每個數的 13337 次方 mod 2 ^ 64 並與特定值比較,最後用這符合條件的 8 個數拼出 flag
在這裡可以發現程式組 flag 時其實是用 %08llx
做 format, 也就是說我們只需要知道目標數的最後 4 bytes,可以直接用暴力破解的方式爆出 crack.c:
最後手動組出 flag
Flag: 0ctf{c97155a5e288fa45f926b1058e4e0385d6ccde8513002885dc67948524bcbc85}