Accueil > Forum > > > > Adresse de retour d'un fonction (C/ASM)
Adresse de retour d'un fonction (C/ASM)
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
|
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ée 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:
Livres en rapport
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|