Introduction a LD_PRELOAD
|
26-06-2012, 17h39
(Modification du message : 26-06-2012, 17h47 par Dobry.)
Message : #6
|
|
Dobry
![]() Tueur de lamouz ![]() Messages : 206 Sujets : 25 Points: 73 Inscription : Aug 2011 |
RE: Introduction a LD_PRELOAD
Petite explication fort symathique, je connaisais que le concept du LD_PRELOAD, sans jamais l'avoir utilisé, après m'être penché sur le sujet, je me suis demandé s'il était possible de remplacer une fonction standard par une fonction codée en assembleur (nasm dans mon cas).
Je me suis donc battu (probablement à cause de fautes d'innatention) pour arriver à un résultat tout à fait satisfesant, et très simple (quelques notions en assembleur, et le même code C que celui utilisé dans l'explication d'Ark. Commencons par le code assembleur: Code : externes: Le but n'est pas de s'attacher sur le fonctionnement de cette fonction, mais je vais tout de même expliquer deux trois détails pour ne pas laisser de trou noir dans l'esprit de certains personnes n'ayant jamais fait d'assembleur. Code : externes: Code : push ebp ; Sauvegarde d'EBP Ce code permet de créer une nouvelle section sur la stack, c'est une notion qui demande un minimum de connaissance sur le fonctionnement de la mémoire (enfin bon, google vous expliquera cela probablement plus correctement que moi) Code : mov ebx, [ebp+8] ; Pointeur vers les données Lorsque vous appellez une fonction en C, les arguments passé à cette dernière sont empilé sur la stack, [ebp+8] signifie que l'on souhaite récupérer la VALEUR placé à l'adresse pointée par ebp+8, pourquoi +8 ? Encore une fois, je ne devrais pas m'attarder sur cela, ce n'est pas le but de cette explication, mais je trouve dommage de laisser ce bout de code inexpliqué. Comme je le disais, lorsque qu'en C vous appelez une fonction, les paramètre sont empilés sur la stack et puis l'instruction "call" (qui permet d'accder à la fonction) empile également l'adresse de retour (sinon vous ne reviendriez jamais dans la boucle principal) Schematiquement (baclé) vous auriez : main() -> push word* (on place le pointeur vers le char* sur la stack) -> push cs (registre qui stocke la prochaine instruction) -> jmp strlen Ainsi on se retrouve avec sur la stack ebp+4 : char* ebp : cs (oui +4 car stocké sur 32bits soit 4octets) De plus à l'intérieur de la fonction, lors de la création du segment, on rajoute sur cette stack la valeur d'EBP, la stack ressemble donc à quelque chose comme ebp+8; char* ebp+4: cs ebp : ebp (oui oui !) Ainsi le pointeur est bien contenu au niveau ebp+8 sur la stack Bon suite à ces explications peu claires, je continue sur LD_PRELOAD Pour compiler ce code assembleur, utilisez nasm: nasm -f elf function.asm Un nouveau fichier: function.o devrait apparaitre, nous devons maintenant le lier pour en faire une librairie que nous passerons en argument à LD_PRELOAD ld -shared -o function.so function.o Nous avons donc maintenant notre "shared library". en utilisant le même code que celui donné par Ark, vous devriez obtenir un résultat similaire à celui attendu avec la fonction de la librairie standard. Il y a quelque chose que je souhaiterais rajouter également à ces explications, en effet, nous n'avons aucun moyen (si ce n'est d'observer ) que c'est bel est bien notre fonction qui est chargée et non pas celle standard, pour cela, je vous propose de coller le code suivant (très moche) dans une .asm et recompiler le tout : Code : externes: (ah oui, les retour des fonctions sont stockés dans le registre EAX la plupart du temps (tout le temps ?)) Necromoine, n'hésitez surtout pas à me corriger, à me poser des questions, si des choses sont fausses/incomprises dans ce que j'ai écrit (mes explications sont souvent très confuses)
Aestuārium Erudītiōnis
There are only two hard things in Computer Science: cache invalidation, naming things, and off-by-one errors.
|
|
« Sujet précédent | Sujet suivant »
|
Messages dans ce sujet |
Introduction a LD_PRELOAD - par Ark - 23-06-2012, 13h43
RE: Introduction a LD_PRELOAD - par spin - 23-06-2012, 14h42
RE: Introduction a LD_PRELOAD - par Ark - 23-06-2012, 15h16
RE: Introduction a LD_PRELOAD - par supersnail - 23-06-2012, 16h35
RE: Introduction a LD_PRELOAD - par Ark - 23-06-2012, 17h32
RE: Introduction a LD_PRELOAD - par Dobry - 26-06-2012, 17h39
RE: Introduction a LD_PRELOAD - par spin - 26-06-2012, 18h05
RE: Introduction a LD_PRELOAD - par Dobry - 26-06-2012, 18h50
RE: Introduction a LD_PRELOAD - par spin - 26-06-2012, 19h17
RE: Introduction a LD_PRELOAD - par spin - 28-06-2012, 12h36
RE: Introduction a LD_PRELOAD - par Ark - 28-06-2012, 13h42
|
Sujets apparemment similaires… | |||||
Sujet | Auteur | Réponses | Affichages | Dernier message | |
[Tutoriel] Cacher un service derrière un autre avec LD_PRELOAD | b0fh | 3 | 630 |
30-11-2016, 00h06 Dernier message: ZeR0-@bSoLu |
Utilisateur(s) parcourant ce sujet : 2 visiteur(s)