# 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看看