---
# System prepended metadata

title: Simple Reverse 0x06(Lab - AMessageBox)
tags: [Reverse, eductf, CTF]

---

# Simple Reverse 0x06(Lab - AMessageBox)
## Background
[組合語言ROL和RCL的區別](https://www.796t.com/content/1550025925.html)

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

## Exploit
```python=
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}`