PicoCTF-reverse-allproblems
solve :
not crypto
No-Way_Out
not crypto
Difficulty : hard
picoCTF連結
Description
there’s crypto in here but the challenge is not crypto… 🤔
觀察
執行過後會要使用者輸入東西,丟入ida發現到中間有一大串的操作,最後有一個memcmp去比較兩個字串,有可能是比較我們輸入的字串與程式操作過後的字串做比較,因此可以下斷點在memcpy上面並觀察傳入的參數
solve
flag:
picoCTF{c0mp1l3r_0pt1m1z4t10n_15_pur3_w1z4rdry_but_n0_pr0bl3m?}
No_Way_Out
Difficulty : hard
picoCTF連結
Description
Put this flag in standard picoCTF format before submitting. If the flag was h1_1m_7h3_f14g submit picoCTF{h1_1m_7h3_f14g} to the platform.Windows game, Mac game Use password
picoctf
to unzip archives.
觀察
先用detect it easy 觀察一下
沒殼 使用C/C++
進入遊戲後在畫面的最上方有hint提示:Escape to find the flag
爬上梯子後被牆擋住,因此目標是要通過牆前往旗子的地方
可能可以考慮以下解法
- 更改玩家跳躍的功能
- 更改觸發flag的條件
- 瞬移到牆壁外面
Solve
解法一: dnspy
逛一下遊戲資料夾,發現有一個檔案名為
/pico_Data/Managed/Assembly-Csharp.dll
看檔案名可以猜測主要的遊戲程式內容,我們需要改的內容會在這裡
打開dnspy 並將Assembly-Csharp.dll丟進去
目標是要改變玩家的跳躍功能 因此要在裡面找到處理跳躍功能的程式碼
翻找一下會發現是在EvolveGames->PlayerController的update()函式中
其中有一個條件很明顯是處理跳躍功能
1 | if (Input.GetButton("Jump") && this.canMove && this.characterController.isGrounded && !this.isClimbing) |
這裡有兩個解法
- 增加跳躍數值
code:
1 | if (Input.GetButton("Jump") && this.canMove && this.characterController.isGrounded && !this.isClimbing) |
讓玩家一跳就跳很高
DEMO:
- 刪除限制條件
1 | if (Input.GetButton("Jump")) |
讓玩家可以在空中連續跳
DEMO:
另外,也可以注意到在APTX的 class中有一個條件
1 | if (collision.gameObject == this.player) |
這個條件的感覺很像是如果一個東西碰到玩家後,會將一個Mysterious設成true
可以猜測是如果玩家碰到旗子之後的程式
因此可以編輯這個class 新增一個start函式,讓遊戲執行的時候就將Mysterious設成true
1 | using System; |
DEMO:
解法二: CheatEngine
使用cheatEngin獲得玩家位置的記憶體位置,修改掉數值達成穿牆
參考影片
flag:
picoCTF{WELCOME_TO_UNITY!!}
PicoCTF-reverse-allproblems