[FADB] 2. Las instrucciones CALL y RET

FUNDAMENTOS DE LOS ATAQUES POR DESBORDAMIENTO DE BUFFER

La instrucción CALL sirve para hacer llamadas a funciones en ensamblador. Veamos el siguiente código de ejemplo:

0x0804836C -> PUSH EBP
0x0804836D -> MOV ESP,EBP
0x0804836F -> CALL 0x0804829C
0x08048374 -> ADD 0x10,ESP

En la dirección 0x0804836F tenemos una llamada a una función, que comienza en 0x0804829C, mediante la instrucción CALL. Lo primero que va a hacer CALL es meter en la pila la dirección de la siguiente instrucción, o dirección de retorno. Suponiendo que ESP = 0x09000000 primero le restamos 4, 0x08FFFFFC, y metemos en la pila los 4 bytes de la dirección donde se encuentra ADD 0x10,ESP. La pila quedaría tal que así:

0x09000000 XX <-- El byte más bajo de EBP (PUSH EBP)

0x08FFFFFF 08
0x08FFFFFE 04
0x08FFFFFD 83
0x08FFFFFC 74

0x08FFFFFB ??

Acto seguido, CALL pone en el registro EIP (Extended Instruction Pointer), que es el encargado de apuntar a la siguiente instrucción a ejecutar, la dirección de la función, es decir, 0x0804829C. Con esto ya se comienzan a ejecutar las instrucciones de la función. Supongamos ahora que la función consta del siguiente código:

0x0804829C -> MOV EAX,EBX
0x0804829E -> RET

La instrucción RET (RETurn) realiza la operación contraria a CALL, es decir, devuelve el flujo del programa donde estaba antes de la llamada a la función. Primero saca de la pila 4 bytes, los pone en EIP y luego suma 4 a ESP. Así que la siguiente instrucción en ejecutarse después de RET es aquélla cuya dirección se encuentre en la cima de la pila antes de ejecutarse RET. En nuestro caso, RET extrae de la pila (ESP = 0x08FFFFFC) el valor 0x08048374, lo pone en EIP y suma 4 a ESP. Así que la siguiente instrucción en ser ejecutada después de RET (dirección 0x0804829E) es ADD 0x10,ESP (dirección 0x08048374).

¿Qué pasaría entonces si ejecutásemos el siguiente código?

0x08000000 -> PUSH 0x08000000
0x08000005 -> RET

Pues que entraríamos en un bucle infinito. ¿Por qué? Supongamos que antes de ejecutar nada, ESP = 0x09000000 y EIP = 0x08000000. Al ejecutar la instrucción apuntada por EIP, PUSH 0x08000000, metemos en la pila el valor 0x08000000. Después, al ejecutar RET, esta instrucción saca el valor que haya en la pila (0x08000000) y lo copia a EIP. Así la siguiente instrucción que pasaría a ejecutarse sería la ubicada en la dirección 0x08000000, es decir, PUSH 0x08000000, y de vuelta al principio.

¿Qué sonsacamos de esto? Pues que podemos hacer que el flujo de un programa cambie al modificar la dirección de retorno almacenada en la pila. Éste es uno de los fundamentos de los ataques por desbordamiento de buffer.

Comments

  1. solo tu te entiendes ATTE. equipo 3

    ReplyDelete
  2. Pero sobre lo que veo no tienes ningún interés en enterarte realmente, porque sino preguntarías qué no entiendes. A menos que no entiendas nada de nada, con lo cual deberías empezar con algo más sencillo. No se pueden hacer cohetes si no se saben encender cerillas.

    ReplyDelete
  3. [Fadb] 2. Las Instrucciones Call Y Ret >>>>> Download Now

    >>>>> Download Full

    [Fadb] 2. Las Instrucciones Call Y Ret >>>>> Download LINK

    >>>>> Download Now

    [Fadb] 2. Las Instrucciones Call Y Ret >>>>> Download Full

    >>>>> Download LINK bY

    ReplyDelete

Post a Comment

Comment, motherf*cker

Popular Posts