[re]go語言逆向:2020網鼎杯朱雀組re what wp
題目分析
那道題目,是一個linux的逆向,直接輸入key:
然後逆向分析一下,是一個go語言開發的程序,看着比較複雜,但是字符串什麼的都沒有混淆,可以通過“please input the key:”字符串找到入口:
然後還可以看到一個類似base64串一樣的字符串,感覺像是校驗用的,繼續往下看找到輸入,和輸入後的校驗:
可以看到輸入校驗之後,錯誤會直接提示error,成功會有一大波操作,簡單看了下感覺應該是對開頭的flag字符串進行解碼或者解密操作,然後輸出flag:
解題
所以現在差不多知道,我們只要把key輸入正確,那麼就會獲得正確的flag,所以要分析一下關鍵的main_encode函數:
根據裏面的函數名(base64xxxxxx),和字符串(XYZFGHI2+/Jhi345jklmEnopuvwqrABCDKL6789abMNWcdefgstOPQRSTUVxyz01)
我們懷疑這是一個魔改的base64編碼程序,將base64的編碼表替換了,將原本的編碼表(ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/)替換成了(XYZFGHI2+/Jhi345jklmEnopuvwqrABCDKL6789abMNWcdefgstOPQRSTUVxyz01),然後對輸入內容進行base64編碼之後與"nRKKAHzMrQzaqQzKpPHClX"作比較。那麼我們寫個腳本還原一下,因爲只是替換了編碼表,所以我們根據編碼表順序替換回來即可:
exp
new="XYZFGHI2+/Jhi345jklmEnopuvwqrABCDKL6789abMNWcdefgstOPQRSTUVxyz01"
old="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
result="nRKKAHzMrQzaqQzKpPHClX"
keyb64=""
for i in result:
keyb64+=old[new.find(i)]
print keyb64
輸出內容:V2hhdF9pc19nb19hX0FfSA
去網站base64解碼一下:
後面亂碼了,因爲base64有補齊嘛,加上=或者==
試一下,結果加上==
時成功了:
所以key爲:What_is_go_a_A_H
輸入程序中,成功輸出flag:
flag{e252890b-4f4d-4b85-88df-671dab1d78f3}