内联程序集错误,阻止gcc编译尝试

内联程序集错误,阻止gcc编译尝试,gcc,assembly,x86,x86-64,inline-assembly,Gcc,Assembly,X86,X86 64,Inline Assembly,你好,所以 我曾经尝试过使用gcc编译一些代码,但是我的尝试被挫败了。有没有更精通这门学科的人能帮助我,也许我还缺少一些东西 我在Linux Kitchen 2.6.28-15-generic#49 Ubuntu SMP周二8月18日19:25:34 UTC 2009 x86_64 GNU/Linux上编译这段代码 int main(void) { __asm__( "xorq %rdx,%rdx" "movq $0x68732f6e696

你好,所以

我曾经尝试过使用gcc编译一些代码,但是我的尝试被挫败了。有没有更精通这门学科的人能帮助我,也许我还缺少一些东西

我在Linux Kitchen 2.6.28-15-generic#49 Ubuntu SMP周二8月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'
谢谢大家。

您需要将换行符(
\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的主体处理方式与源代码的其余部分一样(很遗憾?)。您也可以内联程序集(如果您更容易的话)。请参阅。