如何解决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 位值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。