2009-11-20 12 views
1

J'ai un peu de mal à comprendre les appels système plus complexes dans l'assemblage. J'ai écrit un appel système exec et il a très bien fonctionnéAssemblage et appels système

.bss 

.text 

.globl _start 

_start: 

#exit(0) system call 

     movl $1, %rax 
     movl $0, %rbx 
     int $0X80 

Bien que je suis un peu et n'ont pas assurer pu trouver des informations concernant la façon dont vous mettez les chaînes dans un registre. Donc, par exemple, je voulais faire un appel système exec et comme son premier paramètre a besoin d'un nom de fichier pour s'exécuter et que je veux lancer "/ bin/bash", mais comment puis-je obtenir cela dans rbx. Comment puis-je même savoir que je dois utiliser rbx, en X86 je sais que j'utiliserait ebx, est-ce la même relation dans amd64 ebx = rbx, ecx = rcs, etc

int execve (const char * nom de fichier, char * const argv [], char * const envp []);

Merci à tous

Répondre

4

Voici une astuce pour progresser rapidement avec ces aspects de l'assemblage: demandez à un compilateur C de vous montrer comment il le fait! Écrivez un programme C qui fait ce que vous voulez faire et tapez gcc -S.

Exemple:

Manzana:ppc pascal$ cat t.c 
#define NULL ((void*)0) 
char *args[] = { "foo", NULL } ; 
char *env[] = { "PATH=/bin", NULL } ; 


int execve(const char *filename, char *const argv[], char *const envp[]); 

int main() 
{ 

    execve("/bin/bash", args, env); 

} 

alors:

Manzana:ppc pascal$ gcc -S -fno-PIC t.c # added no-PIC for readability of generated code 
Manzana:ppc pascal$ cat t.s 
.globl _args 
    .cstring 
LC0: 
    .ascii "foo\0" 
    .data 
    .align 2 
_args: 
    .long LC0 
    .long 0 
.globl _env 
    .cstring 
LC1: 
    .ascii "PATH=/bin\0" 
    .data 
    .align 2 
_env: 
    .long LC1 
    .long 0 
    .cstring 
LC2: 
    .ascii "/bin/bash\0" 
    .text 
.globl _main 
_main: 
    pushl %ebp 
    movl %esp, %ebp 
    subl $24, %esp 
    movl $_env, 8(%esp) 
    movl $_args, 4(%esp) 
    movl $LC2, (%esp) 
    call _execve 
    leave 
    ret 
    .subsections_via_symbols 
3

Vous ne mettez pas de chaînes dans un registre. Vous devez passer un pointeur (l'adresse) à une chaîne terminée par un caractère nul (0) (style C) dans le registre de cette fonction. Certains appels système (comme write) prennent un pointeur (pas nécessairement terminé par '\0') et la longueur dans deux registres.

# somewhere in the data section: 
myString: 
    .asciz "/bin/bash" 

et de passer $myString en utilisant le registre.

+0

Je comprends maintenant grâce. – Recursion

+0

mais vous voulez dire .asciiz juste, donc son null se termine? – Recursion

+0

Récursivité: Oui. –