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
答案 0 :(得分:3)
add 0x4025c0(,%rcx,4),%edx
装置
%edx += *(0x4025c0 + %rcx*4);
%rcx是x64 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时,它才会通过检查。
答案 1 :(得分:2)
简单地在C语言中表达它就像edx += ((uint32_t *)0x4025c0)[rcx];
但是如果没有更多的语境,就不可能知道它的用途。
答案 2 :(得分:0)
通常,括号应为
形式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
。