Explicación del código C

¿Alguien podría ayudarme a explicar estas líneas de código?

char code[] = "paste your shellcode here"; int main(int argc, char **argv) { int (*func)(); func = (int (*)()) code; (int)(*func)(); } 

El código que tiene aquí es un ejemplo de cómo crear un puntero de función para un segmento de datos arbitrario y luego invocarlo.

En un sentido muy simple, estamos asignando una matriz de bytes (char []) en la que se pega la carga útil del shellcode binario, normalmente como valores hexadecimales escapados.

Esta línea, int (*func)(); , declara un puntero a función que devolverá un entero. Esto es típico porque la mayoría del código tendrá algún tipo de código de salida basado en enteros devuelto en EAX.

Esta línea, func = (int (*)()) code; convierte el código de la matriz de bytes para que sea un puntero de función y lo asigna a ‘func’, el puntero de función definido previamente.

Esta línea (int)(*func)(); en realidad llama al shellcode, transfiriendo la ejecución a la primera ubicación de memoria en la matriz de bytes.

Este código es realmente extremadamente útil. No esperaría encontrarlo usado para explotar un sistema; en su lugar, este código se utiliza para probar, depurar y experimentar con Shellcode durante el desarrollo. Usándolo, simplemente puede pegar el código shell que está intentando probar y luego ejecutarlo. Esto le permite mantener su shellcode muy simple, excluyendo todos los requisitos típicos para un ejecutable independiente completo, y al mismo tiempo le permite probarla sin necesidad de que identifique una vulnerabilidad para explotar. De esta manera, puede saber si el código funciona sin distraerse con los diversos que surgen al intentar explotar el código real.

¿Has intentado buscar en Google para “pegar tu shellcode aquí” ? El primer segundo resultado (ahora que esta pregunta es la primera LOL) devuelto es el tutorial de escritura Exploit del Corelan Team, parte 9: Introducción al código de shell Win32, donde se explica todo:

Shellcode Lab

En pocas palabras, es simplemente una pequeña aplicación de utilidad C para probar shellcode que se usará más adelante en las siguientes partes del tutorial para este mismo propósito. El rest se explica en el tutorial.