BF Addresses in the Stack
Last updated
Last updated
Si vous êtes confronté à un binaire protégé par un canari et PIE (Position Independent Executable), vous devez probablement trouver un moyen de les contourner.
Notez que checksec
pourrait ne pas trouver qu'un binaire est protégé par un canari s'il a été compilé de manière statique et qu'il n'est pas capable d'identifier la fonction.
Cependant, vous pouvez le remarquer manuellement si vous constatez qu'une valeur est enregistrée dans la pile au début d'un appel de fonction et que cette valeur est vérifiée avant la sortie.
Pour contourner le PIE, vous devez fuir une adresse. Et si le binaire ne fuit aucune adresse, le mieux à faire est de forcer le RBP et le RIP enregistrés dans la pile dans la fonction vulnérable. Par exemple, si un binaire est protégé à la fois par un canari et PIE, vous pouvez commencer à forcer le canari, puis les 8 octets suivants (x64) seront le RBP enregistré et les 8 octets suivants seront le RIP enregistré.
Il est supposé que l'adresse de retour dans la pile appartient au code binaire principal, ce qui, si la vulnérabilité est située dans le code binaire, sera généralement le cas.
Pour forcer le RBP et le RIP du binaire, vous pouvez déterminer qu'un octet deviné valide est correct si le programme affiche quelque chose ou s'il ne plante tout simplement pas. La même fonction que celle fournie pour forcer le canari peut être utilisée pour forcer le RBP et le RIP :
La dernière chose dont vous avez besoin pour contourner le PIE est de calculer des adresses utiles à partir des adresses divulguées : le RBP et le RIP.
À partir du RBP, vous pouvez calculer où vous écrivez votre shell dans la pile. Cela peut être très utile pour savoir où vous allez écrire la chaîne "/bin/sh\x00" à l'intérieur de la pile. Pour calculer la distance entre le RBP divulgué et votre shellcode, vous pouvez simplement mettre un point d'arrêt après avoir divulgué le RBP et vérifier où se trouve votre shellcode, puis calculer la distance entre le shellcode et le RBP :
À partir du RIP, vous pouvez calculer l'adresse de base du binaire PIE dont vous aurez besoin pour créer une chaîne ROP valide.
Pour calculer l'adresse de base, exécutez simplement objdump -d vunbinary
et vérifiez les dernières adresses désassemblées :
Dans cet exemple, vous pouvez voir qu'il suffit de 1 byte et demi pour localiser tout le code, donc, l'adresse de base dans cette situation sera le RIP divulgué mais se terminant par "000". Par exemple, si vous avez divulgué 0x562002970ecf
, l'adresse de base sera 0x562002970000
.