[Résolu] [BoF] problème adresse de retour
|
18-10-2012, 23h10
(Modification du message : 21-10-2012, 00h16 par welc0me.)
Message : #1
|
|
welc0me
Membre Messages : 40 Sujets : 6 Points: 1 Inscription : Oct 2012 |
[Résolu] [BoF] problème adresse de retour
Bonsoir,
Pour mon premier message sur le forum, je me permet de reprendre une question qui me bloque sérieusement dans mon étude sur les failles applicatives. Je l'avais posée sur deux autres forum, sans réponse. J'espère donc trouver ici une âme charitable qui me permettra d'avancer J'ai récemment fait l'acquisition du livre "Techniques de Hacking" de Jon Erickson et je suis en ce moment en train d'étudier la partie Exploitation. Mon but ici est d'effectuer un buffer overflow en utilisant l'environnement. Pour cela j'ai créé une variable d'environnement SHELLCODE que j'ai remplie avec un tableau de Nop suivi d'un shellcode d'ouverture de shell root. Le programme ciblé n'est autre que celui présent à ce lien : time0ut (et où la méthode que je veux effectuer y est bien décrite) Code : #include <stdio.h> Pour procéder à l'exploitation il faut donc parvenir à changer l'adresse de retour présente dans le bloc d'activation de la fonction f, et la remplacer par une fausse adresse de retour pointant vers le tableau de Nop contenu dans SHELLCODE (ma variable d'environnement). J'exécute donc mon programme comme cela : Code : ./buffer_overflow $(perl -e 'print "\x39\xe5\xff\xff\xff\x7f\x00\x00"x20') (avec 0x7fffffffe539 une adresse pointant vers le milieu du tableau de NOP) Mais j'obtiens ou rien, ou n'importe quoi. Je regarde ce qu'il se passe avec gdb et j'obtiens : Code : x/20xg buffer Alors voici mes questions :
J'espère avoir été assez clair... Merci ! |
|
18-10-2012, 23h28
Message : #2
|
|
b0fh
Membre actif Messages : 210 Sujets : 17 Points: 309 Inscription : Jul 2012 |
RE: [BoF] problème adresse de retour
Hello,
Alors, il y a une petite confusion je crois. Ici le but de l'exercice est, j'imagine, d'appeler la fonction unused_function en écrasant l'addresse de retour de la stack avec celle de unused_function; ce qui ne nécessite pas l'usage d'un shellcode bourré de NOPs, il suffit de répéter l'addresse de retour, ce que fait ton script perl. Les octets ne sont pas décalés de 2, tu es sur une architecture little endian et les bits les moins significatifs des mots sont alignés correctements. Les \x00 ne sont pas passés à cause de l'expansion du shell, les arguments à un programme étant passés sous forme de null-terminated strings il n'est pas possible d'y inclure des \x00. Les mots ont une longueur de 8 bytes simplement parce que tu es sur une architecture 64 bits. Tu peux compiler tes exemples en passant -m32 à gcc pour faire des binaires 32bit si tu veux. Si passer en 32bits fait disparaitre les bytes nuls dans l'addresse cible, tu n'auras plus de problème. |
|
19-10-2012, 18h06
Message : #3
|
|
welc0me
Membre Messages : 40 Sujets : 6 Points: 1 Inscription : Oct 2012 |
RE: [BoF] problème adresse de retour
Ah oui ! La confusion est bien là . Cependant la technique que j'ai précédemment décrite m'intéresse aussi, et je comprend maintenant pourquoi ça marchait pas. Merci
Donc si je comprends bien, il n'est pas possible d'exploiter ce type de faille sur une architecture 64 bits c'est ça ? (sans compter l'option -m32 sur gcc) |
|
19-10-2012, 18h12
Message : #4
|
|
b0fh
Membre actif Messages : 210 Sujets : 17 Points: 309 Inscription : Jul 2012 |
RE: [BoF] problème adresse de retour
Hello,
Si si, c'est possible. Mais le fait d'avoir un 0x00 dans l'addresse cible t'empêche de la passer telle quelle dans une string null-terminated. Si le programme lisait son buffer sur l'entrée standard au lieu de le prendre dans un argument, par exemple, tu n'aurais pas ce problème. Pour l'attaque qui consiste a sauter vers un bloc de code existant, tu ne peux pas vraiment controler son addresse, mais si ta cible est de sauter sur un buffer sur la stack, la stack aura généralement une addresse haute, donc pas de 0x00 dans les bytes les plus significatifs; et si par malchance un 0x00 apparait dans les bytes les moins significatifs, si le buffer est assez gros pour te permettre une piste de NOPs confortable, tu peux toujours viser ailleurs dans le buffer, sur un addresse qui ne contient pas de 0. |
|
19-10-2012, 22h07
Message : #5
|
|
welc0me
Membre Messages : 40 Sujets : 6 Points: 1 Inscription : Oct 2012 |
RE: [BoF] problème adresse de retour
D'accord, je pense bien avoir saisi tout ça désormais. Du moins j'espère, avec toutes mes recherches de ce soir !
Bref, j'ai donc cherché à appliquer quelques méthodes (en tenant compte de tes remarques) mais il me reste une dernière question, en rapport avec un bug : Code : process 17666 is executing new program: /bin/dash Donc je pense que cette erreur arrive lors de l'exécution du shellcode (que j'ai récupéré sur le tuto sur le BoF de N-PN). Saurais-tu à quoi c'est dû ? |
|
19-10-2012, 22h37
Message : #6
|
|
b0fh
Membre actif Messages : 210 Sujets : 17 Points: 309 Inscription : Jul 2012 |
RE: [BoF] problème adresse de retour
Hello,
GDB montre que ton process a bien exécuté un shell. Le problème est probablement que tu traçais un processus en 32 bit, mais que le shell que tu as exécuté est en 64, gdb essaie dont de s'y attacher automatiquement, et échoue. |
|
20-10-2012, 22h40
Message : #7
|
|
welc0me
Membre Messages : 40 Sujets : 6 Points: 1 Inscription : Oct 2012 |
RE: [BoF] problème adresse de retour
J'avais en fait compilé en 32bits...
Bon, du coup je viens de réussir ma première exploitation, enfin ! Bref, merci pour ces réponses, et pour la peine +1 rép |
|
Utilisateur(s) parcourant ce sujet : 2 visiteur(s)