Cuando esté desbordando un búfer para escribir en la pila de una manera que sea explotable, sobrescribirá la dirección de retorno en la pila. Es decir, el envío de una cadena larga de AAAAAAAAAAAAAAAAAAAAAAAAAAA.....AAAAAAAAA
dará como resultado que EIP
contenga el valor 0x41414141
cuando la aplicación se bloquee.
Las razones de esto están bien documentadas en muchos lugares de Internet. Aleph1 está rompiendo la pila por diversión y beneficio o Tutoriales de Corelan son excelentes lugares para leer más información, pero en la pregunta en cuestión .
Si bien el control de EIP
es excelente, no conduce instantáneamente a ejecutar el código de su elección. Cuando la función de epílogo muestra la dirección de retorno de la pila, continuará ejecutando las instrucciones en esa ubicación de memoria. Por lo tanto, deberá proporcionar un valor diferente al 0x41414141
. El primer problema es que no sabes qué 4 A
's en tu cadena son los que se encuentran en EIP
. Esta distancia desde la primera A hasta las 4 A que sobrescriben EIP
generalmente se denomina desplazamiento. Puede resolver esto manualmente cambiando los valores suc como AAAABBBBCCCCDDDD....etc
o puede usar uno de los generadores de patrones que pueden calcular el desplazamiento por usted.
Una vez que conozca el desplazamiento, puede codificar la dirección donde debe estar su shellcode en la pila (más fácil para los principiantes) o encontrar un gadget que lo lleve de vuelta a la pila donde está su código de shell (f.ex: jmp esp
) y escriba esa ubicación de memoria en EIP
.