如何逆转 movl 的影响



因此,当调用 movl(在英特尔 x84-64 机器代码中)并将寄存器作为目标时,它将寄存器的高阶字节设置为 0。 那么如何使用 movl 指令来保留寄存器的原始值呢?在这种情况下,我们不能将 rsi/rdi 用于 movl 指令(仅限 esi 和 edi)。 例如,如果我去

movq %rsp, %rax

然后致电

movl %eax, %edx

有没有办法在 movl 之后调用 movl/做一些事情,以便 rdx 可以包含 %rsp 中的原始值?

我不能做像 movq %rax, %rdx 这样的事情的原因是因为我没有可用的这些命令。我正在进行 ROP 攻击,我在小工具农场中只有 movl 指令可供我使用。我还可以访问andb,orb,cmpb和testb指令。

你不能把多个小工具粘在一起吧?您需要找到一个序列,该序列将您想要的值获取到寄存器中并跳转到该寄存器。

任何截断指针高 32 位的东西都没有用;这些位消失了,除非再次从原始复制,否则您无法取回它们。 (或者,如果您可以找到一些旋转和/或shld something/ror rax,32序列)。

写入 32 位寄存器不仅会"隐藏"上位,还会丢弃它们。 这是不可逆的。 您必须在内存或架构寄存器中保留所需的任何数据的副本。