【问题标题】:What is the equivalent C code for this assembly?这个程序集的等效 C 代码是什么?
【发布时间】:2016-01-06 22:00:02
【问题描述】:
add    0x4025c0(,%rcx,4),%edx

所以我正在尝试将这段汇编代码转换为实际的 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

【问题讨论】:

  • 英特尔语法add edx, [rcx*4+0x4025c0]阅读更容易

标签: c assembly reverse-engineering


【解决方案1】:
add    0x4025c0(,%rcx,4),%edx

意思

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

%rcx 是 x64 asm 中的一个寄存器。这里 0x4025c0 是基地址。 *4 表示数组元素的大小为 4 字节(32 位)。所以可以翻译成

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

整个代码 sn-p 做了以下事情:

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 时,才会通过检查。

【讨论】:

    【解决方案2】:

    在 C 中简单地表达它类似于 edx += ((uint32_t *)0x4025c0)[rcx]; 但如果没有更多上下文就不可能知道它的用途。

    【讨论】:

    • 感谢您的帮助,我已经更新了我的问题,但我无法弄清楚代码在做什么。我认为它接受一个由 6 个字符组成的字符串,在中间进行一些操作后,它会检查最终答案是否为 0x33。你能向我解释一下这条线在做什么吗?这将非常感激,因为我已经解决这个问题很长时间了:)
    【解决方案3】:

    通常,括号的格式为

    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

    【讨论】:

    • 感谢您的帮助!我已经更新了我的问题,所以你可以看到这里发生了什么......我想我的问题是这条线在程序中具体做了什么,你能帮我吗?
    • 最后一行用类 C 语法表示是错误的。修改的是edx中存储的值,不是edx指向的值,加数不是你写在RHS上的值,而是RHS指向的32位字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 2016-04-04
    • 1970-01-01
    相关资源
    最近更新 更多