所以我正在做二进制炸弹的变体。这是相位
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。这就是第四个数字。我对sete
和movzbl
还是有些困惑。但是我不知道第二个和第三个数字应该是什么。我的预测正确吗?允许的任何帮助。谢谢 最佳答案
呼叫者会检查返回值吗?我假设是这样,否则您可以为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
然后我们需要
x
和y
这样的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/