【问题标题】:Inline assembly error, thwarting gcc compilation attempts内联汇编错误,阻止 gcc 编译尝试
【发布时间】:2010-11-24 11:57:37
【问题描述】:

你好,所以。

我有一些代码尝试使用 gcc 进行编译,但我的尝试遭到了挫败。谁能更精通这个主题,也许我缺少一些东西。

我正在 Linux Kitchen 2.6.28-15-generic #49-Ubuntu SMP Tue Aug 18 19:25:34 UTC 2009 x86_64 GNU/Linux 上编译此代码。

int
main(void)
{
    __asm__(
            "xorq %rdx,%rdx"
            "movq $0x68732f6e69622fff, %rdx"
            "shr $0x8, %rbx"
            "push %rbx"
            "movq %rsp,%rdi"
            "xorq %rax,%rax"
            "pushq %rax"
            "pushq %rdi"
            "movq %rsp,%rsi"
            "mov $0x3b, %al"
            "syscall"
            "pushq $0x1"
            "pop %rdi"
            "pushq $0x3c"
            "pop %rax"
            "syscall"
    );

    return 0;
}

返回的错误是:

$ gcc -o shellcode shellcode.c
shellcode.c: Assembler messages:
shellcode.c:4: Error: bad register name `%rdxmovq $0x68732f6e69622fff'

谢谢大家。

【问题讨论】:

标签: gcc assembly x86 x86-64 inline-assembly


【解决方案1】:

您需要将换行符 (\n) 放入引用的内联程序集中。否则,它认为

xorq %rdx,%rdx
movq $0x68732f6e69622fff, %rdx

真的

xorq %rdx,%rdxmovq $0x68732f6e69622fff, %rdx

所以前两行(等等)应该更像这样:

"xorq %rdx,%rdx\n"
"movq $0x68732f6e69622fff, %rdx\n"

【讨论】:

  • 你也可以只用分号:"xorq %rdx,%rdx;"也会编译。
  • 分号取决于你的汇编器——一些旧版本的gas 和/或一些供应商汇编器(gcc 没有使用 GNU 汇编器)不喜欢。始终有效的方法是简单地使用",而不是每行两次,而只是在多行asm 块的开头和结尾处。
  • 请记住,对于编译器,"abc" "xyz" 只是编写"abcxyz" 的一种奇特方式(在拆分长格式字符串等时非常方便)。 asm 的主体与源的其余部分一样处理(不幸的是?)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-11
  • 1970-01-01
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多