2009-08-31 2 views
4

Salutations, SO.Erreur d'assemblage en ligne, contrecarrant les tentatives de compilation gcc

J'ai du code que j'ai essayé de compiler en utilisant gcc, mais mes tentatives ont été contrecarrées. Quelqu'un de plus versé pourrait m'aider avec le sujet, peut-être qu'il y a quelque chose qui me manque.

Je compile ce code sur Linux Kitchen 2.6.28-15-générique # 49-Ubuntu SMP mar 18 août 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; 
} 

L'erreur renvoyée est:

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

Merci, tout le monde.

+0

vous pouvez également inline votre assemblage (si c'est plus facile pour vous). Voir http://stackoverflow.com/questions/3139772/check-if-carry-flag-is-set/6399855#6399855. – jww

Répondre

9

Vous devez insérer des lignes de retour (\n) dans votre assemblage en ligne. Dans le cas contraire, il pense que

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

est vraiment

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

Ainsi, les deux premières lignes (et ainsi de suite) devrait être plus comme ceci:

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

Vous pouvez également simplement faire des points-virgules: "xorq% rdx,% rdx;" compilera également. – Chris

+1

le point-virgule dépend de votre assembleur - certaines anciennes versions de 'gas' et/ou certains assembleurs de fournisseurs (' gcc' n'a pas _have_ à utiliser l'assembleur GNU) ne l'aiment pas. Ce qui fonctionne toujours, c'est simplement d'utiliser '" 'pas deux fois par ligne, mais seulement au début et à la fin d'un bloc 'asm' multi-lignes –

+1

Rappelez-vous que pour le compilateur,' "abc" "xyz" 'est juste une manière élégante d'écrire '' abcxyz ''(très pratique quand on sépare des chaînes de long format et autres) Le corps de' asm' est traité comme le reste de la source (malheureusement?). – vonbrand

Questions connexes