【问题标题】:Operand type mismatch when using "jmp *%esp"使用“jmp *%esp”时操作数类型不匹配
【发布时间】:2018-06-10 13:36:35
【问题描述】:

我的代码中有这个 sn-p

void jmp_esp()
{
    __asm__("jmp *%esp");
}

使用 gcc 编译时

gcc aslr.c -o aslr -ggdb -fno-stack-protector -z execstack

我收到此错误。

aslr.c: Assembler messages:
aslr.c:6: Error: operand type mismatch for `jmp'

为什么汇编指令有效但编译失败?

我读过 DEP(数据执行保护)。会不会是这个功能造成了这个编译错误?如果是这样,如何禁用它?

【问题讨论】:

  • 与您的问题无关,但这不是内联 asm 的有效使用,因为当输入内联 asm 块时,您无法控制 %esp 的值。特别是不一定函数入口处的堆栈指针的值。如果你需要这样做,你需要一个 asm 源文件或文件范围 asm 语句来定义函数入口点而不是 C 函数。
  • @R..:我怀疑 OP 希望 2 字节序列出现在他们的代码中的某处以进行 ret2reg 攻击,而不是正常调用此函数。当然,将它放在全局范围内并在实际指令上加上标签会更容易找到(无需搜索机器代码,只需使用nm 并查找您添加的jmpesp: 标签)。
  • @R.. 正如 Peter Cordes 所说,我只是在玩弄绕过 ASLR 并希望 jmp *%esp 出现在汇编代码中

标签: c assembly stack-pointer


【解决方案1】:

指令jmp *%esp 仅在 16 位和 32 位模式下可用。在 64 位模式下,jmp r/m32 无法编码。根据您的意图,有两种方法可以修复您的代码:

  • 如果您的意图是编写 32 位 x86 程序,请编译并与 -m32 链接以使编译器发出 32 位代码。
  • 如果您的意图是编写 64 位 x86 程序,请将指令更改为 jmp *%rsp 以跳转到 rsp 寄存器中包含的地址。

请注意,这与 DEP 无关。 DEP 阻止执行未明确标记为可执行的内存区域。这发生在运行时,而不是编译时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    • 2023-03-27
    • 2018-08-05
    • 2018-11-02
    相关资源
    最近更新 更多