web-dev-qa-db-fra.com

Pourquoi les programmes légitimes auraient-ils une instruction «JMP ESP»?

Il semble qu'une astuce d'exploitation courante consiste à utiliser un débordement de pile pour écraser le pointeur d'instruction de telle sorte qu'il pointe d'un jmp esp instruction quelque part dans le segment de code qui exécute ensuite le code arbitraire du choix de l'attaquant.

Cependant, j'ai du mal à comprendre ce que l'utilisation des programmes légitimes (qui, à ma compréhension, ne sont généralement pas auto-modificants et que tous leurs codes exécutables stockés dans le segment de code) auraient dans l'inclusion de ce type jmp esp instructions en premier lieu.

7
1110101001

L'instruction jmp esp est codé comme FF E4. Il n'est pas nécessaire de trouver une instruction jmp, juste ces octets au milieu de tout autre code ou de données.

C'est la base de la programmation orientée retour (ROP) et de ces petites séquences d'instructions utiles sont souvent appelées "gadgets de rop".

Remarque Cette technique particulière est facilement brisée par une pile non exécutable. Nécessitant une pile exécutable est assez rare (des cas spécifiques extérieurs comme un compilateur JIT), il s'agit donc d'une atténuation simple et efficace. Pour aller autour de cela, il existe des techniques telles que le retour à Libc, qui chaîne un certain nombre de ces petits gadgets de rop pour créer une séquence d'instructions plus longue.

6
David