二進制拆彈 binary bombs 教你最快速解題,成功拆彈
linux
此處頭髮減n數組
我剛開始作的時候非常懵逼,首先對linux不熟悉,其次彙編嘛,原本就不簡單,(Python是世界上最好的語言)
函數
首先在開始以前吶,先向你們推薦一個linux下的繪圖軟件 kolourPaint 這個有什麼用,看我下面的圖就知道了學習
把相同的地址標出來,方便本身查找.spa
還有推薦幾個GDB 經常使用命令.net
x/nfq adress // 查看地址 n是查看的個數 f 是格式 經常使用 x 16進制 u 10進制無符號 s 字符串 q 是查看幾個字指針
b表示單字節,h表示雙字節,w表示四字節,g表示八字節。當咱們指定了字節長度後,GDB會從指內存定的內存地址開始,code
讀寫指定字節,並把其看成一個值取出來。blog
b //設置斷點 這個很重要排序
ni 單步執行
info reg //查看寄存器的值
這是用的比較多的 ,這個連接有更詳細的 推薦你們學習一下
https://blog.csdn.net/delbboy/article/details/8080738
再來講一下拆彈的幾個小技巧
1.先看代碼裏的明碼地址,查看一下說不定就是結果
2.而後找比較指令,尤爲是什麼像0xc(%ebp) 0x8(%ebp) 比較你輸入的數的指令,有可能這個地方就告訴你結果了吶
3.再找輸入判斷指令,就是判斷你輸入的是否是符合要求,這樣能縮小你要輸入的值的範圍,就算你不懂,拆答案也方便了
4.而後使跳轉指令,要跳轉到,bomb的指令,前面通常都會有比較指令,這個時候,就能查看相應的內存的數據,查到本身的結果
好了接下來進入正題
phase_1 :字符串比較
這個實驗是輸入一個字符串,比較與程序裏的是否相同,查詢明碼地址 0x8049ea4
獲得字符串When I get angry, Mr. Bigglesworth gets upset.
輸入後結果正確
這個實驗比較簡單,就不細說了
phase_2: 循環(圖片使用linux下的KolourPaint製做)
phase_3:條件分支
phase_4: 遞歸
查詢地址
0x804a06f
因此要輸入兩個參數
phase_5 : 指針
查詢地址 0x8049f20 獲得數組元素
phase_6: 鏈表指針結構
但是我降序排列,升序排列輸入了好幾回都不對,???還有什麼可能那
因而仔細查看了一下代碼,發現有一個地方,把輸入的數7-
5變成2 6變1
這就是這個的坑所在啊!
因而又把以前輸入的數 7- 了一次 果真對了;
到這裏咱們能夠猜出結構體應該是這樣的
1 strutc asm{ 2 3 int num; //該處的值 4 5 int no; //當前結構體的編號 6 7 int *next; //指向下一個元素 8 9 }
查詢地址獲得
降序排列 5 2 1 4 6 3 分別7- 獲得2 5 6 3 1 4
先來看看怎麼進入吧
進入phase_defused 查看
調用了一個判斷輸入了幾個參數的輸入函數,爲3且第三個參數正確就進入了隱藏關
查詢得知 要在第四關 的後面附加的字符串
因而獲得結果0x32 = 50
輸入後結果正確
至此咱們終於解決了咱們的大boss,乾杯 ,哈哈哈
最後說一下解題最強法寶------你的計算機基礎課本
爲何那, 這是你課程的實驗,確定和你所學相關,據我所知用這本書的都有這幾個實驗,能夠說這個實驗
和這門課這本書是配套的, 書中自有它的解題之道!
好好看看第三章前40頁,你再來作這個實驗就會恍然大悟原來是這樣啊!
最後但願你們好好學習,取得好成績 ,一塊兒加油吧!!!
本人水平有限
若有問題,歡迎指正