
原本其實沒有打算要解這題的,但看到有 patch 就代表應該洞不小,就跑來玩玩了
題目是一個簡單的小遊戲
給予好幾個石堆,每個石堆有隨機的石頭,每次能從單一石堆拿走指定數量的石頭
拿走最後石頭的人就贏了

提供了這些檔案 (請無視 __pycache__)
game.py 是遊戲的核心
myhash.py 是提供儲存遊戲時的 hash 值
server.py 與玩家互動
text.py 則存著要印出來的文字
patched 就是痾……patched 的檔案

這題原本應該是要偽造一局假的遊戲來讓自己獲勝….吧(畢竟是 crypto ,目的應該是反推 myhash 的 secret)
但 hint 提到說能檢查一下 patch 前後檔案差別,那我就恭敬不如從命了
做個簡單的 diff 能發現 server.py 多了一行 continue

恩? 加了這行是為了什麼?
continue 的這段迴圈主要是為了處理使用者在比賽時的輸入
檢查使用者輸入的選項決定要下棋 / 儲存 / 離開

後面這段則是檢查遊戲的狀態
如果使用者移動完後不能再移動,遊戲結束
不然的話 AI 執行他的動作

那….那個 continue 修了什麼東西?
問題就出在前面輸入的判斷那,如果輸入除了 0,1,2 以外的東西的話
上面的三個 choice 的 if 都不會進去,所以使用者會變成有點像 pass 了這回合
這樣也不會有 make_move() invalid 的問題,因為根本就沒有進去判斷過XD
但後面的 code 中, AI 還是執行了他的動作
所以只要一直的 Pass 下去,就會變成 AI 自己一個人玩完幾乎整局

直到對自己有利的時候再動作 ( 上圖是 local,下圖是 server )

就能拿到 flag
而那個 continue 就是修正了這個輸入 bug因為這個 bug,AI 從必贏變成必輸了
其實我是寫 write up 時才認真去看 bug 在哪
比賽時看到沒 continue ,所以就在輸入時亂按一通,結果就被我按出來了XD
但是….
