# Reversing.kr Write Up
###### tags: `CTF`
## 1. Easy Crack
- 先跑一遍: 需要輸入password,如果不正確會跳MessageBox

- 開ida -> shift+f12(列出字串): 可以快速ref到出現"Incorrect Password"的function
- f5看Pseudocode

- 得出string應該是Ea5yR3versing
## 2. Easy Keygen
- 跑一遍:要輸入name & serial

- 丟ida -> 關鍵pseudocode在這邊
`Note: name每三個字就分別跟key[0/1/2]做XOR得到result, 輸入的serial會跟result做strcmp`

- 因此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之前看組語看到新東西

- 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查殼

- Entropy代表隨機度
- EP = Entry Point ->可以看到是有被packed的
- 目標是找OEP -> 用ollydbg
`Note: ctrl+f2 ->重新載入 `
1. 在剛進入附近就遇到call F7跟進去
2. 如果執行到某個call就開始執行,F7跟進去
3. 往下跳實現,往上跳在下一行按F4
4. OEP前通常有個大範圍的jump
- 執行到jmp 00401150就跳出執行窗口 -> 表示他就是OEP

- 再F8進去看到assembly=55就知道對惹(=push ebp)
`Note: Ctrl + A強制編譯成組語`

## 4. Music Player
- 先執行看看,載入的音樂檔撥放1分鐘後會跳一個視窗出來

- 根據readme的提示,目標是要讓他播放超過1分鐘

- 丟進ida看看