CTF PWN práctica cobertura de dirección de remitente

El experimento realizado hoy es la cobertura de dirección de retorno del ejercicio CTF PWN, para experimentar el nuevo método de desbordamiento.

Antes de aprender la cobertura de direcciones, todavía hay algunos pequeños conocimientos que deben dominarse, de lo contrario, definitivamente se verá confundido al hacer las preguntas, en primer lugar, la convención de llamada de funciones, y luego necesita conocer el modelo básico de ataque de desbordamiento de búfer.

convención de llamada de función

La convención de llamada de función describe el método de pasar parámetros de función y los detalles técnicos de la pila trabajando juntos. Las diferentes convenciones de llamada de función son básicamente las mismas en principio, pero hay diferencias en los detalles, incluido el método de paso de parámetros de función, el orden de apilamiento de parámetros, y la función Quién equilibrará la pila al regresar. Este experimento se centra en explicar la convención de llamada de funciones del lenguaje C.

A través del estudio de los experimentos anteriores de la serie PWN, podemos encontrar que cuando la función principal se desmonta a través de la instrucción disas en gdb, las instrucciones de desmontaje al principio y al final de la función son las mismas:

empujar %ebp

mov %esp,%ebp

dejar

retirado

Al principio de la función, la primera es una instrucción push %ebp, que empuja el registro ebp a la pila para guardar el valor del registro ebp, seguido de mov %esp, %ebp transfiere el valor del registro esp
al registro ebp; en la función Al final, la instrucción dejar es equivalente a
las dos instrucciones %ebp, y su función es justo opuesta a las dos primeras instrucciones, es decir restaurar el contenido de los registros esp y ebp.

Si se llama a la función B en la función A, llamamos a la función A la función de llamada principal, y la función llamada es la función B. Si la declaración de la función B es int B (int arg1, int arg2, int arg3), entonces en la función
A La forma de la instrucción de ensamblado cuando se llama a la función B es la siguiente:

empujar arg3

empujar arg2

empujar arg1

llamar B

Tres pulsaciones consecutivas empujan los parámetros de la función a la pila en orden de derecha a izquierda y luego ejecutan la llamada
B para llamar a la función B. Tenga en cuenta que el efecto que se ve en gdb puede no ser tres empujones, sino tres movimientos para operar la pila. Esto se debe a que Linux usa el ensamblado al estilo de AT&T, y las instrucciones anteriores usan el ensamblado al estilo de Intel, que es más fácil de entender.

Los detalles internos de la instrucción de llamada son: inserte la dirección de la siguiente instrucción en la pila y luego salte a la función B para ejecutar el código. La dirección de la siguiente instrucción de la llamada mencionada aquí también se conoce comúnmente como dirección de retorno. La última instrucción retn de la función B extraerá la dirección de retorno de la pila y la asignará al registro EIP para lograr el propósito de regresar a la función A y continuar con la ejecución.

headImg.action?news=666b7c59-65b8-4d61-a443-512ac67c7322.png

Modelo básico de ataque de desbordamiento de búfer

El ataque de desbordamiento de búfer básico generalmente se inicia reescribiendo la dirección de retorno de la función. Si A llama a la función B, en circunstancias normales, cuando la función B regresa, se ejecuta la instrucción retn y la dirección de retorno se obtiene de la pila para volver a la función A y continuar con la ejecución del código. Y una vez que los datos de desbordamiento del búfer reescriben la dirección de retorno, podemos controlar la función B para saltar al lugar especificado para ejecutar el código.

headImg.action?news=2a74cade-00ba-4e0f-ba1f-5393ae106750.png

1. Contenido y pasos experimentales

Este artículo incluye experimentos relacionados: ["Cobertura de dirección de retorno de ejercicio PWN"](https://www.hetianlab.com/expc.do?ec=ECID172.19.104.182014110409173900001&pk_campaign=freebuf-wemedia
).

Antes de hacer el experimento, repase las preguntas cuidadosamente y lea la descripción.

