Cómo invocar execve en C sin nombrar la función

Fuentes: How to call execve in C without naming the function

En entornos de evaluación automatizada de código en C, los sistemas de corrección suelen restringir el uso de funciones específicas para detectar plagio o errores de sintaxis. Un desafío técnico surge cuando se requiere ejecutar código arbitrario mediante la llamada al sistema execve, pero el compilador prohíbe el nombre explícito de la función. La solución técnica descrita en el artículo se basa en la manipulación de direcciones de memoria y la ejecución de código no seguro.

El problema principal es que execve es una función dinámica cargada desde la librería C estándar (libc), por lo que su dirección de memoria varía aleatoriamente debido a la Randomización del Layout del Espacio de Direcciones (ASLR). Dado que no se puede acceder a la dirección estática de execve, el autor propone una técnica de filtración de offsets. Se aprovecha la presencia de otras funciones permitidas en el mismo segmento de memoria, como printf o mmap, para calcular la distancia fija entre ellas. Una vez obtenido este offset, se puede reconstruir la dirección de execve.

Para ejecutar el código resultante, el artículo detalla el uso de mmap con permisos de escritura y ejecución (W^X) para crear una página de memoria ejecutable. Se inyecta código en ensamblaje x86 que realiza llamadas al sistema Linux, permitiendo invocar execve indirectamente. Este enfoque demuestra cómo las restricciones de seguridad pueden ser explotadas mediante técnicas de ingeniería inversa y manipulación de memoria, ofreciendo una alternativa técnica para resolver ejercicios de programación avanzados donde la ejecución de shell es requerida.