c - 二元炸弹第二阶段算术

标签 c assembly binary-bomb

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

据我所知,需要 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 ^ cb = a ^ c .

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

作为 rsi 的值是我们定义的,我们可以用最简单的情况x | 0 = x 。所以 rcx 的值是 0x1f0(496) 和 rsi是-1。

关于c - 二元炸弹第二阶段算术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58371981/

相关文章:

c - 在 C 中使用两个堆栈实现一个队列

c - 函数返回两个用 C 中的逗号分隔的东西

从 Delphi 调用特定的 Win32 API - 为什么异常会在没有 "asm pop..."的情况下出现?

assembly - mov 指令和寄存器 - 困惑!

使用 C 函数 fopen 时调用函数或程序

c - 错误调用对象 ""不是 c 中的函数或函数指针

c++ - 如何在 Code::Blocks 中编译 ".s"汇编文件

c - 了解二进制炸弹第二阶段的汇编代码

c - 解密 x86 汇编函数

assembly - 二元炸弹 - 第 4 阶段