CSAPP-拆彈實驗


一、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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM