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 organizacionalEspecialmente 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 .


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.

Veamos el código fuente.

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.



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

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

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 .


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

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.

Como resultado, obtenemos nuestros puntos.

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 .