Simple Reverse 0x06(Lab - AMessageBox)

Simple Reverse 0x06(Lab - AMessageBox)

Background

組合語言ROL和RCL的區別

Recon

這一題其實以逆向的角度來說很簡單

  1. 先用DIE看一些資訊 發現有加UPX的殼,這件事情可以透過IDA更加確定 可以看到Function Name只有start然後反組譯的地方看起來很噁心,那應該就是在拆殼的步驟
  2. 先執行看看 需要輸入flag然後用一個message box噴錯
  3. 用x64-dbg 透過TA的講解,可以知道這一題不需要解殼,只需要用動態debugger看一下就可以了
    1. 我們知道題目有使用到message box的API,所以我們可以先鎖定該API在哪邊呼叫,再往回trace出他的判斷 我們可以利用符號的視窗看到這支程式有用到那些API Module(.dll),而message box的API是在user32.dll,用下面的搜尋可以縮小範圍,但這個多種類的messagebox,具體來說是用哪一個也不知道,所以可以全選後都設立中斷點
    2. 剩下的就是跟一般debugger差不多的操作,當追到call messagebox之前的break point時,可以看一下call stack(呼叫堆疊)往前trace是誰呼叫了API,發現是00C7110B,點進去看一下可以明顯看到Correct/Wrong的字樣,所以可以判斷應該是這一段程式在判斷我們輸入的東西
    3. 分析判斷的程式 這裡就是要考驗耐心和不斷的觀察register的變化,認真看大概花個半小時就可以知道這一段在幹嘛(我就菜QAQ)
    4. 結論是中間的那些==重要的操作==其實就是左旋轉+XOR 0x87這樣而已,所以我們就可以開寫腳本了,把東西反著作回去就好了

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}