所以我正在做二进制炸弹的变体。这是相位

0x0000000000401205 <+0>:     sub    $0x8,%rsp
0x0000000000401209 <+4>:     cmp    $0x3,%rdi                    #rdi = 3
0x000000000040120d <+8>:     je     0x40121d <phase_2+24>        #if(rdi == 3) skip explosion
0x000000000040120f <+10>:    callq  0x401c01 <bomb_ignition>
0x0000000000401214 <+15>:    mov    $0xffffffffffffffff,%rax
0x000000000040121b <+22>:    jmp    0x40124c <phase_2+71>
0x000000000040121d <+24>:    xor    $0xffffffffffffff1c,%rsi     #rsi ^= 0xffffffffffffff1c
0x0000000000401224 <+31>:    and    %rsi,%rdx                    #rdx &= rsi
0x0000000000401227 <+34>:    add    $0x1c8,%rdx                  #rdx += 456
0x000000000040122e <+41>:    cmp    $0x2c5,%rdx                  #rdx == 709
0x0000000000401235 <+48>:    sete   %al
0x0000000000401238 <+51>:    movzbl %al,%eax
0x000000000040123b <+54>:    cmp    %rcx,%rdx                    #rdx == rcx
0x000000000040123e <+57>:    je     0x40124c <phase_2+71>
0x0000000000401240 <+59>:    callq  0x401c01 <bomb_ignition>
0x0000000000401245 <+64>:    mov    $0xffffffffffffffff,%rax
0x000000000040124c <+71>:    add    $0x8,%rsp
0x0000000000401250 <+75>:    retq


我已经注释了我认为在自动取款机旁边的含义。 Im卡住的是<+24>,其中xors $0xffffffffffffff1c%rsi%rsi传递的第二个参数正确吗?那么我如何弄清楚它是什么,所以我可以xor呢?因为它随后将and设置为第三个参数%rdx

所以我认为需要4个数字。第一个是“ 3”(对吗?)。然后用0xffffffffffffffff1c xor第二个。 And这是第三个数字。然后,第三个数字加456,应该是709。这就是第四个数字。我对setemovzbl还是有些困惑。但是我不知道第二个和第三个数字应该是什么。我的预测正确吗?允许的任何帮助。谢谢

最佳答案

呼叫者会检查返回值吗?我假设是这样,否则您可以为rsi和rdx选择所需的内容,然后计算出将匹配的rcx。它根据rax结果将sete/movzx = -1(炸弹爆炸)或0或1(cmp $0x2c5,%rdx)设置为。

让我们命名函数输入,以便我们可以与寄存器中的当前值分开谈论函数args:x:rsi,y:rdx和z:rcx。 (忽略rdi中的第一个arg,需单独检查)。

z只与其他人交互一次,因此可以自由选择。

rsi ^= -228;  // 0xffffffffffffff1c
rdx &= rsi;   // rdx &= (x ^ -228)
rdx += 456

if(rdx != rcx) explode();


我们假设我们还需要rdx == 709 = 0x2c5(因此也z = 709)。让我们从rdx == 709开始倒退:

709 - 456 = 253   // rdx before  add    $0x1c8,%rdx


然后我们需要xy这样的y & (x^-228) == 253。这是2个变量中的一个方程,因此应该有多个解。 “最简单的”将是y = 253(0xfd),然后选择一个x,它将保留所有这些位。

例如,选择x,也选择x ^ 0x1c == 0xfd。 (我们可以忽略高位,因为与0xfd的AND会清除它们)。您可以像加法一样求解该方程式。 xor是它自己的逆(并且是可交换的/缔合的),因此我们可以在xor的两边加上0x1c来求解x = 0xfd ^ 0x1c = 0xe1 = 225

@Prl的解决方案使用x = 0xe1但使用y=255。这可以; AND清除掉多余的设置位。

关于assembly - 如何找出逆向工程 assembly 中的第二个参数/寄存器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46261000/

10-09 00:33