二進位制炸彈 bomb 之完整解題過程

2021-10-24 07:24:41 字數 3459 閱讀 8417

前言

常用gdb命令

編譯器:將某種高階程式語言編寫的程式翻譯成機器語言或者是組合語言的軟體。例如gcc編譯器。使用gcc由源**檔案生成可執行檔案的過程要經歷四個相互關聯的步驟:預處理、編譯、彙編和鏈結。

反彙編工具:把機器語言**轉換為組合語言**的工具軟體(gcc中的objdump工具)。

反彙編:把機器語言轉換為組合語言**。

除錯工具:一種工具軟體(gdb),它能夠讓可執行**執行,並且跟蹤監測程式執行過程,從而發現程式執行時發生的錯誤。

(gdb)r //執行源程式

(gdb)list//  展開源**

(gdb)print /x ai  //檢視變數ai的值

(gdb) x /4xb &af     //檢視浮點變數af值

設定斷點:(gdb)  break  行號 /(gdb)  break phase1(例如在第一關設定斷點)

(gdb) c      //繼續執行程式

(gdb) info break     //檢視設定斷點的資訊,包括編號、型別、位址等

(gdb) info registers   //檢視暫存器資訊:

(gdb)i r esp ebp     //info指令檢視esp和ebp暫存器的值

(gdb)x /44xb $esp   //examine指令檢視從esp當前值開始位置的44個位元組的記憶體空間

(gdb) p $ebp     //檢視單個暫存器

(gdb)step     //單步執行,跟蹤進入函式內部,在執行到函式呼叫部分時,gdb會給出提示資訊,包括被呼叫函式的入口引數、起始行號等,同時也會給出函式中將要執行的語句及所在行的行號。

(gdb)step     //單步執行,但它將函式呼叫看作是一條語句,不跟蹤進入函式內部。

(gdb) info f//檢視當前棧幀的詳細資訊

1.字串比較:在呼叫函式前,先將要參與對比的兩個字串壓入棧中,push $0x804a1d4就是存放內建字串的首位址,pushl 0x8(%ebp)是使用者輸入字串的首位址。如果兩個字串相等,則順利通過此關。

使用x /ls 0x804a1d4指令顯示這個字串為」 object files define and reference symbols.」,再單步或繼續執行後續的**時輸入這個字串,結果顯示成功過關.

2.浮點數表示:

將整數轉化為雙精度浮點數格式後,分別將高低位位元組轉換為十進位制整數,按照sscanf()指定的格式「%d %d」輸入。

movl   $0x2f41d441,-0xc(%ebp) //用於產生浮點數data的整數常量存入當前棧內

fildl  -0xc(%ebp)     //將資料從整型轉換為64位浮點格式後,裝入浮點暫存器棧頂

fstpl  -0x18(%ebp)  //將棧頂轉換為雙精度精度浮點格式後,存入記憶體,並彈出棧頂元素

先看輸入格式:

再設定斷點 b phase_1,執行,隨便輸入兩個數。用disas命令檢視當前執行的彙編指令。因為是將整數轉換之後,與內建的資料進行比較,所以只需關注後兩個cmp指令。用ni跳到第乙個cmp %eax %edx的地方,用p $edx檢視暫存器中的內容,即第乙個數。用同樣的方法跳到最後乙個cmp的地方,得到第二個數。

3.迴圈:根據push $0x6到call 8049aec指令,可以看出輸入6個數字。cmp $0xdb,%eax//比較數字219是否與第乙個數相等,如果相等,進入for迴圈,1<=i<=5.sar %edx//算術右移,保留運算元的符號,即用符號位來補足。

i=0,number[0]=219;//初始數字0xdb     mov  -0x24(%ebp,%eax,4),%eax;//number[i]->eax

i=1,number[1]=sar(219-1)+1=110;      mov  -0xc(%ebp),%edx;//edx

中存放i

i=2,number[2]= sar(110-1)+1=56;       mov  -0x24(%ebp,%edx,4),%edx;//

存放number[i-1];

4.條件/分支:根據sscanf規定的格式輸入,仍為兩個數,格式「%d %d」。

mov -0x14(%ebp),%eax;//number1->eax

sub  $0x4b,%eax;//4bh=75b

cmp  $0x9,%eax;// (number1-75)<9?i:boom    3deh=990b;   2c8h=712b

i=0,1,3,5,8

,number2=990;      i=1,4,6,7,9

,number2=712;

跳轉到位址804962e,將內建數與第二個數比較,如果相等,就退出。

設定斷點:b phase_3,執行,用disas指令檢視當前執行的彙編指令,跳到cmp比較第二個數的地方,用p  $eax檢視內容,如果相等,就退出此關。可知number2為990.

所以本關答案多種情況:75 990/76 990/78 990/80 990/83 990任選一組,成功破解。

二進位制炸彈

最近上系統級程式設計的課,其中乙個實驗是破解二進位制炸彈,下面記錄一下解題思路。由於老師提供了binarybomb移植版檔案,包含 乙個除錯工具乙個反彙編工具,但這是windows的移植版。在linux下使用對應的gdb和objdump即可 在bomb.exe檔案下路徑下,命令列輸入objdump ...

二進位制 二進位制起源

現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...

判斷二進位製半整數(二進位制)

10年後,tokitsukaze大佬已經變成了年收入超百萬的的精英程式設計師,家裡沒錢也沒礦的teitoku,找tokitsukaze大佬借1000塊錢,然後tokitsukaze大佬說,借你1024吧,湊個整數。沒錯在2進製下1024是 二進位制整數 乙個正整數滿足其值為2的k次方 k為正整數 我...