Hay un programa pwn5 en el directorio host/home/test/5. La ejecución de este programa puede ingresar datos para la prueba. En circunstancias normales, el programa no generará ninguna información de salida después de recibir los datos de entrada y saldrá directamente. Luego, cuando se ingresa cierta cantidad de datos, se puede solicitar el mensaje de error de
falla de segmentación
. Cuando se ingresan los datos de entrada cuidadosamente construidos, se puede lanzar un ataque de desbordamiento en el programa para lograr el propósito de reescribir el flujo de ejecución del programa. Cuando el ataque es exitosa, se generará la siguiente información:

Felicitaciones, lo hiciste.

Realice ingeniería inversa y depure el programa pwn5, encuentre las lagunas dentro del programa y construya datos de entrada especiales para que genere un mensaje de aviso exitoso.

Use cd /home/test/5 para cambiar al directorio donde se encuentra el programa y ejecute cat pwn5.c para ver el código fuente:

#incluir <stdio.h>

victoria nula()

{

printf(“Felicitaciones, lo lograste.\n”);

}

int main(int argc, char** argv)

{

búfer de caracteres[64];

gets(buffer); // Hay un desbordamiento de buffer

devolver 0;

}

El programa define una matriz de búfer de 64 bytes y luego usa gets para obtener datos de entrada. Sabemos que gets es una función insegura, lo que provocará un desbordamiento del búfer y la dirección de retorno de la función en la pila se puede reescribir. Cuando el la dirección de retorno se reescribe Cuando es la dirección de la función ganadora, se puede generar el mensaje de aviso de éxito.

El desbordamiento de gets(buffer) es demasiado obvio, el problema es que no sabemos cuantos bits necesitamos ingresar para desbordar.

Ejecute gdb pwn5 para comenzar a depurar pwn5 a través de gdb. Ahora necesitamos leer el código ensamblador de la función principal y ejecutar el comando disas main en gdb:

Primero usamos b *0x080483f8 para establecer un punto de interrupción en la primera instrucción de la función principal y, al mismo tiempo, usamos b
*0x08048408 para establecer un punto de interrupción en la llamada de la función gets y luego ingresamos el comando r para ejecutar el programa. , estará en el primer punto de interrupción Divídalo, como se muestra en la siguiente figura:

headImg.action?news=c22021b3-9df2-4ce3-9d2c-a715d4eca654.png

En este momento, ejecute ir
$esp para ver el valor del registro esp. A través del análisis previo de la convención de llamada de función, sabemos que la dirección de retorno se almacena en la parte superior de la pila en este momento. En este momento, el el valor del registro esp es 0xffffd6cc.

Ingrese el comando c en gdb para permitir que el programa continúe ejecutándose, y se romperá en el segundo punto de interrupción.A través del análisis de las instrucciones de ensamblaje, sabemos que el registro eax almacena la dirección de inicio del búfer, así que ejecute ir $ eax para ver la dirección del
búfer:

headImg.action?news=99013fac-420f-4438-ac24-5ef7ee1ba589.png

Vemos que el valor del registro eax es 0xffffd680, entonces la diferencia entre estas dos direcciones es 76, como se muestra en la siguiente figura:

headImg.action?news=39a214e9-c1a3-49f6-b706-bbbbdd70a068.png

Es decir, después de cubrir 76 bytes de datos, si cubrimos otros 4 bytes, podemos cubrir la dirección de retorno con la dirección que queramos.

Ejecute disas win en gdb para ver que la dirección de la función win es 0x080483e4, y luego los datos de entrada se pueden construir para lanzar un ataque de desbordamiento.

Mientras controlemos razonablemente el contenido de los bytes 77 a 80 de los datos de entrada, podemos sobrescribir la dirección de retorno de la función, lanzando así con éxito un ataque de desbordamiento.

Ahora la dirección de la función win es 0x080483e4, convertida al formato little-endian es '\xe4\x83\x04\x08', luego puede construir un comando de este tipo para realizar pruebas de desbordamiento:

python -c “imprime 'A'*76+'\xe4\x83\x04\x08'” | ./pwn5

El efecto del ataque se muestra en la siguiente figura:

headImg.action?news=fde503c7-e89e-4654-88ba-927a42493016.png

