Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何扭转movl的影响_Assembly_X86 64_Cpu Registers_Exploit - Fatal编程技术网

Assembly 如何扭转movl的影响

Assembly 如何扭转movl的影响,assembly,x86-64,cpu-registers,exploit,Assembly,X86 64,Cpu Registers,Exploit,因此,当调用movl(在英特尔x84-64机器代码中)并将寄存器作为目标时,它会将寄存器的高阶字节设置为0。 那么,如何使用movl指令来保持寄存器的原始值呢?在这种情况下,我们不能将rsi/rdi用于movl指令(仅esi和edi)。 例如,如果我去 movq %rsp, %rax 然后打电话 movl %eax, %edx 有没有办法在movl之后调用movl/do something,这样rdx就可以包含%rsp中的原始值 我之所以不能执行movq%rax,%rdx之类的操作,是因为我

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

movq %rsp, %rax
然后打电话

movl %eax, %edx
有没有办法在movl之后调用movl/do something,这样rdx就可以包含%rsp中的原始值


我之所以不能执行movq%rax,%rdx之类的操作,是因为我没有这些命令。我正在进行ROP攻击,在gadget farm中我只有movl指令可用。我还可以访问andb、orb、cmpb和testb指令。

您不能将多个小工具粘在一起,是吗?您需要找到一个序列,该序列将您想要的值放入寄存器并跳转到该寄存器

任何截断指针高32位的操作都是无用的位已消失,除非再次从原件复制,否则无法取回位。(或者,如果您可以找到一些旋转序列和/或
shld something
/
ror-rax,32


写入32位寄存器不仅仅是“隐藏”高位,而是将其丢弃。这是不可逆的。您必须在内存或体系结构寄存器中保留所需数据的副本。

movl%rsi,%rdx
?零扩展丢弃位;任何地方都没有隐藏的副本。您必须在内存或体系结构寄存器中保留所需数据的副本。您可以使用64位AND和OR操作(或移位/旋转)将一个寄存器的低32与另一个寄存器的高32合并,如果您想…顺便问一下,
%rsi
%rdi
是如何进入的?您的代码示例使用的是RSP,而不是RSI。您的问题的答案是movq%rax,%rdx,但由于这显然不是您要寻找的答案,因此您的问题中一定缺少一些内容。@Devam:您知道,对吗?只是用REX前缀使操作数大小为64位?它仍然是您可以在现代CPU上使用的最有效的指令之一。NVM,在我发表评论几秒钟后,你终于澄清了你的限制。