Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 32-bits / 64-bits Assembleur Discussion :

Assigner le retour d'une fonction C sans passer par une variable temporaire


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre à l'essai
    Assigner le retour d'une fonction C sans passer par une variable temporaire
    Bonjours à tous, je suis en train de faire un projet secu pour l'école. Voici ma question.

    Est-il possible d'assigner le retour d'une fonction sans passer par une variable temporaire ?
    Quelque chose comme ça :
    Code C :Sélectionner tout -Visualiser dans une fenêtre à part
    (char)(strchr(buff, '\n')) = '\0';


    J'explique pourquoi cette question.
    Voici l'asm d'une partie du code de mon projet scolaire :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
       0x080484b4 <+0>:	push   ebp
       0x080484b5 <+1>:	mov    ebp,esp
       0x080484b7 <+3>:	sub    esp,0x1018
       0x080484bd <+9>:	mov    eax,DWORD PTR [ebp+0xc]
       0x080484c0 <+12>:	mov    DWORD PTR [esp],eax
       0x080484c3 <+15>:	call   0x80483b0 <puts@plt>
       0x080484c8 <+20>:	mov    DWORD PTR [esp+0x8],0x1000
       0x080484d0 <+28>:	lea    eax,[ebp-0x1008]
       0x080484d6 <+34>:	mov    DWORD PTR [esp+0x4],eax
       0x080484da <+38>:	mov    DWORD PTR [esp],0x0
       0x080484e1 <+45>:	call   0x8048380 <read@plt>
       0x080484e6 <+50>:	mov    DWORD PTR [esp+0x4],0xa
       0x080484ee <+58>:	lea    eax,[ebp-0x1008]
       0x080484f4 <+64>:	mov    DWORD PTR [esp],eax
       0x080484f7 <+67>:	call   0x80483d0 <strchr@plt>
       0x080484fc <+72>:	mov    BYTE PTR [eax],0x0
       0x080484ff <+75>:	lea    eax,[ebp-0x1008]
       0x08048505 <+81>:	mov    DWORD PTR [esp+0x8],0x14
       0x0804850d <+89>:	mov    DWORD PTR [esp+0x4],eax
       0x08048511 <+93>:	mov    eax,DWORD PTR [ebp+0x8]
       0x08048514 <+96>:	mov    DWORD PTR [esp],eax
       0x08048517 <+99>:	call   0x80483f0 <strncpy@plt>
       0x0804851c <+104>:	leave
       0x0804851d <+105>:	ret


    Dans ce bout de code, le strcpy recherche un '\n' dans une chaîne de caractères et assigne la valeur ou le pointeur pointe a '\0' sans passer par une tmp (il faut me le dire si je me trompe ).

    J'ai reproduit le même comportement, mais pas exactement le meme asm (ce n'est pas obligatoire, mais j'aimerais bien avoir le même asm ).
    Voici mon code C qui a le même comportement :
    Code C :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char                            *p(char *ptr, char *str)
    {
            char                    buff[0x1000];
     
            puts(str);
            read(STDIN_FILENO, buff, 0x1000);
            str = strchr(buff, '\n');
            *str = '\0';
            return (strncpy(ptr, buff, 0x14));
    }


    Mon problème est à la ligne du strchr et de la ligne suivante, j'ai trop d'ASM car je passe par une tmp contrairement au binaire de l'école.

    Avez-vous une idée de comment faire ça sans passer par une variable tmp ?

    Merci

  2. #2
    Responsable Systèmes

    Dans ton post, tu mélanges du code C avec du code assembleur.

    Ta question concerne l'assembleur ou le C ?

    Il y a 2 façons de passer des paramètres, par valeur ou par variable. En C, le passage de paramètre se fait par variable, c'est-à-dire que le contenu de la variable passée en paramètre est copié dans une variable locale à la fonction appelée. Les modifications de celle-ci ne vont pas modifier le contenu de la variable appelante.

    Tu peux contourner ce comportement via les pointeurs, mais il faut maîtriser ce que tu fais et je pense que ça n'a d’intérêt que dans des cas précis.

    Ce fonctionnement peut ne pas être apparent dans le code assembleur, selon les optimisations du compilateur.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutor...s/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation