【CSAW CTF Qualification Round 2022】逆向---部分WriteUp
Anya Gacha
分析
打開文件夾,發現是Unity遊戲
- 先打開遊戲看看是在干什麼
- 大概是一個抽卡遊戲,左上是金錢( 每次-10 ),按左下按鈕開始抽取
- 逆Unity遊戲通常可直接找到它的
Assembly-CSharp.dll
文件( 在\AnyaGacha_Data\Managed
目錄下 ),將其拉入dnspy
進行分析( 32位 ) - 在開始時對一些數據進行了初始化,這裡其中一個數據用了隨機數
- 找到按下【抽卡】按鈕所調用的函數
- 這裡首先判斷【金錢】是否>10,若是才能繼續
- 後面再對一些數據進行處理,然後調用
this.Upload()
- 進入
this.Upload()
,看到它是通過發送網路請求來驗證 - 但我看不懂要怎樣才能走到
this.succeed(text)
,而上面有提到一開始使用了隨機數來初始化數據,因此我猜測這可能與真的抽卡遊戲一樣,是概率問題 - 所以我的破解思路:不斷調用
this.Upload()
,直到成功為至
暴力破解
在dnspy中,右鍵
→Edit Method
,修改wish
函數
1 | public void wish() |
同樣方法修改Upload
函數
1 | private IEnumerator Upload() |
backfrom
這是按【返回鍵】後會調用的函數
1 | public void backfrom(GameObject g) |
- 然後保存,方法:
File→Save Module
- 之後打開遊戲,按【make a wish】之後,狂按右上的【back】
- 理論上按下【make a wish】之後,慢慢等就會自動出flag,但不知為何出不了( 等得不夠久? ),但只要按上述那樣改掉
backfrom
函數,然後狂按【back】就很快會出flag
Game
分析
題目描述如下圖所示:
- 先拉入IDA,去
main
函數看看 - 看不出什麼,再繼續進入
level_gen()
- 要求用戶輸入1、2、3,分別對應左、中、右三條路
- 然後之後會調用
level_next
,繼續跟入去
- 可以看出共有3個結果,分別是【繼續3選1】、【到達某個出口】、【到達需要password的地方】
- 在需要輸入password的地方輸入password後,會與
fnv_1a_32
函數的返回值進行對比,若一致就會輸出某些東西,推測與flag有關
解題過程
記錄一下當時在做題時的一些經歷
- 看到這樣類似走迷宮的題,本來打算先將【地圖】dump出來再分析,但試著試著突然想起題目給了個
nc rev.chal.csaw.io 5003
,代表他將數據放在了服務器上,若我在本地上直接動調會失去【地圖】數據(然後我就放棄了) - 不知道如何將服務器上的數據dump下來,之後我想了一想,發現以我的水平,好像只能嘗試將【地圖】手動爆破出來
手動爆破的地圖如下圖所示:
- 最底下是超始位置,左、中、右3格對應1、2、3
- 黃圈
P
代表要輸入密碼的地方( 上方有橙色勾的是不重複的地方,其他沒有橙色勾的黃圈P
會與其中一個有橙色勾的地方重複 ) - 綠色
w
是出口( 沒有什麼用 ) - 普通白色圈代表繼續【3選1】
- 黑色
x
代表死路
- 現在要先找出所有密碼。去到驗證密碼的地方分析
v11
的大小是50字節,但qmemcpy
卻只複製了”cook”
4個字節,明顯有古怪- 雙擊
”cook”
,發現其下還有東西,且正好可以每10個字節1組,分成5組 - 而由
fnv_1a_32(&v11[10 * v8]) == pass
也可以看出fnv_1a_32
函數也是每10個字節1組進行處理
編寫腳本
1 |
|
由於不知道哪個密碼對應哪條路,因此只能逐一嘗試,最終經過無數次的嘗試得出:
11
這條路徑的密碼是4013828393
,輸出結果為:flag{e@5+er_
1313
這條路徑的密碼是3000956154
,輸出結果為:p@yw@115_i5_
131221
這條路徑的密碼是4013828393
,輸出結果為:+he_dum6e5+_
1312221
這條路徑的密碼是1688072995
,輸出結果為:ide@_ever!!}
222
這條路徑的密碼是1118844294
,輸出結果為:e995_6ehind_
將路徑由小到大排列得出flag為:flag{e@5+er_e995_6ehind_p@yw@115_i5_+he_dum6e5+_ide@_ever!!}
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 NgIokWeng's Blog!
評論