Ret2ret & Reo2pop
Ret2ret
L'objectif principal de cette technique est de contourner l'ASLR en abusant d'un pointeur existant dans la pile.
En gros, les débordements de pile sont généralement causés par des chaînes de caractères, et les chaînes de caractères se terminent par un octet nul à la fin en mémoire. Cela permet de tenter de réduire l'emplacement pointé par un pointeur existant déjà dans la pile. Ainsi, si la pile contenait 0xbfffffdd
, ce débordement pourrait la transformer en 0xbfffff00
(notez le dernier octet nul).
Si cette adresse pointe vers notre shellcode dans la pile, il est possible de faire atteindre ce point par le flux en ajoutant des adresses à l'instruction ret
jusqu'à ce qu'elle soit atteinte.
Par conséquent, l'attaque se déroulerait comme suit :
Glissade de NOP
Shellcode
Écraser la pile depuis l'EIP avec des adresses vers
ret
(glissade RET)0x00 ajouté par la chaîne modifiant une adresse de la pile pour la faire pointer vers la glissade NOP
En suivant ce lien, vous pouvez voir un exemple de binaire vulnérable et dans celui-ci l'exploit.
Ret2pop
Dans le cas où vous pouvez trouver un pointeur parfait dans la pile que vous ne voulez pas modifier (dans ret2ret
nous avons changé le dernier octet le plus bas en 0x00
), vous pouvez effectuer la même attaque ret2ret
, mais la longueur de la glissade RET doit être raccourcie de 1 (afin que le dernier 0x00
écrase les données juste avant le pointeur parfait), et la dernière adresse de la glissade RET doit pointer vers pop <reg>; ret
.
De cette manière, les données avant le pointeur parfait seront supprimées de la pile (ce sont les données affectées par le 0x00
) et le dernier ret
pointera vers l'adresse parfaite dans la pile sans aucun changement.
En suivant ce lien, vous pouvez voir un exemple de binaire vulnérable et dans celui-ci l'exploit.
Références
Last updated