一、phase_1
查找字符串的位置,設置斷點單點調試,查看寄存器ebx里的值,減去1ebc后就是字符串的地址
二、phase_2(循環)
輸入六個數,由上圖標注指令可以看出第一個數等於1。
add %eax,%eax //每個數是前一個數乘2,也就是等比數列
可以查看寄存器中的值驗證
以此類推,執行六次就能得出六個值
答案為:1 2 4 8 16 32
三、phase_3(switch)
首先要知道題目要輸入什么
要輸入一個整數 一個字符 一個整數
可以看出是switch跳表
輸入第一個數字,就已經確定了第二個字符和第一個數字
第一個數字需要小於7
輸入0
跳轉到.L25 字符為d 數字為 696
答案為:0 d 696
同理,答案還有:1 o 361 等
四、phase_4(遞歸)
查看這里寄存器中的內容
要求輸入兩個數
一個數范圍2、3、4
輸入2,3,查看這一步寄存器eax里的數
說明這里是第二個數
第一個數查看調用fun4后的返回值,查看寄存器eax
所以答案是162 3
同理答案還有 108 2、 216 4
五、phase_5(數組)
同理,輸入2個整數
第一個數二進制后四位不能是1111
查看數組里的值
最關鍵的一條指令
相當於C語言中的 n=a[n]
數組的調用順序為:
執行15次循環,最后值保存在ecx中
最后ecx值為115,第二個數為115
答案為5 115
六、phase_6鏈表
輸入六個數,為1-6的某個順序
尋找六個結點
查看六個結點中的數
按照降序排序
3ce(2)>396(5)>2e5(4)>24e(1)>163(3)>a3(6)
最終答案為:2 5 4 1 3 6
七、secret_phase(隱藏階段)
首先要在第四階段后添加一個字符串
查找字符串的位置
fun7是一個遞歸函數
參考博客https://www.cnblogs.com/chkkch/archive/2011/05/21/2052708.html
最后的返回值是6
只有一種情況符合
查看答案所在地址,先加4,再加8,加8
最后答案為35
總結:拆彈結束啦
一開始真的什么都不會,什么指令也不懂,慢慢看大佬寫的解析,自己慢慢摸索,一關一關終於解開了。其實里面有很多是運氣成分,函數里的代碼也只看懂了關鍵的,其他也沒有深究,匯編還是要好好學!像推理一樣,拆完每一關都很激動,LOL。