Reversing.kr - 2021 進度
題目:CHSARP, SimpleVM, PEPassword, Direct3D FPS
CHSARP
Challenge Info
CSharp.exe
Solution
是 32-bit .NET 的 flag checker

所以丟 DNSpy
會先將輸入 base64 encode,然後做檢查,動態追一下看到 check function

| |
寫腳本解掉:
| |
Flag
dYnaaMic
SimpleVM
Challenge Info
SimpleVM
Solution
Try
一開始 IDA 報錯,但實際上 entry point 沒有問題

把 segment size 改大,IDA 就不會判斷錯了

實際執行失敗,strace 發現會去 /lib/ld-linux.so.2, /usr/lib/libc.so.6 載入特定 library,所以建個 link 給它用
| |
缺 library 就裝一下
| |
這時候就能成功執行,得到結果 Access Denied,索性用 sudo 執行後要求輸入東西,然後得到 Wrong
Analysis
一邊動態追,一邊用 IDA 把 code 弄好看一點,基本上是會在 0xc03000 開 rwx 空間,寫 shellcode,最後跳進去
把 0xc03000 dump 出來一樣丟 IDA,順手設個 base address(See Edit-->Segments-->Rebase program)

shellcode 範圍大概是在 0xc01000~0xc04000 左右
sub_C03057會readlink('/proc/self/exe', 0xffffc77c, 0x1000)
再追下去會進到 0x08048000~0x0804b000(RX),這邊就有好東西了
sub_8048556():根據權限、輸入的檢查結果輸出'Access Denied\n','Error\n','Wrong\n','Correct!\n'等訊息check_8048C6D():對輸入進行檢查,基本上是利用byte key_0804B0A0[200](前 8 bytes 為輸入)跟int temp_0804B190[3]做驗證(實際運行方式可以參考最後的腳本)
執行流程小亂,靜態逆 check_8048C6D() 感覺不會很舒服,所以把每次 switch case 時的 temp_0804B190 print 出來觀察:
| |
稍微做測試,會發現輸出基本上都長得像下面那樣,只有數字 33 的地方會隨著第一個字元變動,所以爆破第一個字元做測試,發現在輸入是 i 的時候,輸出會變 13 行,舒服
| |
Brute Force
如果後面也是逐個字元做比對就能爆破 flag,事實上也真的是如此:
| |
原始碼中
check_8048C6D()執行前會把 key ^= 0x10,check_8048C6D()會使用 xor 0x10 做 decode,所以可以直接去掉這題的兩個腳本其實一個就夠了(做一樣的事情),但既然都寫了就放著作紀念XD
Flag
id3*ndh
PEPassword
Challenge Info
Original.exe, Packed.exe
Solution
Original.exe 執行結果如下

Packed.exe 被加殼過,實際執行有個輸入框但沒有提交按鈕之類的東西
丟 IDA 會解出幾個 function,索性全部下斷點,然後執行
發現在輸入框打字之後會撞到 sub_4091DA(),它會把輸入(esi)做 hash,結果存到 eax 中

接下來回到 0x040919C 比對 hash 值,如果一樣就會進到 sub_409200() 把 0x401000 的實際內容解出來
這邊有兩個值得注意的地方:
0x401000實際內容已知,就是Original.exe- 該 function 會先計算兩次 hash,並透過這兩個 hash value 解碼(第一次存 ebx, 第二次存 eax)
解碼流程簡單來說:每次用 eax 解 4bytes,然後用 ebx 更新 eax 的值。也就是說,只要有 eax 跟 ebx 就能順利解碼
eax 很好算 0x401000 解碼前後的 4 bytes xor 一下就有了
ebx 可以用爆破的,因為 eax 更新後的值也是已知,腳本如下:
| |
結果如下,其中第二組是正確的
| |
動態改掉 eax, ebx 就得到 flag 了

還不錯的題目,順便練習 gcc 的 inline-assembly
Flag
From_GHL2_!!
Direct3D FPS
Challenge Info
data/, FPS.exe, D3DX9_43.dll
Solution
如同檔名,是一個 FPS 遊戲,FPS 會隨著擊殺怪物數量而提高,最後會到 78 左右

很久以前用 CE 亂戳的結果,直接把血量調成 0,可以秒殺怪物

也能鎖血

但把看得到的怪物殺光也沒 flag
丟 IDA 不難發現有個 game clear 的檢查

xref enc_flag_407028 可以找到一個 decode function,看起來是個簡單的 xor

所以遊戲啟動之後,CE attach 上去跑 lua script
| |
得到 flag
| |
Flag
Thr3EDPr0m