簡體   English   中英

理解二進制炸彈階段 2 的匯編代碼

[英]understanding assembly code for binary bomb phase 2

我正在研究二進制炸彈項目。 我正在處理此代碼,並且正在嘗試理解部分匯編代碼。 所以我很容易通過階段1,而對於階段2,我需要輸入4個字符。

例如: phase-2: xyzd

在下面的示例中,我使用了輸入: abcd作為我的四個字符

當我在 gdp 中運行它並檢查匯編代碼時,我得到以下信息:

Dump of assembler code for function phase2:
   0x080487d6 <+0>: push   %ebp
   0x080487d7 <+1>: mov    %esp,%ebp
   0x080487d9 <+3>: sub    $0xc,%esp
=> 0x080487dc <+6>: mov    0x8(%ebp),%ecx
   0x080487df <+9>: mov    0xc(%ebp),%edx
   0x080487e2 <+12>:    mov    0x10(%ebp),%eax
   0x080487e5 <+15>:    mov    %cl,-0x4(%ebp)
   0x080487e8 <+18>:    mov    %dl,-0x8(%ebp)
   0x080487eb <+21>:    mov    %al,-0xc(%ebp)
   0x080487ee <+24>:    cmpb   $0x77,-0x4(%ebp)
   0x080487f2 <+28>:    jne    0x8048807 <phase2+49>
   0x080487f4 <+30>:    cmpb   $0x62,-0x8(%ebp)
   0x080487f8 <+34>:    jne    0x8048807 <phase2+49>
   0x080487fa <+36>:    cmpb   $0x79,-0xc(%ebp)
   0x080487fe <+40>:    jne    0x8048807 <phase2+49>
   0x08048800 <+42>:    mov    $0x1,%eax
   0x08048805 <+47>:    jmp    0x804880c <phase2+54>
   0x08048807 <+49>:    mov    $0x0,%eax
   0x0804880c <+54>:    leave  
   0x0804880d <+55>:    ret    
End of assembler dump.

我真正要明白的是

   0x080487ee <+24>:    cmpb   $0x77,-0x4(%ebp)

這里發生了什么? 我認為它將 $0x77 的值與 ebp 中的值進行比較。 那有意義嗎? 我什么時候知道 ebp 中存儲了什么?

我運行代碼直到上面一行,然后 ebp 和我得到以下信息:

ebp            0xbffff6e8   0xbffff6e8

總而言之,我想知道比較行到底在做什么,這樣我才能更好地理解代碼。 以及如何在不進入休假狀態的情況下找出 ebp 中的值。

%ebp通常用作堆棧幀指針——- -0x4是存儲在%ebp的地址的偏移量——下面的值(負偏移量) %ebp通常是局部變量(如果從 C 代碼編譯)和上面的值(正偏移)通常是函數參數。 此代碼似乎是通過編譯 C 代碼生成的代碼,並且%ebp用法是典型的。 -0x4(%ebp)將引用函數的第一個局部變量。 它似乎已經在mov %cl,-0x4(%ebp)之前設置了一些語句。 這就提出了%cl值來自哪里的問題,如果我們進一步追溯,我們可以看到它是mov 0x8(%ebp),%cx設置了%cl 注意cmpb指令有一個b前綴,這意味着它是一個字節比較。 (與 16 位或 32 位比較相反。)這與僅使用%cl設置的值相匹配,這也是一個 8 位值。

所有這些都告訴我們,您所詢問的行正在與十六進制值 0x77 進行 8 位比較。 如果您查看 ASCII 表,您可以看到 0x77 是小寫的“w”。 如果字節不等於該值,則下一條指令將跳轉。 這讓我得出結論,我們正在檢查傳遞給函數的第一個參數,看它是否是“w”字符。

據我所知,這個炸彈的東西通常是給學生的。 我有一種感覺,您缺少應該已經學習的基本知識。 你應該重新審視你擁有的任何課程材料。

無論如何,一些快速提示:

  • x(%ebp)是間接尋址,它訪問地址為x+%ebp內存
  • 函數參數在堆棧上傳遞。 %ebp開始的第+1行之后的堆棧內容: saved ebpreturn addressarg1arg2arg3
  • +6行將8(%ebp) (這是第一個參數)加載到%ecx
  • 然后第+15行將其低 8 位保存到-4(%ebp)處的局部變量中。
  • 然后第+24行將此​​值與0x77進行比較。

請注意,您聲稱需要 4 個數字。 雖然這可能在調用者是真實的,這個phase2只使用3個參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM