---
# System prepended metadata

title: Reversing.kr Write Up
tags: [CTF]

---

# Reversing.kr Write Up
###### tags: `CTF`
## 1. Easy Crack
- 先跑一遍: 需要輸入password,如果不正確會跳MessageBox
![](https://i.imgur.com/EbcQ3pn.png)
- 開ida -> shift+f12(列出字串): 可以快速ref到出現"Incorrect Password"的function
- f5看Pseudocode
![](https://i.imgur.com/rtDGPQ8.png)
- 得出string應該是Ea5yR3versing


## 2. Easy Keygen
- 跑一遍:要輸入name & serial
![](https://i.imgur.com/S3KL2Td.png)
- 丟ida -> 關鍵pseudocode在這邊
`Note: name每三個字就分別跟key[0/1/2]做XOR得到result, 輸入的serial會跟result做strcmp`
![](https://i.imgur.com/SgpfOue.png)
- 因此serial = name ^ key -> name = serial ^ key,內附的文件中 
    serial : 5B134977135E7D13,而%s%02X表示result的字串會以16進位輸出,且不足2位前面補0
    ```python=
    name = ''
    serial = '5B134977135E7D13'
    key = [0x10, 0x20, 0x30]

    for i in range(len(serial)//2):
        name+=chr(int(serial[2*i:2*i+2],16) ^ key[i%3])
        # 要轉回chr因為scanf(%s, input) -> 以字串形式輸入
    print(name)
    ```
- 結果為K3yg3nm3

- **補充**: 在還沒看f5之前看組語看到新東西
![](https://i.imgur.com/gRlCjzL.png)
    - repne = repeat not equal = inc/dec edi + dec ecx
        當CX!=0 & ZF=0時,重複執行後面的指令,每執行一次edi會改變, ecx會減1
        (如果Direction Flag=0, inc edi; DF=1, dec edi)
    - scasb = scan string byte = cmp byte ptr [edi], al
    - repne scasb用法經常長這樣
        ```asm=
        mov edi, [...]
        mov al, x
        mov ecx, N
        repne scasb
        ```
        代表在N輪內,di這個位址裝的字串如果沒有x,就跳出迴圈
    - 經常用來計算字串長度, 組語如下
        ```asm=
         mov ecx, FFFFFFFF    # 設置循環次數-1
         sub eax, eax         # 設置搜索內容為0
         repnz scasb          # 一直重複搜索到edi字符串的結尾0
         not ecx              # 計算搜索次數，也就是字符串的完整長度
                              # not ecx = -1 - ecx
                              #         = -1 - (-1 - (字串長度+1)
                              #         = 字串長度 + 1
         dec ecx              # 多出來的1是計算字尾0多算的要扣掉
        ```

## 3. Easy Unpack
- 先用PEid查殼
![](https://i.imgur.com/Yg6qGIP.png)
    - Entropy代表隨機度
    - EP = Entry Point ->可以看到是有被packed的
- 目標是找OEP -> 用ollydbg
`Note: ctrl+f2 ->重新載入 `
    1. 在剛進入附近就遇到call F7跟進去
    2. 如果執行到某個call就開始執行,F7跟進去
    3. 往下跳實現,往上跳在下一行按F4
    4. OEP前通常有個大範圍的jump
    
- 執行到jmp 00401150就跳出執行窗口 -> 表示他就是OEP
![](https://i.imgur.com/dRe71Tn.png)
- 再F8進去看到assembly=55就知道對惹(=push ebp)
`Note: Ctrl + A強制編譯成組語`
![](https://i.imgur.com/bwOs9Be.png)


 
## 4. Music Player
- 先執行看看,載入的音樂檔撥放1分鐘後會跳一個視窗出來
![](https://i.imgur.com/zFV8W2A.png)
- 根據readme的提示,目標是要讓他播放超過1分鐘
![](https://i.imgur.com/PvZnupv.png)
- 丟進ida看看