XCTF攻防世界--(新手賽區(qū))第4題快來圍觀學習!
2022-05-26 14:55 作者:rkvir逆向工程學院 | 我要投稿
1.先查看題目,依照作者的話說是需要逆向算法了,先下載下來吧

2.下載下來先查殼

下載下來是個64位沒加殼的二進制文件
3.老規(guī)矩,先丟進kali運行一下看看程序流程

運行了一下發(fā)現(xiàn)程序流程就是讓用戶輸入猜測的,一句猜測的結果進行輸出提示
4.既然這樣我們就直接把文件丟進ida中分析,先shift+F12查看引用字符

好家伙,發(fā)現(xiàn)關鍵提示字符,依照字面意思就是說用戶輸入的flag是正確的,那我們直接跟進去
5.跟進來看到welcom關鍵字符資源,這不就是二進制剛運行的時候顯示的用戶提示嗎?那我們直接查看進入引用函數(shù)

6.進入函數(shù)F5查看偽代碼,查看程序邏輯

①把一串字符賦值給v8
②把一串十六進制數(shù)賦值給v7,7賦值給v6
③將用戶輸入字符賦值給s,并將其長度賦值給v3
④首先對比輸入字符的長度是否小于v8的長度,如果小于執(zhí)行,sub_4007C0()函數(shù),跟進這個函數(shù)發(fā)現(xiàn)是提示輸入錯誤的
⑤for循環(huán)就是關鍵,循環(huán)中第一個if便是判斷用戶輸入的字符長度是否大于v8的長度如果大于,
那么就執(zhí)行sub_4007C0(),跟進發(fā)現(xiàn)就是提示flag錯誤的信息,第二個if便是對比用戶 輸入的
每個字符是否等于 (char)(((BYTE )&v7 + i % v6) ^ v8[i]),如果不等于執(zhí)行sub_4007C0(),跟
進發(fā)現(xiàn)也是提示flag錯誤,發(fā)現(xiàn)還有最后??一行代碼函數(shù)有跟進去看過,跟進去看就是提示 flag
正確,那怎么才能執(zhí)行他呢?肯定是循環(huán)成功執(zhí)行完以后那我們就可想而知,只要我們輸入的每
一個字符s[i] != (char)(((BYTE )&v7 + i % v6) ^ v8[i])則就可以 執(zhí)行完循環(huán),也就是說我們輸入的
flag是正確的,能得到提示信息。
⑥if ( s[i] != (char)(((_BYTE?)&v7 + i % v6) ^ v8[i]) )是比較加密后的flag,那我們逆運算加密后的flag便可以得到真正的flag了,因為源碼中的flag加密是采用異或,然而異或的逆運算任然是異或
逆運算代碼如下:

7.結果:

標簽: