2009-08-31 4 views
4

Приветствую вас, SO.Ошибка сборки встроенной сборки, попытки компиляции gcc-gc

У меня есть код, который я пытался скомпилировать с использованием gcc, но мои попытки были сорваны. Может ли кто-нибудь более разбираться в этом вопросе, возможно, что-то мне не хватает.

Я компилирую этот код на Linux Kitchen 2.6.28-15-generiC# 49-Ubuntu SMP Вт Авг 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' 

Спасибо всем.

+0

вы можете также встраивать сборку (если вам это проще). См. Http://stackoverflow.com/questions/3139772/check-if-carry-flag-is-set/6399855#6399855. – jww

ответ

9

Вам необходимо установить новые строки (\n) в свою встроенную сборку. В противном случае, он считает, что

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

действительно

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

Таким образом, первые две строки (и так далее) должно быть больше, как это:

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

Вы также можете просто сделать точки с запятой: «xorq% rdx,% rdx;» также будет компилироваться. – Chris

+1

точка с запятой зависит от вашего ассемблера - некоторые старые версии «газа» и/или некоторых сборщиков вендоров ('gcc' не _have_ для использования ассемблера GNU) не нравится. То, что всегда работает, - просто использовать '' 'не дважды в строке, а только в начале и конце многострочного блока' asm'. –

+1

Помните, что для компилятора '' abc "" xyz "' просто фантастический способ написать '' abcxyz'' (довольно удобно при разделении длинных строк формата и т. д.) Тело 'asm' обрабатывается так же, как и остальная часть источника (к сожалению?). – vonbrand

Смежные вопросы