x86_64 中的 shellcode 在像绝对地址这样的大常量中避免空字节?

问题描述

我刚开始学习 x86_64 汇编,试图移动地址 0x400da6 中的某些内容来注册 eax,我使用

mov    0x400da6,%eax

但这会导致二进制文件末尾出现 00,如何避免这种情况?

 0:   8b 3c 25 a6 0d 40 00    mov    0x400da6,%eax

解决方法

您将需要一个 tmp 寄存器(例如您将无论如何都要覆盖的 EAX)来以一种避免任何 00 字节的方式构造地址,然后是 mov (%rax),%eax。使用 24 位绝对地址的加载没有编码。

例如:

mov $0x400da6 + 0x1111111,%eax
mov -0x1111111(%rax),%eax

生成的机器码为:

                note non-zero high byte
                    vv
   0:   b8 b7 1e 51 01          mov    eax,0x1511eb7
   5:   8b 80 ef ee ee fe       mov    eax,DWORD PTR [rax-0x1111111]

您可以使用任何您想要的常量,只要它适合 32 位符号扩展的 disp32,以便您可以将其用作寻址模式的一部分。如果您需要其他操作,例如 XOR,则需要与负载分开进行 XOR; x86 寻址模式只能添加 2 的补码符号扩展的 8 位或 32 位值。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...