lunes, 3 de febrero de 2014

Buffer overflow a fondo (II) - Sobreescribiendo el EIP

En el anterior post, teníamos localizado el desplazamiento dentro del buffer  que se cargaba en el EIP. En este post veremos que valor debemos colocar en esa ubicación para que  se ejecute nuestro código.

Sabemos que nuestro código, el que queremos inyectar, empieza en la dirección apuntada por el registro ESP (stack pointer), luego hemos de buscar una instrucción JMP ESP y esperar que cuando se ejecute ya esté nuestro código dentro de la pila. Si no fuera así, deberíamos intentarlo con otra hasta que logremos transferir el control a nuestro código.

Para empezar arrancamos Ollydbg y cargamos el programa minishare exe.

Primero vamos cuantos módulos ejecutables están dentro de nuestro proceso. Seleccionamos View -> Executable modules y se abre la ventana con todos los módulos que tenemos a nuestro alcance




Estos módulos caen dentro de una de estas categorías:


  • Programa principal.
  • DLL's del programa.
  • DLL's del sistema.

Veamos por donde atacamos. Lo primero sería intentar localizar la instrucción dentro del programa principal, pero tenemos un problema.
La dirección de inicio del programa principal es: 0x00400000. Si colocamos esta dirección dentro del buffer atacante corremos el riesgo de que el 0x00 sea interpretado como un fin de string y no logremos llevar el bloque de datos completo a la pila.

Por la misma razón hemos evitar que en las direcciones aparezcan los caractéres 0x0a y 0x0d control de carro y nueva línea respectivamente.

Busquemos entonces módulos que en su dirección base no tengan el carácter 0x00 en algun otro módulo. Nuestro programa es tan simple que carece de DLL's propias por lo que nos vemos obligados a usar una del sistema. Estos módulos empiezan todos en la direcciones altas de memoria lo que favorece a nuestros intereses.
Seleccionamos una de las más comunes user32.dll y buscamos la instrucción  JMP ESP.


Encontramos una instrucción en la dirección 0x7E429353




Pongamos un breakpoint en esa dirección del programa y llevemos ese valor al nuestro script de python. Arrancamos el programa y ejecutamos el script.
Nuestro programa se para antes de ejecutar la instrucción JMP ESP damos a ejecutar por pasos para que se ejecute el salto y.... ya tenemos al EIP apuntando a donde queremos, el inicio de nuestro buffer.



No daremos a seguir porque lo que continua no tiene sentido a nivel de código y el programa fallará como siempre.

En la siguiente entrega inyectaremos una shell code.


Buffer overflow a fondo(I)                                                   Buffer overflow a fondo(III)  Inyectando código