2012-02-15 108 views
2

就像我之前的問題,這涉及到一個賦值方法,它需要一個特定的密碼,代碼是隱藏的,我們必須從彙編代碼中推斷密碼(我想避免碰撞。到目前爲止,我已經完成了幾個階段,並且我的理解能力也越來越強,但是這個階段有幾個方面我遇到了問題,到目前爲止,我知道這個階段的密碼是兩個整數,回溯是我的轉到方法對其中的一些,但不是這個階段非常有幫助。瞭解/解碼難懂的彙編代碼

  1. 我明白cltq擴展EAX(RAX),以4個字,但我不知道這將如何影響計算,還不能確定這是否會發生什麼線被多次擊中。
  2. 階段5 + 82->階段5 + 65(循環?)我試圖從什麼值開始,所以ecx(rcx)可以通過最終比較?
  3. mov 0x402600(,%rax,4),%eax < - 這條線是做什麼的?空白將我扔掉,是一個空白= 0?
  4. 任何其他幫助理解正在發生的事情和我應該如何接近搞清楚輸入將是有益的,我試圖將其轉換回C代碼,就像前幾個階段

    0x00000000004010b4 <phase_5+0>:   sub $0x18,%rsp 
    0x00000000004010b8 <phase_5+4>:   lea 0x10(%rsp),%rcx 
    0x00000000004010bd <phase_5+9>:   lea 0x14(%rsp),%rdx 
    0x00000000004010c2 <phase_5+14>:  mov $0x4026aa,%esi 
    0x00000000004010c7 <phase_5+19>:  mov $0x0,%eax 
    0x00000000004010cc <phase_5+24>:  callq 0x400b80<[email protected]> 
    0x00000000004010d1 <phase_5+29>:  cmp $0x1,%eax 
    0x00000000004010d4 <phase_5+32>:  jg  0x4010db<phase_5+39> 
    0x00000000004010d6 <phase_5+34>:  callq 0x401421(explode_bomb) 
    0x00000000004010db <phase_5+39>:  mov 0x14(%rsp),%eax 
    0x00000000004010df <phase_5+43>:  and $0xf,%eax 
    0x00000000004010e2 <phase_5+46>:  mov %eax,0x14(%rsp) 
    0x00000000004010e6 <phase_5+50>:  cmp $0xf,%eax 
    0x00000000004010e9 <phase_5+53>:  je  0x40111b <phase_5+103> 
    0x00000000004010eb <phase_5+55>:  mov $0x0,%edx 
    0x00000000004010f0 <phase_5+60>:  mov $0x0,%ecx 
    0x00000000004010f5 <phase_5+65>:  add $0x1,%edx 
    0x00000000004010f8 <phase_5+68>:  cltq 
    0x00000000004010fa <phase_5+70>:  mov 0x402600(,%rax,4),%eax 
    0x0000000000401101 <phase_5+77>:  add %eax,%ecx 
    0x0000000000401103 <phase_5+79>:  cmp $0xf,%eax 
    0x0000000000401106 <phase_5+82>:  jne 0x4010f5 <phase_5+65> 
    0x0000000000401108 <phase_5+84>:  movl $0xf,0x14(%rsp) 
    0x0000000000401110 <phase_5+92>:  cmp $0xf,%edx 
    0x0000000000401113 <phase_5+95>:  jne 0x40111b <phase_5+103> 
    0x0000000000401115 <phase_5+97>:  cmp %ecx,0x10(%rsp) 
    0x0000000000401119 <phase_5+101>:  je  0x401120 <phase_5+108> 
    0x000000000040111b <phase_5+103>:  callq 0x401421 <explode_bomb> 
    0x0000000000401120 <phase_5+108>:  add $0x18,%rsp 
    0x0000000000401124 <phase_5+112>:  retq 
    
+0

我能夠解決這個問題,主要是通過猜測和檢查。第一個整數爲5的輸入向我提供了phase_5 + 92所需的15%edx,第二個數字僅用於phase_5 + 97,通過查看%ecx並將5確定爲我確定需要的第一個輸入然而,代碼究竟發生了什麼仍然是一個謎...... – Gadesxion 2012-02-16 01:50:50

回答

4

的代碼轉換爲這樣的:

0x402600: int table[15]; 
0x4026aa: const char *format; 

void func (const char *str) 
{ 
    int a, b, count, sum; 

    if (sscanf (str, format, &a, &b) != 2) { 
     explode_bomb(); 
    } 

    a = a & 0xF; 
    if (a == 0xF) { 
     explode_bomb(); 
    } 

    sum = 0; 
    count = 0; 
    while (a != 0xF) { 
     a = table[a]; 
     sum += a; 
     count++; 
    } 

    if ((count != 0xF) || (sum != b)) { 
     explode_bomb(); 
    } 
} 

要回答你的具體問題:

cltq是使用d清除rax的4個最重要的字節,以便不干擾以下指令中的地址計算。它對計算沒有影響。

mov 0x402600(,%rax,4),%eax < - 這條線是做什麼的? 空白將我扔掉,是空白= 0?

是,這僅僅是MOV EAX雙字[0x402600 + 0 + RAX * 4]

一旦你有等價的C很容易弄清楚如何找到一個解決方案。

+0

再次感謝您的幫助Antoine – Gadesxion 2012-02-16 18:11:17

+0

在C代碼的哪一行是'mov 0x402600(,%rax,4), %eax'發生?此外,表中的值來自哪裏? – develop1 2016-10-14 20:07:05

+0

@develop1這是_a = table [a]; _如第一行所指定,_table_數組位於0x402600。然而,這些數據不是由OP提供的。 – 2016-10-14 22:39:49