#include <stdio.h>
int main(int argc, char** argv)
{
void (*p) (void);
/* this obviously won't work, but what string could I put in
here (if anything) to make this execute something meaningful?
Does any OS allow instructions to be read from
the stack rather than text area of the process image? */
char *c = "void f() { printf(\"Hello, world!\"); }";
p = (void (*)())c;
p();
return 0;
}
Respuesta
Sure it is posible. Buffer Overflow exploits usarlo.
Consulte Shellcode para saber qué tipo de cadenas puede colocar.
Básicamente lo que puede hacer es poner el código de la máquina en la pila y saltar a la dirección. Esto causará la ejecución (si el OS/máquina lo permite, vea NX bit).
Incluso podrías intentar hacer una memcpy desde alguna dirección de función en una cadena en la pila y luego intentar saltar a la dirección en la pila.
Más o menos, no hay eval()
en c, como en muchos lenguajes de scripting.
Sin embargo, lo que está describiendo es una especie de Buffer Overflow exploit.
Donde, utiliza una cadena para escribir "código" (no la sintaxis c, sino el código de máquina) en el espacio de direcciones después del búfer. Aquí hay un pequeño y agradable tutorial del tema.
No utilice esta información para escribir un virus :(
Hay una especie de 'eval()': escribe un compilador de C, compila la cadena en código máquina y luego ejecútalo. –
Gracias, mi intención es escribir un programa que se modifique durante la ejecución, quizás incluso de forma impredecible. Nada malicioso, solo como un ejercicio de aprendizaje. – user389094
@Chris: buen punto;) @rahul: Definitivamente una buena experiencia de aprendizaje, suena divertido :) – Stephen
Usted podría utilizar libtcc
para compilar y ejecutar el código fuente C:
const char *code = "int main(int argc, char**argv) { printf(\"Hello, world!\"); return 0; }";
TCCState *tcc = tcc_new();
if (tcc_compile_string(tcc, code))
{
// an error occurred compiling the string (syntax errors perhaps?)
}
int argc = 1;
char *argv[] = { "test" };
int result = tcc_run (tcc, argc, argv);
// result should be the return value of the compiled "main" function.
// be sure to delete the memory used by libtcc
tcc_delete(tcc);
Un coouple de cuestiones:
- Solo puede compilar
libtcc
en una arquitectura compatible. - Debe tener un
main
funciones.
- 1. es posible hacer que nant ejecute una publicación en el proyecto de aplicación web
- 2. Ejecutar código antes de que se ejecute la función llamada
- 3. ¿Es posible hacer que un método se ejecute solo una vez?
- 4. ¿es posible no devolver nada desde una función en python?
- 5. ¿Es posible hacer una coincidencia de cadena parcial en una clave de cadena de diccionario?
- 6. ¿Es posible ejecutar una cadena en MySQL?
- 7. ¿Es posible forzar que una función no esté en línea?
- 8. Es una pila falsa más rápida que una pila real
- 9. Función de llamada jQuery desde una cadena
- 10. ¿Es posible hacer referencia a una función anónima desde sí mismo en PHP?
- 11. Cifrado de una cadena con una pila
- 12. ¿Es posible reemplazar una función en php (como correo) y hacer que haga otra cosa?
- 13. Hacer LLVM en línea una función desde una biblioteca
- 14. ¿Es posible multiprocesar una función que devuelve algo en Python?
- 15. Creando una función desde cadena que hereda el ámbito principal
- 16. ¿Cómo hacer que una aplicación se ejecute continuamente en Android?
- 17. cómo hacer que jenkins ejecute un script de python que ejecute una compilación?
- 18. ¿Es posible que una aplicación de Android instale automáticamente y ejecute una actualización?
- 19. ¿Cómo hacer que el código se ejecute solo si se lanzó una excepción?
- 20. ¿Es posible que Java String.split pueda devolver una Cadena nula []
- 21. ¿Es posible escribir una función SQL que emita JSON?
- 22. ¿Es posible declarar una matriz asociativa en la función llamante?
- 23. ¿Es posible hacer que el intérprete interactivo de Python ejecute un script en carga?
- 24. ¿Es posible hacer referencia a una variable con una cadena interpolada?
- 25. ¿Es posible hacer que los objetos devueltos por una función sean inmutables en C#?
- 26. ¿Es posible definir una función local en una consulta TSQL?
- 27. ¿Es posible establecer FolderBrowserDialog.RootFolder en una ruta arbitraria desde una cadena?
- 28. ¿Es posible convertir una matriz de cadenas en una cadena?
- 29. ¿Cómo hacer que un bookmarklet se ejecute solo una vez?
- 30. ¿Es posible reemplazar una función dentro de una clase PHP?
Gracias, ¿podrían darme más información sobre cómo saltaría a la dirección después de memcpy? ¿Y qué tan grande sería un pedazo de memoria memcpy? ¿Tendría que saber cómo se representa la función en lenguaje ensamblador para eso? – user389094
Tenga en cuenta que estamos hablando de insertar código ejecutable binario aquí; no solo podrá almacenar el desbordamiento de C y esperar que el procesador conozca la WTF de la que está hablando. –
@ rahulkumar42: Puedes intentar convertir la dirección de la cadena como un puntero a la función e intentar llamarlo. Realmente no necesita saber cómo se representa la función, la máquina hará la interpretación por usted. El tamaño para copiar depende de la función que está copiando y puede ser difícil de averiguar. –