Resolución de problemas con pwnable.kr 03 - bof. Desbordamiento de búfer en la pila

imagen

En este artículo, analizaremos un tipo de vulnerabilidad, como el desbordamiento del búfer en la pila, y resolveremos la tercera tarea desde el sitio pwnable.kr .

Información organizacional
Especialmente para aquellos que quieran aprender algo nuevo y desarrollarse en cualquiera de las áreas de información y seguridad informática, escribiré y hablaré sobre las siguientes categorías:

  • PWN;
  • criptografía (criptografía);
  • tecnologías de red (Red);
  • inversa (ingeniería inversa);
  • esteganografía (Stegano);
  • búsqueda y explotación de vulnerabilidades WEB.

Además de esto, compartiré mi experiencia en informática forense, análisis de malware y firmware, ataques a redes inalámbricas y redes de área local, realización de pentests y escritura de exploits.

Para que pueda conocer nuevos artículos, software y otra información, creé un canal en Telegram y un grupo para discutir cualquier problema en el campo de ICD. Además, consideraré personalmente sus solicitudes personales, preguntas, sugerencias y recomendaciones personalmente y responderé a todos .

Toda la información se proporciona solo con fines educativos. El autor de este documento no tiene ninguna responsabilidad por los daños causados ​​a alguien como resultado del uso de los conocimientos y métodos obtenidos como resultado de estudiar este documento.

Desbordamiento de búfer


El desbordamiento del búfer es una vulnerabilidad en los programas informáticos basada en la capacidad de escribir datos fuera del búfer asignado en la memoria, que surge, como regla, debido a la recepción y el procesamiento incontrolado de datos desde el exterior. El uso de la tecnología de marco de pila de alto nivel por parte de los idiomas conduce a la mezcla de datos de control y datos de programa.

En este artículo, analizamos solo el desbordamiento del búfer en la pila. Este tipo de desbordamiento de búfer se conoce como Stack smashing y puede explotarse de las siguientes maneras:

  • sobrescribir una variable local ubicada en la memoria cerca del búfer;
  • reescribe la dirección de retorno en el marco de la pila;
  • reescribir un puntero de función o un manejador de excepciones;
  • sobrescribir un parámetro desde otro marco de pila.

Esta tarea utiliza el método de reescribir una variable local. Considere su esencia en el siguiente ejemplo:

#include <stdio.h> #include <string.h> int main(){ char pass[9] = "p@ssw0rd\x00"; char buf[9]; printf("Input password: "); scanf("%s", buf); if(!strcmp(pass, buf)) printf("Login ok!!!\n"); else printf("FAIL...\n"); return 0; } 

Como la variable de paso se definió anteriormente, la variable buf , es posible desbordarla. Si ingresa más de 9 bytes en buf , sobrescribirán los datos en la variable de paso . Por lo tanto, es posible "cambiar" la contraseña a la suya pasando el programa, por ejemplo, una línea como 11111111 \ x0011111111 \ x00 .

imagen

imagen

Solución del trabajo bof


Hacemos clic en el icono con la firma bof, y se nos proporciona el código fuente, el programa en sí, así como la dirección y el puerto para la conexión TCP.

imagen

Veamos el código fuente.

imagen

Del código se deduce que el programa acepta la cadena, pero compara la clave ya cableada con el valor de control. Pero como la entrada no está controlada y la clave se define antes que nuestro búfer, podemos desbordar el búfer y sobrescribir la clave. Para esto, es necesario determinar las posiciones relativas de las variables en la memoria.

Usaré Cutter para analizar el programa. Abra Cutter, especifique la ruta al archivo ejecutable.

imagen

imagen

imagen

Cutter nos envía inmediatamente al punto de entrada. En la lista de funciones, seleccione principal.

imagen

En general, vemos una llamada a nuestra función, ábrala haciendo doble clic en el nombre de la función.

imagen

Hay un comentario antes del código de función, que refleja las variables utilizadas en la función y sus direcciones relativas a la base del marco de pila actual (ebp). Como puede determinar, nuestro búfer es la variable var_2ch , y la clave es arg_8h .

imagen

imagen

Calculamos cuántos bytes necesitamos sobrescribir. Para hacer esto, solo encuentra la diferencia entre las direcciones.

imagen

Por lo tanto, debemos enviar al programa 0x34 cualquier byte y luego agregar el valor de referencia para un ejemplo. Por conveniencia, uso la biblioteca pwntools .

 from pwn import * conn = remote('pwnable.kr', 9000) payload = 'A' * 0x34 payload += '\xbe\xba\xfe\xca' conn.send(payload) conn.interactive() 

Obtenemos el caparazón y vemos la bandera.

imagen

Como resultado, obtenemos nuestros puntos.

imagen

En este artículo, vimos un ejemplo de explotación de un desbordamiento de búfer en una pila, conociendo la herramienta Cutter y la biblioteca pwntools. En el próximo artículo, hablaremos sobre empaquetar archivos ejecutables y resolver la cuarta tarea. Nos vemos en los siguientes artículos.

Estamos en un canal de telegramas: un canal en Telegramas .

Source: https://habr.com/ru/post/459918/


All Articles