因此,当调用movl(在intel 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指令。
答案 0 :(得分:1)
你可以将多个小工具粘在一起吗?您需要找到一个序列,将您想要的值放入寄存器并跳转到该寄存器。
任何截断指针的高32位的东西都没用; 比特消失了,除非再次从原版中复制,否则你无法取回它们。 (或者如果你能找到一些旋转序列和/或shld something
/ ror rax,32
)。
写一个32位寄存器并不只是"隐藏"高位,它扔掉了。这是不可逆的。您必须在内存或架构寄存器中保留所需数据的副本。