簡體   English   中英

新秀大會炸彈毀滅cmp運算符

[英]Rookie Assembly Bomb Defusal cmp Operator

我是組裝的新手,真的不知道發生了什么。

我正在嘗試完成一項家庭作業,其中我們必須通過找到程序五個階段的正確輸入來化解炸彈。

我嘗試過在網上尋找問題的答案,但我真的不知道要搜索什么才能找到所需的答案。

我相信我理解下面的代碼中從<+0><+35> <+40> ,調用cmp運算符比較$0x2和存儲在%eax寄存器中的內容。 %eax比較時,我相信%eax仍在存儲對scanf的函數調用(如果我錯了,請更正我)。

通過使用gdb,我確實知道scanf函數的調用方式如下: scanf("%d %d", &x, &y);

那么在這種情況下, $0x2到底指的是什么(僅僅是值2?),比較這兩項時會發生什么?

我相信這是GAS語法。

   0x0804870a <+0>:     sub    $0x2c,%esp
   0x0804870d <+3>:     lea    0x1c(%esp),%eax
   0x08048711 <+7>:     mov    %eax,0xc(%esp)
   0x08048715 <+11>:    lea    0x18(%esp),%eax
   0x08048719 <+15>:    mov    %eax,0x8(%esp)
   0x0804871d <+19>:    movl   $0x8048baa,0x4(%esp)
   0x08048725 <+27>:    mov    0x804b040,%eax
   0x0804872a <+32>:    mov    %eax,(%esp)
   0x0804872d <+35>:    call   0x8048480 <__isoc99_fscanf@plt>
   0x08048732 <+40>:    cmp    $0x2,%eax
   0x08048735 <+43>:    je     0x8048743 <phase_1_of_5+57>
   0x08048737 <+45>:    movl   $0x1,(%esp)
   0x0804873e <+52>:    call   0x80486ef <explode>
   0x08048743 <+57>:    mov    0x18(%esp),%eax
   0x08048747 <+61>:    mov    %eax,%edx
   0x08048749 <+63>:    shl    $0x5,%edx
   0x0804874c <+66>:    add    %edx,%eax
   0x0804874e <+68>:    cmp    0x1c(%esp),%eax
   0x08048752 <+72>:    je     0x8048760 <phase_1_of_5+86>
   0x08048754 <+74>:    movl   $0x1,(%esp)
   0x0804875b <+81>:    call   0x80486ef <explode>
   0x08048760 <+86>:    add    $0x2c,%esp
   0x08048763 <+89>:    ret

與JE和相關說明的常見混淆。 我建議您使用調試器來可視化代碼在做什么。

cmp在內部進行減法運算,但實際上是在檢查eax ==2。如果eax == 2 JE(JUMP IF EQUAL),它會跳轉,因此EIP寄存器(執行的下一條指令)變為0x08048743(“ phase_1_of_5 + 57”的內存地址)。 如果eax!= 2,則跳過JE忽略它。

踩踏者直到您實踐並再次陷入困境之前,都不要閱讀本手冊:

因此,我們看一下http://www.tutorialspoint.com/c_standard_library/c_function_fscanf.htm fscanf會做什么。 我們看到返回值為2表示它期望輸入2個條件。 現在我們假設我們輸入兩個術語,現在我們遵循JE。

我們看到了(這就是為什么您需要調試器才能對此進行可視化)

mov    0x18(%esp),%eax
...
cmp    0x1c(%esp),%eax

0x18 == 6th value on the stack
0x1c == 7th value on the stack
safe to assume these are the two input terms.

0x08048743 <+57>:    mov    0x18(%esp),%eax
0x08048747 <+61>:    mov    %eax,%edx
0x08048749 <+63>:    shl    $0x5,%edx
0x0804874c <+66>:    add    %edx,%eax

在這里,我們可以假設化解炸彈的方法是將第一項的左移乘以第一項的5。 到第二學期。

因此0 0應該對其進行化解。

暫無
暫無

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

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