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