内联汇编错误,阻止了gcc编译尝试

时间:2009-08-31 23:40:02

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

问候,SO。

我有一些代码,我尝试使用gcc编译,但我的尝试被挫败了。任何更精通的人都可以帮助我解决这个问题,或许有一些我不知道的事情。

我正在Linux Kitchen 2.6.28-15上编译此代码 - 通用#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'

谢谢大家。

1 个答案:

答案 0 :(得分:9)

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

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

真的是

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

所以前两行(依此类推)应该更像这样:

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