二進位制拆彈 binary bombs 教你最快速解題,成功拆彈
最近計算機基礎課,的實驗lab2,二進位制拆彈,可以說是拆的我很快樂了(sub n, %hair)
此處頭髮減n
我剛開始做的時候很是懵逼,首先對linux不熟悉,其次彙編嘛,本來就不簡單,(Python是世界上最好的語言)
首先在開始之前吶,先向大家推薦一個linux下的繪圖軟體 kolourPaint 這個有什麼用,看我下面的圖就知道了
把相同的地址標出來,方便自己查詢.
還有推薦幾個GDB 常用命令
x/nfq adress // 檢視地址 n是檢視的個數 f 是格式 常用 x 16進位制 u 10進位制無符號 s 字串 q 是檢視幾個字
b表示單位元組,h表示雙位元組,w表示四位元組,g表示八位元組。當我們指定了位元組長度後,GDB會從指記憶體定的記憶體地址開始,
讀寫指定位元組,並把其當作一個值取出來。
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- 了一次 果然對了;
到這裡我們可以猜出結構體應該是這樣的
strutc asm{ int num; //該處的值 int no; //當前結構體的編號 int *next; //指向下一個元素 }
查詢地址得到
降序排列 5 2 1 4 6 3 分別7- 得到2 5 6 3 1 4
- 隱藏關 <secret_phase>
- 這裡終於迎來了我們的大BOSS
先來看看怎麼進入吧
進入phase_defused 檢視
呼叫了一個判斷輸入了幾個引數的輸入函式,為3且第三個引數正確就進入了隱藏關
查詢得知 要在第四關 的後面附加的字串
於是得到結果0x32 = 50
輸入後結果正確
至此我們終於解決了我們的大boss,乾杯 ,哈哈哈
最後說一下解題最強法寶------你的計算機基礎課本
為什麼那, 這是你課程的實驗,肯定和你所學相關,據我所知用這本書的都有這幾個實驗,可以說這個實驗
和這門課這本書是配套的, 書中自有它的解題之道!
好好看看第三章前40頁,你再來做這個實驗就會恍然大悟原來是這樣啊!
最後希望大家好好學習,取得好成績 ,一起加油吧!!!
本人水平有限
如有問題,歡迎指正