En este artículo analizaremos: qué es un descriptor de archivo, cómo acceden los procesos a ciertas secuencias de entrada / salida y cómo resolver la primera tarea desde el sitio
pwnable.kr .
Información organizacionalEspecialmente para aquellos que desean 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 del conocimiento y los métodos obtenidos como resultado de estudiar este documento.
Descriptores de archivo
Un descriptor de archivo es un número no negativo que identifica una secuencia de entrada / salida que puede estar asociada con archivos, directorios o sockets.

La tabla de archivos del sistema (SFT - Tabla de archivos del sistema) y la tabla de inodo (Tabla INode) contienen la información necesaria para que el proceso acceda a los datos del archivo. Si varios procesos solicitan acceso al mismo archivo, cada uno de estos procesos recibirá su propio elemento de la tabla de archivos del sistema, a pesar de que funcionarán con el mismo archivo.
El núcleo proporciona el descriptor de archivo para el proceso cuando accede al archivo. Podemos decir que un descriptor de archivo es un índice de una matriz de archivos abiertos que es único para cada proceso. Pero los primeros tres índices están firmemente fijados:
- 0 - entrada estándar (stdin);
- 1 - salida estándar (stdout);
- 2 - flujo de error estándar (stderr).
Por lo tanto, las funciones gets () e printf () de la biblioteca estándar de C usan stdin y stdout, lo que permite que los shells redirijan correctamente la entrada y la salida de los procesos.
Solución de trabajo de fd
Hacemos clic en el primer ícono con la firma fd, y se nos dice que debemos conectarnos a través de SSH con la contraseña de invitado.

Cuando está conectado, vemos el banner correspondiente.

Veamos qué archivos hay en el servidor y qué derechos tenemos.
ls -l

Por lo tanto, podemos leer el código fuente del programa, ya que existe el derecho de leer para todos, y ejecutar el programa fd con los derechos del propietario (se establece el bit fijo). Veamos el código fuente.

Del código se deduce que el programa toma un número como parámetro, le resta 0x1234 y lo usa como descriptor para obtener una cadena que debería ser igual a "LETMEWIN".

Por lo tanto, debemos enviar al programa la cadena "LETMEWIN" a través de la secuencia de entrada estándar (stdin). Para esto, el descriptor que se pasa a la función read () debe ser 0. Es decir, el número 0x1234 debe usarse como parámetro del programa. Convierte a decimal.

Ahora ejecute el programa con el parámetro 4660, suelte la línea deseada y levante la bandera.

Como resultado, obtenemos el primer punto.

Pwnable.kr comienza con una tarea tan fácil, gracias a la cual fue necesario tratar con descriptores. ¡Nos vemos en los siguientes artículos!
Estamos en un canal de telegramas: un
canal en Telegramas .