Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Adresse de retour d'un fonction (C/ASM) [ Divers / Débutant(e) ] (bouba)

lundi 29 mai 2006 à 22:57:03 | Adresse de retour d'un fonction (C/ASM)

bouba

Bonjour, je suis en train de suivre un tutorial sur les Buffers Overflow (http://www.cgsecurity.org/exploit/p49-14.txt), mais je ne comprends pas un truc sur les adresses de retours dans la pile.
J'ai le code C suivant que je désassemble .

#include <stdio.h>

void function(int a, int b, int c) {
  char buffer1[5];
  char buffer2[10];
  int * ret;

  /* Je modifie l'adresse de retour de function pour sauter une instruction dans le main */
  ret = (int)buffer1 + 13; // Dans le turorial +12
  *ret = *ret + 7;  // Dans le tutorial +8

  printf("ret %x\n", *ret);
}

int main(void) {
  int x;

  x = 0;
  function(1,2,3);
  x = 1;  // Je souhaite sauter cette instruction en modifiant l'adresse de retour dans function
  printf("%d\n", x); // Ici le printf affiche bien 0 comme il se doit

  return 0;
}


Le désassemblage du code me donne un truc comme ça:
...
0x080483c1 <main+58>:   call   0x8048354 <function>
0x080483c6 <main+63>:   movl   $0x1,0xfffffffc(%ebp)
0x080483cd <main+70>:   mov    0xfffffffc(%ebp),%eax
...

Je saute passe donc directement de 0x080483c1 à 0x080483cd en ajoutant 0x080483cd-0x080483c6=7 à l'adresse de retour de function.
Pour accéder à la valeur de retour je fais ret = (int)buffer1 + 13; car on a le schéma suivant en mémoire
bottom of                                                            top of
memory memory
buffer2 buffer1 sfp ret a b c
<------ [ ][ ][ ][ ][ ][ ][ ]

top of bottom of
stack stack
C'est ici que je ne pige pas, en ajoutant 13 j'arrive à accéder à ret, mais pourtant en comptant bien, on s'aperçoit que buffer1 fait 8 octets, sfp 4, donc 8+4=12 ! Alors pourquoi en ajoutant 13 j'arrive à accéder à ret, mais avec 12 je ne tappe pas ou il faut !! C'est sans doute une erreur de ma part, ou alors la gars a du se planter dans le turorial puisqu'il utilise 
ret = (int)buffer1 + 12;
*ret = *ret + 8;
Pouvez-vous m'expliquer ce qui n'est pas correct dans mon raisonnement SVP ?

Merci.

Bouba





mardi 30 mai 2006 à 22:10:35 | Re : Adresse de retour d'un fonction (C/ASM)

BruNews

Administrateur CodeS-SourceS
Réponse acceptée !
Au moment où tu entres dans la fonction, l'adresse retour est en [esp] et pas ailleurs.
Pour autant c'est assez aléatoire d'y accéder avec seulement du C, dépendra déjà si le compilo aura fait ou non une stackframe (meme en désactivant l'option il en met parfois s'il juge utile...).

ciao...
BruNews, MVP VC++

mercredi 31 mai 2006 à 02:17:36 | Re : Adresse de retour d'un fonction (C/ASM)

Guilou34

Réponse acceptée !
C'est le cas avec visual  studio.net, buffer1 prend 10 octets et buffer2 en prend 20
Pour m'en rendre compte ,j'ai rajouté les lignes initialisant buffer1 et buffer2[0]:
 char buffer1[5];
  char buffer2[10];
buffer1[0]='A';
buffer1[1]='B';
buffer1[2]='C';
buffer1[3]='D';
buffer1[4]='E';
buffer2[0]='0';
  int * ret;
 Comme le signale BruNews, quelque soit le compilateur, à l'entrée de la fonction esp pointe sur l'adresse de retour et, si on veut modifier cette  valeur,  il est quand même plus simple de  coder en asm:  add [esp], valeur. Non ?  .
Salut.

mercredi 31 mai 2006 à 18:46:01 | Re : Adresse de retour d'un fonction (C/ASM)

bouba

Ok, je viens d'essayer de faire quelques tests avec esp en insérant du code ASM inline. Mais je ne pige pas, il semble que l'adresse de retour dans ESP ne corresponde pas à l'adresse de retour que mon debugger m'affiche.

void function(int a, int b, int c) {
  char buffer1[5];
  char buffer2[10];
}


main() {
    int x;

    /* On met l'adresse de ebp dans x */
  asm("movl (%%ebp), %0;"
         :"=r"(x));

  /* Affichage de x, donc de [ebp] */
  printf("x %x\n", x);

    function(1,2,3);
    return 0;
}

L'affichage me donne ceci:
x bf8320f8

Alors que le debugger me donne
0x080483a8 <main+76>:   call   0x8048354 <function>
0x080483ad <main+81>:   mov    $0x0,%eax

L'adresse de ebp avant de rentrer dans la fonction est bf8320f8 celle que m'affiche le debugger est 0x080483ad, pourquoi sont-elles différentes ?

Merci.

Bouba


mercredi 31 mai 2006 à 19:27:06 | Re : Adresse de retour d'un fonction (C/ASM)

bouba

Oups, autant pour moi, ça marche, merci pour vos indices, le code avec ESP pour sauter l'instruction x=1 est le suivant:
#include <stdio.h>

void function(int a, int b, int c) {
  char buffer1[5];
  char buffer2[10];
  int x;

  asm("addl $7,4(%ebp)"); // EIP se voit ajouter de 7 pour sauter l'instruction
}

int main(void) {
  int x;
  x = 0;
  function(1,2,3);
  x = 1;
  printf("x %d\n",x);
  return 0;
}

Merci.

Bouba.





Cette discussion est classé dans : int, adresse, retour, ret, buffer1


Répondre à ce message

Sujets en rapport avec ce message

retour d'interruption [ par S2R ] Bonjour,Je n'arrive pas à récupérer l'adresse d'appel d'une int.J'aurais besoin de pouvoir changer l'adresse de retour d'une int (que j'ai reprogrammé int 1Ch [ par S2R ] Bonjour, je voudrais savoir ce que fait exactement l'int 1Ch.J'ai lu qu'elle est appelée par une autre interruption.Est-ce qu'à la fin de son exécutio interruption du clavier sous linux [ par xian2 ] bonjour,je voudrais connaitre l'equivalent de l'interruption 6 du int 21h du DOS.elle permet de lire le clavier sans afficher le caractère lu.mon co (NASM) Probleme avec 4eh de l'int 21h [ par sirozz ] Certainement un probleme tout simple :SUR NASM :[org 100h][segment .text] mov ah, 4eh mov dx, JPGTYPE int 21h ret[segment .data]JPGTYPE db '*. [NASM] Probleme avec 4eh de l'int 21h [ par sirozz ] Certainement un probleme tout simple :SUR NASM :[org 100h][segment .text]mov ah, 4ehmov dx, JPGTYPEint 21hret[segment .data]JPGTYPE db '*.jpg$'erreur Affichage de l'heure a partir du BIOS [ par FearBlue ] Slt a tous !!!!Je debute en ASM et je desirerais afficher l'heure a partir de la lecture de l'heure du biosje vous montre mon code !!!! [nasm] cryptage [ par sirozz ] Salut à tous !J'ai fait un petit prog qui crypte (xor) un fichier passé en ligne de commande, mais j'ai fait ça avec le guide des interruptions sous l Adresse de la varaiable PATH [ par cobbelguard ] CobbleguardBonjour, je debute en asm et je recherche des infos sur le moyen de recuperer et afficher la variable PATH, quel que soit le mode d'afficha Comment déclarer un champs de bits(BITFIELD ou RECORD) en NASM ? [ par fidro ] Bonjour, Aprés avoir longtemps programmé avec MASM et TASM, j'ai décidé de passer à NASM.Mais voilà, il y a quelques différences ...Et pour l'instant Appel d'API windows en ASM avec VC++ [ par cancooler ] Bonjour a tous, voici ma question: Je desirerai appeler une API windows dans un bloc de code ASM compilé avec VC++Voila le code qui me pose probleme:


Nos sponsors

Sondage...

CalendriCode

Novembre 2008
LMMJVSD
     12
3456789
10111213141516
17181920212223
24252627282930

Consulter la suite du CalendriCode

Téléchargements



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,187 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.