2015-10-09 78 views
-1
add 0x4025c0(,%rcx,4),%edx 

所以我想把這段彙編代碼轉換成實際的C表達式,任何人都可以幫我嗎?謝謝!這個程序集的等效C代碼是什麼?

更新: 的代碼實際上是本次大會計劃的一部分:

0x00000000004010fe <+0>:  push %rbx 
    0x00000000004010ff <+1>:  mov %rdi,%rbx 
    0x0000000000401102 <+4>:  callq 0x401341 <string_length> 
    0x0000000000401107 <+9>:  cmp $0x6,%eax 
    0x000000000040110a <+12>: je  0x401111 <phase_5+19> 
    0x000000000040110c <+14>: callq 0x4015bf <explode_bomb> 
    0x0000000000401111 <+19>: mov $0x0,%eax 
    0x0000000000401116 <+24>: mov $0x0,%edx 
    0x000000000040111b <+29>: movzbl (%rbx,%rax,1),%ecx 
    0x000000000040111f <+33>: and $0xf,%ecx 
    0x0000000000401122 <+36>: add 0x4025c0(,%rcx,4),%edx 
    0x0000000000401129 <+43>: add $0x1,%rax 
    0x000000000040112d <+47>: cmp $0x6,%rax 
    0x0000000000401131 <+51>: jne 0x40111b <phase_5+29> 
    0x0000000000401133 <+53>: cmp $0x33,%edx 
    0x0000000000401136 <+56>: je  0x40113d <phase_5+63> 
    0x0000000000401138 <+58>: callq 0x4015bf <explode_bomb> 
    0x000000000040113d <+63>: pop %rbx 
    0x000000000040113e <+64>: xchg %ax,%ax 
    0x0000000000401140 <+66>: retq 
+0

它在英特爾語法中讀取更容易'add edx,[rcx * 4 + 0x4025c0]' –

回答

2

簡單地用C表示這是像edx += ((uint32_t *)0x4025c0)[rcx];但是它是相當不可能知道它被用於沒有更多的上下文是什麼。

+0

感謝您的幫助,我更新了我的問題,但我無法弄清楚代碼在做什麼。我認爲它接受一個字符串女巫由6個字符組成,並且在中間的一些操作之後,它檢查最終答案是否爲0x33。你能向我解釋一下這個程序在做什麼?這將是非常感激,因爲我已經在這個問題很長一段時間:) –

1

通常,肘板是被擴展爲形式

displacement(base register, offset register, scalar multiplier) 

的,

[base register + displacement + offset register * scalar multiplier]. 

所以,

0x4025c0(,%rcx,4) 

是,

(0x4025C0 + value at RCX * 4) 

ADD (0x4025C0 + value at RCX x 4), %edx 

應該意味着,

edx += (0x4025C0 + ((*rcx)*4)); 

這意味着,該指令的執行之後,例如,如果在RCX值爲100(0x64),然後EDX將持有的值0x4025C0 + 0x190

參考:https://en.wikibooks.org/wiki/X86_Assembly/GAS_Syntax

+0

感謝您的幫助!我已經更新了我的問題,以便您可以看到這裏發生了什麼......我想我的問題是,該線路在該程序中具體做了什麼,您可以在此幫助我嗎? –

+0

用類C語法表示的最後一行是錯誤的。這是存儲在edx中的值,而不是edx指向的值,它被修改,並且加數不是您在RHS上編寫的值,而是由RHS指向的32位字。 –

+0

@R:啊,是的。感謝您指出了這一點。 – WedaPashi

2
add 0x4025c0(,%rcx,4),%edx 

裝置

%edx += *(0x4025c0 + %rcx*4); 

%RCX是在64 ASM的寄存器。這裏0x4025c0是基地址。 * 4說明數組元素的大小是4個字節(32位)。因此,它可以被翻譯成

%edx += *(uint32_t)0x4025c0[%rcx]; 

整個代碼片段將執行以下的事情:

void check(char *str) 
{ 
    const uint32_t *subTable = 0x4025c0; 

    if (strlen(str) == 6) 
    { 
     uint32_t j = 0; 
     for (int i = 0; i < 6; i++) 
      j += subTable[str[i]]; 
     if (j == 0x33) 
      return; 
    } 
    call explode_bomb; 
} 

替換表存儲在地址0x4025c0。只有當輸入的長度爲6並且其替換值的總和爲0x33時,纔會通過檢查。

相關問題