二進位制炸彈

2021-10-14 05:18:18 字數 3151 閱讀 6527

最近上系統級程式設計的課,其中乙個實驗是破解二進位制炸彈,下面記錄一下解題思路。

由於老師提供了binarybomb移植版檔案,包含:

乙個除錯工具乙個反彙編工具,但這是windows的移植版。在linux下使用對應的gdb和objdump即可

在bomb.exe檔案下路徑下,命令列輸入objdump -d bomb.exe,得到了程式的彙編**。然後大致瀏覽了一下,發現其中有六個函式phase_1……phase_6,基本上也就可以確定就是這六個關卡了。

知識點:string,函式呼叫,棧

找到phase_1對應的彙編**,可以看到就那麼10幾行

不難發現,其中乙個call指令,呼叫了string_not_equal函式。可以猜測到應該就是比較我們輸入的字串密碼和內建的密碼是否相等

接下來使用gdb除錯程式,這個函式前三行都是給函式分配棧空間,對實驗沒什麼影響,我們在第四行設定乙個斷點,執行:

b *0x40184c  #設定斷點

r #執行

然後亂輸入乙個123456789進入,那麼我們輸入的字串被放在**了呢?肯定是作為乙個引數要傳進字串比較這個函式的,才可以進行比較。在呼叫這個函式之前,是把這個eax暫存器中的值傳給了esp的,我們不妨檢視一下eax中的值:

密碼就是public speaking is very easy.

接下來重新執行程式,輸入密碼就進入了第二關:

知識點:迴圈

首先,大致看一下彙編**,可以很顯然的看到箭頭處呼叫了乙個函式:read_six_numbers。說明第二關是要輸入6個數字。在呼叫了這個函式之後,把ebp-0x24中的值賦給eax暫存器,如果不等於1,則**!那麼我們可以猜測第乙個數字就應該是1,為了驗證這個想法我們在這一行之後設定斷點,然後隨便輸入6個數字。這裡我就輸入5 2 0 1 3 14了。

然後檢視此時eax中的值是多少:

果然,裡面的值就是我們輸入的第乙個數字。所以第乙個數字是1不會**。

知道這一點後我們繼續往下看**,標有數字2的**段,給[ebp-c]處的位置加1後如果值小於等於5就跳轉到401896那一行。很顯然,這是乙個迴圈。5次迴圈,每一次得到後乙個數字,接下來查詢這裡面的規律。

在2的上方,如果比較eax和edx不相等就**,再往上看到3這個位置 edx

=(edx = (

edx=

(edx+1)*$eax。最終得到的edx中的值就應該是我們希望知道的數字,edx加1之前的值就是迴圈計數的值,所以5次迴圈中,加1後依次是2 3 4 5 6.還要乘以eax中的值,那此時eax中的值是什麼呢?通過1-3之間的**不難看出就是存放的前乙個數字,如果推斷不出來,通過gdb檢視也是可以的。總結一下這五個數字的關係

nk = (n+1) nk-1 (nk表示第k個數字,n表示第幾次迴圈)

由於第乙個數字是1,帶入上方公式,第二個數字就是2×1=2,第三個數字就是3×2=6…依次是24、120、720。至此,第二關通過!

知識點:switch語句

首先分析一下前面一段彙編**:

在標號1處,修改esp上方區域的值,用lea指令傳遞位址(這裡傳遞了三個變數,可以猜測是否就是需要輸入三個變數呢?),這是再向後乙個呼叫的函式傳遞引數。可以看到後面呼叫了sscan()函式。查了一下這個函式的宣告如下:

int

sscanf

(const

char

*str,

const

char

*format,..

.)

顯然,是sscan()的format引數。這是要我們輸入三個變數:整形 字元型 整形

在標號2的**段中,如果函式返回值(正確輸入的個數)不大於2就**。

在標號1處 -0x10(%ebp)、-0x11(%ebp)、-0x18(%ebp)處就存放了我們的三個輸入,接著往下看:

把第乙個輸入的數字和7比較,如果大於7就跳轉(緊接著**,其實就是到default),ja是無符號比較。也就是說我們可以確定第乙個整數的範圍就是0-7

也就是說這一關的答案不是唯一的,下面我們就拿2號開始嘗試。

把0x62存入到-0x9(%ebp)中,把我們輸入的第三個整數存入到eax中和0x2f3比較,不相等就**,所以如果第乙個整數是2那第三個整數應該是755(十進位制),接著jump:

到了這個函式的最後,可以得知0x62就是第二個輸入,0x62對應的是字元b。

所以其中一種可能的輸入是2 b 755。其他的不再贅述,可以自行嘗試,至此,第三關通過!

二進位制 二進位制起源

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

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

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

mysql二進位制 MySql二進位制連線方式詳解

使用mysql二進位制方式連線 您可以使用mysql二進位制方式進入到mysql命令提示符下來連線mysql資料庫。例項以下是從命令列中連線mysql伺服器的簡單例項 root host mysql u root p enter password 在登入成功後會出現 mysql 命令提示視窗,你可以...