XCTF攻防世界--(新手賽區)第4題快來圍觀學習!
極安御信發表於2022-05-26
1.先檢視題目,依照作者的話說是需要逆向演算法了,先下載下來吧
2.下載下來先查殼
下載下來是個64位沒加殼的二進位制檔案
3.老規矩,先丟進kali執行一下看看程式流程
執行了一下發現程式流程就是讓使用者輸入猜測的,一句猜測的結果進行輸出提示
4.既然這樣我們就直接把檔案丟進ida中分析,先shift+F12檢視引用字元
好傢伙,發現關鍵提示字元,依照字面意思就是說使用者輸入的flag是正確的,那我們直接跟進去
5.跟進來看到welcom關鍵字元資源,這不就是二進位制剛執行的時候顯示的使用者提示嗎?那我們直接檢視進入引用函式
6.進入函式F5檢視虛擬碼,檢視程式邏輯
把一串字元賦值給v8
把一串十六進位制數賦值給v7,7賦值給v6
將使用者輸入字元賦值給s,並將其長度賦值給v3
首先對比輸入字元的長度是否小於v8的長度,如果小於執行,sub_4007C0()函式,跟進這個函式發現是提示輸入錯誤的
for迴圈就是關鍵,迴圈中第一個if便是判斷使用者輸入的字元長度是否大於v8的長度如果大於,
那麼就執行sub_4007C0(),跟進發現就是提示flag錯誤的資訊,第二個if便是對比使用者 輸入的
每個字元是否等於 (char)(((BYTE )&v7 + i % v6) ^ v8[i]),如果不等於執行sub_4007C0(),跟
進發現也是提示flag錯誤,發現還有最後 一行程式碼函式有跟進去看過,跟進去看就是提示 flag
正確,那怎麼才能執行他呢?肯定是迴圈成功執行完以後那我們就可想而知,只要我們輸入的每
一個字元s[i] != (char)(((BYTE )&v7 + i % v6) ^ v8[i])則就可以 執行完迴圈,也就是說我們輸入的
flag是正確的,能得到提示資訊。
if ( s[i] != (char)(((_BYTE )&v7 + i % v6) ^ v8[i]) )是比較加密後的flag,那我們逆運算加密後的flag便可以得到真正的flag了,因為原始碼中的flag加密是採用異或,然而異或的逆運算任然是異或
逆運算程式碼如下:
7.結果: