• STATISTIQUES
  • Il y a eu un total de 0 membres et 2440 visiteurs sur le site dans les dernières 24h pour un total de 2 440 personnes!
    Membres: 2 605
    Discussions: 3 579
    Messages: 32 816
    Tutoriels: 78
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [FR] Le site du zero
    Découvrez gratuitement la programmation (C, C++, PHP, MySQL, XHTML, CSS...), Linux, le Mapping, la modé...
    Programmation
    [FR] dcode
    dcode.fr est le site indispensable pour décoder des messages, tricher aux jeux de lettres, résoudre des énigmes...
    Outils / Add-on
    [EN] Framework Metasploit
    Le Framework Metasploit est un logiciel gratuit, open source de tests de pénétration développ&ea...
    Vulnérabilités
    [EN] Defcon
    Lancé en 1992 par Dark Tangent, DEFCON est la plus ancienne et la plus grande conférence underground de...
    Hacking
    [EN] Reddit
    Subreddit dédié à la sécurité informatique.
    Hacking
    [EN] Exploit-db
    Une base de données d'exploits triés par genre (GHDB, Remote, Local, Web, DOS, ShellCode) à ...
    Vulnérabilités
    [EN] Big-Daddy
    Big-Daddy est site internet communautaire avec un effectif diversifié, y compris des artistes, des programmeur...
    Hacking

  • DONATION
  • Si vous avez trouvé ce site internet utile, nous vous invitons à nous faire un don du montant de votre choix via Paypal. Ce don servira à financer notre hébergement.

    MERCI!




Note de ce sujet :
  • Moyenne : 4.5 (2 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
Introduction a LD_PRELOAD
26-06-2012, 17h39 (Modification du message : 26-06-2012, 17h47 par Dobry.)
Message : #6
Dobry Hors ligne
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:
     global strlen ; Declaation de la fonction

strlen:
  push ebp ; Sauvegarde d'EBP
  mov ebp, esp
  push esp ; Sauvegarde d'ESP
      
  mov ebx, [ebp+8] ; Pointeur vers les données
  xor eax,eax ; Compteur

  strlen_loop:
    inc eax
    cmp byte [ebx+eax],0 ; Fin de la chaine
    jne strlen_loop
  
pop esp ; Restauration d'ESP
pop ebp ; Restautation d'EBP
ret

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:
    global strlen
Cette partie du code permet de créer un label qui sera accesible depuis l'exterieur du code assembleur (pour faire simple, nous pourrons y acceder depuis notre fichier codé en C)

Code :
push ebp ; Sauvegarde d'EBP
      mov ebp, esp
      push esp ; Sauvegarde d'ESP

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
  xor eax,eax ; Compteur

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:
    global strlen

strlen:
   mov eax,3
   ret
Ce code est celui d'une fonction strlen qui retourne tout le temps 3, si write ne vous affiche que 3 caractère sur une chaine > 3 caractères alors c'est bien votre fonction qui est chargée.
(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.
+1 (0) -1 (0) Répondre


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

Atteindre :


Utilisateur(s) parcourant ce sujet : 2 visiteur(s)
N-PN
Accueil | Challenges | Tutoriels | Téléchargements | Forum | Retourner en haut