Simple Reverse 0x06(Lab - AMessageBox)
Background
Recon
這一題其實以逆向的角度來說很簡單
- 先用DIE看一些資訊
發現有加UPX的殼,這件事情可以透過IDA更加確定
可以看到Function Name只有start然後反組譯的地方看起來很噁心,那應該就是在拆殼的步驟
- 先執行看看
需要輸入flag然後用一個message box噴錯
- 用x64-dbg
透過TA的講解,可以知道這一題不需要解殼,只需要用動態debugger看一下就可以了
- 我們知道題目有使用到message box的API,所以我們可以先鎖定該API在哪邊呼叫,再往回trace出他的判斷
我們可以利用符號的視窗看到這支程式有用到那些API Module(.dll),而message box的API是在
user32.dll
,用下面的搜尋可以縮小範圍,但這個多種類的messagebox,具體來說是用哪一個也不知道,所以可以全選後都設立中斷點 - 剩下的就是跟一般debugger差不多的操作,當追到call messagebox之前的break point時,可以看一下call stack(呼叫堆疊)往前trace是誰呼叫了API,發現是
00C7110B
,點進去看一下可以明顯看到Correct/Wrong的字樣,所以可以判斷應該是這一段程式在判斷我們輸入的東西 - 分析判斷的程式
這裡就是要考驗耐心和不斷的觀察register的變化,認真看大概花個半小時就可以知道這一段在幹嘛(我就菜QAQ)
- 結論是中間的那些==重要的操作==其實就是左旋轉+XOR
0x87
這樣而已,所以我們就可以開寫腳本了,把東西反著作回去就好了
- 我們知道題目有使用到message box的API,所以我們可以先鎖定該API在哪邊呼叫,再往回trace出他的判斷
我們可以利用符號的視窗看到這支程式有用到那些API Module(.dll),而message box的API是在
Exploit
import binascii
enc_flag = [0xB5, 0xE5, 0x8D, 0xBD, 0x5C, 0x46, 0x36, 0x4E, 0x4E, 0x1E, 0x0E, 0x26, 0xA4, 0x1E, 0x0E, 0x4E, 0x46, 0x06, 0x16, 0xAC, 0xB4, 0x3E, 0x4E, 0x16, 0x94, 0x3E, 0x94, 0x8C, 0x94, 0x8C, 0x9C, 0x4E, 0xA4, 0x8C, 0x2E, 0x46, 0x8C, 0x6C]
def pad(m):
length = 0
if len(m) % 8 != 0:
length = 8-len(m) % 8
return '0' * length + m
FLAG = []
for i in range(len(enc_flag)):
enc_flag[i] ^= 0x87
tmp = pad(bin(enc_flag[i])[2:])
tmp = hex(int(tmp[-3:] + tmp[:-3], 2))
FLAG.append(binascii.unhexlify(tmp[2:]).decode())
print("".join(FLAG))
Flag: FLAG{8699314d319802ef792b7babac9da58a}