cómo compilar un exploit generado en metasploit en un programa C

0

Una vez que genere un exploit en metasploit con la etiqueta '-t c', obtendrá una matriz con un bytecode como

unsigned char buf[] = 
"\xfc\xe8\x89\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52\x30"
"\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26\x31\xff"
"\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7\xe2"
"\xf0\x52\x57\x8b\x52\x10\x8b\x42\x3c\x01\xd0\x8b\x40\x78\x85"
...snip...

Mi pregunta es ¿cómo compilas y ejecutas este bytecode en C?

    
pregunta AXANO 16.10.2016 - 17:36
fuente

1 respuesta

2

El código ya está 'compilado' código de máquina. Solo haz algo como esto en main() :

int *ret;
ret = (int *)&ret + 2;
*ret = (int) buf;

Solo asegúrate de deshabilitar la pila no ejecutable con el indicador -z execstack al compilar.

EDITAR:
Desglosando el código -

int *ret;

Estamos declarando un puntero int denominado ret como una variable local en main() . Siendo la primera y única variable, se encuentra inmediatamente debajo del puntero de marco antiguo en la pila.

ret = (int *)&ret + 2;

A continuación, agregamos 2 a la dirección del puntero ret y lo almacenamos nuevamente en ret . Si observa la figura, la dirección de retorno se encuentra exactamente 2 palabras clave por encima de ret . Básicamente, estamos almacenando la dirección de la dirección de retorno en ret .

*ret = (int) buf;

Finalmente, estamos haciendo una desreferenciación de ret para reemplazar la dirección de devolución existente con la dirección de buf (nuestro código de shell, presumiblemente declarado en forma global).

Por lo tanto,

main() regresará a buf en lugar de a donde se suponía. Los bytes en buf se interpretarán como código y se ejecutarán alegremente. Esto es lo que suele suceder en un exploit de desbordamiento de búfer de vainilla. El flujo de control se secuestra provocando un desbordamiento del búfer y sobrescribiendo la dirección de retorno con algo sobre lo que el pirata informático tiene control (generalmente código de shell inyectado).

Tenga en cuenta que los sistemas operativos modernos generalmente almacenan canarios de pila adicionales para detectar desbordamientos. Por lo tanto, el desplazamiento '2' podría no ser verdadero. Para simplificar, use el indicador -fno-stack-protector mientras compila en gcc para deshabilitar los canarios.

    
respondido por el rhodeo 16.10.2016 - 18:02
fuente

Lea otras preguntas en las etiquetas