gpt4 book ai didi

assembly - 如何找出逆向工程汇编中的第二个参数/寄存器?

转载 作者:行者123 更新时间:2023-12-02 19:44:07 31 4
gpt4 key购买 nike

所以我正在做二进制炸弹的变体。这就是阶段

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

我已经在 asm 旁边注释了我认为它的含义。我坚持的是 <+24> 其中 xors $0xffffffffffffff1c%rsi%rsi 传递的第二个参数是否正确?那么我如何弄清楚它是什么,以便我可以对它进行 xor 呢?因为它然后将 and 传递给 %rdx,这是第三个参数。

所以我认为它需要 4 个数字。第一个是“3”(对吗?)。然后用 0xffffffffffffff1c 对第二个进行 xorAnd 将其设置为第三个数字。然后第三个数字加上 456,应该是 709。这就是第四个数字应该是的。另外,我对 setemovzbl 仍然有点困惑。但我不知道第二个和第三个数字应该是什么。我的预测正确吗?感谢任何帮助。谢谢

最佳答案

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

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

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。 (我们可以忽略高位,因为 AND 与 0xfd 会清除它们)。您可以像求解加法一样求解该方程。 xor 是它自己的逆(并且是可交换/关联的),因此我们可以通过 0x1c 对两边进行 xor 来求解 x = 0xfd^0x1c = 0xe1 = 225

@Prl 的解决方案使用 x = 0xe1y=255。这可以;额外的设置位将被 AND 删除。

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

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com