C语言 二进制炸弹阶段 2 算术



几天来我一直在试图找出这个阶段的值,但我似乎无法理解。

我所知道的是需要 3 个输入值:%rsi, %rdx, %rcx.%rdx%rcx的值必须相等。

非常感谢很多帮助。

Dump of assembler code for function phase_2:
=> 0x00000000004011dd <+0>:     sub    $0x8,%rsp
0x00000000004011e1 <+4>:     cmp    $0x3,%rdi                      // %rdi = 3
0x00000000004011e5 <+8>:     jne    0x401207 <phase_2+42>
0x00000000004011e7 <+10>:    not    %rsi
0x00000000004011ea <+13>:    or     %rsi,%rcx
0x00000000004011ed <+16>:    xor    $0xfffffffffffffff2,%rcx       // -14, %rcx 
0x00000000004011f1 <+20>:    add    $0x51,%rcx                     // 81, %rcx
0x00000000004011f5 <+24>:    cmp    $0xfffffffffffffe53,%rcx       // -429, $rcx
0x00000000004011fc <+31>:    sete   %al
0x00000000004011ff <+34>:    movzbl %al,%eax
0x0000000000401202 <+37>:    cmp    %rdx,%rcx                      // %rdx = %rcx 
0x0000000000401205 <+40>:    je     0x401213 <phase_2+54>
0x0000000000401207 <+42>:    callq  0x401af5 <bomb_blast>
0x000000000040120c <+47>:    mov    $0xffffffffffffffff,%rax
0x0000000000401213 <+54>:    add    $0x8,%rsp
0x0000000000401217 <+58>:    retq

等效的 C 代码是:

int64_t phase_2(int64_t rdi, int64_t rsi, int64_t rcx, int64_t rdx)
{
if (rdi != 3)
{
bomb_blast();
return -1;
}
rsi = !rsi;
rcx |= rsi;
rcx ^= 0xfffffffffffffff2;
rcx += 0x51;
if (rdx != rcx) {
bomb_blast();
return -1;
}
return (rcx == 0xfffffffffffffe53);
}

假设此函数的预期返回值为 1。(只有这样,%rdx的值是一个常数(,因为rcx最后等于rdxrdx应该是0xfffffffffffffe53(-429(。

然后我们需要做一些逆计算来找出rcx的值。

rcx + 0x51 = 0xfffffffffffffe53
rcx = 0xfffffffffffffe02

XOR 的逆运算就是 XOR 本身。也就是说,如果a ^ b = c,则a = b ^ cb = a ^ c.

rcx ^ 0xfffffffffffffff2 = 0xfffffffffffffe02
rcx = 0xfffffffffffffe02 ^ 0xfffffffffffffff2
rcx = 0x1f0

由于rsi的值是由我们定义的,因此我们可以使用最简单的情况x | 0 = x。因此,rcx的值为 0x1f0(496(,rsi为 -1。

最新更新