por fin

Comparta una forma rápida de aprender [Seguridad de red], "quizás" el método de aprendizaje más completo:
1. Conocimiento teórico de seguridad de red (2 días)
① Comprender los antecedentes relacionados con la industria, las perspectivas y determinar la dirección de desarrollo.
②Aprenda las leyes y reglamentos relacionados con la seguridad de la red.
③El concepto de operación de seguridad de la red.
④Introducción de garantías múltiples, reglamentos de garantías, procedimientos y normas. (Muy importante)

2. Conceptos básicos de las pruebas de penetración (una semana)
①Proceso de prueba de penetración, clasificación, estándares
②Tecnología de recopilación de información: recopilación de información activa/pasiva, herramientas Nmap, Google Hacking
③Escaneo de vulnerabilidades, utilización de vulnerabilidades, principios, métodos de utilización, herramientas (MSF), Bypass IDS y reconocimiento antivirus
④ Simulacro de ataque y defensa del host: MS17-010, MS08-067, MS10-046, MS12-20, etc.

3. Conceptos básicos del sistema operativo (una semana)
① Funciones y comandos comunes del sistema Windows
② Funciones y comandos comunes del sistema Kali Linux
③ Seguridad del sistema operativo (resolución de problemas de intrusión del sistema/base de refuerzo del sistema)

4. Base de la red informática (una semana)
①Base, protocolo y arquitectura de la red
informática ②Principio de comunicación de red, modelo OSI, proceso de reenvío de datos
③Análisis de protocolo común (HTTP, TCP/IP, ARP, etc.)
④Tecnología de ataque de red y tecnología de defensa de seguridad de red
⑤Web principio de vulnerabilidad y defensa: ataque activo/pasivo, ataque DDOS, recurrencia de vulnerabilidad CVE

5. Operaciones básicas de base de datos (2 días)
①Conceptos básicos de base de datos
②Conceptos básicos del lenguaje SQL
③Refuerzo de seguridad de base de datos

6. Penetración web (1 semana)
①Introducción a HTML, CSS y JavaScript
②OWASP Top10
③Herramientas de escaneo de vulnerabilidades web
④Herramientas de penetración web: Nmap, BurpSuite, SQLMap, otras (chopper, escaneo faltante, etc.)

inserte la descripción de la imagen aquí

Felicitaciones, si aprendes esto, básicamente puedes trabajar en un trabajo relacionado con la seguridad de la red, como pruebas de penetración, penetración web, servicios de seguridad, análisis de seguridad y otras posiciones; si aprendes bien el módulo de seguridad, también puedes trabajar como un ingeniero de seguridad El rango de salario es 6k-15k.

Hasta ahora, alrededor de un mes. Te has convertido en un "script kiddie". Entonces, ¿todavía quieres explorar más?

Amigos que quieran involucrarse en piratería y seguridad de redes, he preparado una copia para todos: 282G, el paquete de datos de seguridad de redes más completo de toda la red, ¡gratis!
Haga clic en [Tarjeta al final del artículo] para obtenerla gratis

Con estos fundamentos, si desea estudiar en profundidad, puede consultar la hoja de ruta de aprendizaje súper detallada a continuación. Aprender de acuerdo con esta ruta es suficiente para ayudarlo a convertirse en un excelente ingeniero de seguridad de red intermedio y senior:

[Hoja de ruta de aprendizaje de alta definición o archivo XMIND (haga clic en la tarjeta al final del artículo para obtenerlo)]

También hay algunos recursos de videos y documentos recopilados en el estudio, que puede tomar usted mismo si es necesario:
videos de apoyo para cada ruta de crecimiento correspondiente a la sección:


por supuesto, además de videos de apoyo, varios documentos, libros, materiales Y las herramientas también están organizadas para usted y han ayudado a todos a clasificar.

Debido al espacio limitado, solo se muestra una parte de la información. Si la necesita, puede [haga clic en la tarjeta a continuación para obtenerla gratis]

Supongo que te gusta

Origin blog.csdn.net/web2022050903/article/details/132101168
Recomendado
Clasificación