2012-11-18 115 views
-3

可能重複:
Decoding and understanding assembly code解碼和理解彙編代碼

我與C和彙編代碼初學者,我們有一個「炸彈」分配(用C語言編寫),其中要求方法需要某些密碼,但代碼不可見,我需要通過查看彙編代碼來確定正確的密碼。

該代碼指示此方法的密碼是6個數字,它作爲「輸入」傳遞給方法puzzle_1(我試圖避免觸發)。

我無法理解彙編代碼。

這個問題的答案是什麼?

我覺得這個puzzle_1的關鍵字是數組。

08048db4 <puzzle_1>: 
8048db4:  push %ebp 
8048db5:  mov %esp,%ebp 
8048db7:  sub $0x38,%esp 
8048dba:  lea -0x24(%ebp),%eax 
8048dbd:  mov %eax,0x4(%esp) 
8048dc1:  mov 0x8(%ebp),%eax 
8048dc4:  mov %eax,(%esp) 
8048dc7:  call 804897e <read_six_numbers> 
8048dcc:  movl $0x1,-0xc(%ebp) 
8048dd3:  jmp 8048df9 <puzzle_1+0x45> 
8048dd5:  mov -0xc(%ebp),%eax 
8048dd8:  mov -0x24(%ebp,%eax,4),%eax 
8048ddc:  mov -0xc(%ebp),%edx 
8048ddf:   sub $0x1,%edx 
8048de2:  mov -0x24(%ebp,%edx,4),%edx 
8048de6:  add $0xbf,%edx 
8048dec:  cmp %edx,%eax 
8048dee:  je  8048df5 <puzzle_1+0x41> 
8048df0:   call 8048d93 <denied_nextstep> 
8048df5:   addl $0x1,-0xc(%ebp) 
8048df9:   cmpl $0x5,-0xc(%ebp) 
8048dfd:   jle 8048dd5 <puzzle_1+0x21> 
8048dff:   call 8048d73 <allow_nextstep> 
8048e04:  leave 
8048e05:  ret 
+5

瞭解程序集的技巧就是學習它。 – alex

+0

並學習如何使用調試器... –

+0

如果問題已關閉,再次提出問題並不禮貌。社區已經告訴你在這個問題上多加一些努力。 – alex

回答

2

您需要學習裝配。快速入門以便您自己發現答案的方法是逐個執行指令,並使用將助記符映射到其目的的表格,不同尋址模式的表格,以及如果可以的話將十六進制映射到十進制的計算器不要在你的腦海裏做,而且當你不瞭解某些東西時,你可以通過互聯網進行一些調查。

例如,這裏是第幾個指令......

; Push the value in %ebp register onto stack 
8048db4:  push %ebp 

; Copy the value from %esp register into %ebp register 
8048db5:  mov %esp,%ebp 

; Subtract 0x38 from %esp register 
8048db7:  sub $0x38,%esp 

; Wasn't sure about this one, so I looked it up 
; (Looking up things you're not sure of is a 
; good way to learn about those things.) 
; http://stackoverflow.com/q/1658294/31671 
8048dba:  lea -0x24(%ebp),%eax 
3

大約有三類瞭解這裏:

1)計算機體系結構:

  • 寄存器結構/指令集體系結構
    • 算術(如a + b)
    • 比特邏輯如A或B
    • 條件(如== B或A < b)用不同的標誌有符號無符號&
      • cmp %edx,%eax
    • 跳躍
      • 無條件:jmp
      • 有條件:je; jle等 - 與條件代碼標誌狀態寄存器
      • 子程序:call;
    • 存儲器架構
    • 不同種尋址模式
      • 立即sub $0x38,%esp
    • 存儲器地址計算lea -0x24(%ebp),%eax
    • CISC類型:可以你 '添加' 直接到一個存儲器地址 addl $0x1,-0xc(%ebp)
    • RISC類型 - 讀/修改/寫回

2)的語言

  • 指令SRC,DST與INSTR DST,SRC
  • 編碼
  • 標籤的語法,註釋,彙編指令,十進制和十六進制數

3)局部堆棧幀,局部變量和指針

  • push ebp; mov esp, ebp;
  • 呼叫在該特定示例中使用的約定(全局寄存器,通用寄存器,或堆疊(幀)的概念
  • 項不嵌合到寄存器通常是使用指針

傳遞給學習這將使用表示存儲器&寄存器的內容進行指令級的調試器和最佳地突出顯示每個指令之間的變化的最佳方式。當然還要閱讀指令集體系結構手冊和應用程序二進制接口規範。

祝你好運!

+0

偉大的回答,當我開始時會喜歡這個。 :) – alex