几天来我一直在试图找出这个阶段的值,但我似乎无法理解。
我所知道的是需要 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
最后等于rdx
,rdx
应该是0xfffffffffffffe53(-429(。
然后我们需要做一些逆计算来找出rcx
的值。
rcx + 0x51 = 0xfffffffffffffe53
rcx = 0xfffffffffffffe02
XOR 的逆运算就是 XOR 本身。也就是说,如果a ^ b = c
,则a = b ^ c
和b = a ^ c
.
rcx ^ 0xfffffffffffffff2 = 0xfffffffffffffe02
rcx = 0xfffffffffffffe02 ^ 0xfffffffffffffff2
rcx = 0x1f0
由于rsi
的值是由我们定义的,因此我们可以使用最简单的情况x | 0 = x
。因此,rcx
的值为 0x1f0(496(,rsi
为 -1。