這題很簡單,最終的做題人數也體現了這一點。。
不過前段時間剛接觸了Ponce這一IDA插件神器,就試一試比賽裏好不好使。(主要就是懶,不想逆向分析算法了)
main:
打印第8行puts,似乎就是success的意思;
看一下前面的vm_operad:
一個大while(1)循環,但對於Ponce來說,只需關心哪裏輸入,哪裏success,哪裏wrong。
這裏的26行read函數就是要求輸入長度爲15
OK,開始下斷點調試
首先,在scanf函數後一行下個斷點,方便在棧中找到輸入的數據
之後在printf("what a shame...");exit();那裏的判斷語句處下個斷點,方便Ponce的使用
之後打開Ponce,選擇Symbolic engine(符號引擎)
OK後開始調試,輸入15個字符來到第一個斷點
數據跟隨,找到輸入字符串的位置(0x0061FBC3-0x0061FBD1)
ctrl+shift+M將其轉化爲符號
之後F9運行來到另一個斷點
這時程序會走右邊也就是exit(),畢竟輸入的不對嘛。
先用Ponce分析得到這一位正確的答案,再通過修改EIP讓程序往左走,繼續下一次循環。
這時Ponce就分析出了第一位的正確答案 7(Output)
之後就修改EIP讓程序往左走繼續循環,重複上面的操作,記錄下每一次的最後一位,組合在一起就能獲得15位的flag了。
例:
757515121f3d478,提交時加上flag{}
Ponce插件下載:https://github.com/illera88/Ponce