#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;
}
risposta
Certo che è possibile. Buffer Overflow exploits usarlo.
Vedere Shellcode per quale tipo di stringhe è possibile inserire.
Fondamentalmente ciò che si può fare è mettere il codice macchina nello stack e saltare all'indirizzo. Ciò causerà l'esecuzione (se il sistema operativo/macchina lo consente, vedere NX bit).
Si potrebbe anche provare a fare una memcpy da qualche indirizzo di funzione su una stringa in pila e quindi provare a saltare all'indirizzo in pila.
Un po ', ma non proprio, non c'è eval()
in c, come in molti linguaggi di scripting.
Tuttavia, quello che stai descrivendo è una specie di Buffer Overflow exploit.
Dove, si utilizza una stringa per scrivere "codice" (non sintassi c, ma codice macchina) nello spazio indirizzo dopo il buffer. Ecco un bel piccolo tutorial dell'argomento.
Non utilizzare queste informazioni per scrivere un virus :(
Esiste un 'eval()' di tipo: scrivi un compilatore C, compila la stringa in codice macchina, quindi eseguila. –
Grazie, la mia intenzione è di scrivere un programma che si modifica durante l'esecuzione, forse anche in modo imprevedibile. Niente di pericoloso, proprio come un esercizio di apprendimento. – user389094
@Chris: buon punto;) @rahul: Sicuramente una buona esperienza di apprendimento, sembra divertente :) – Stephen
Si potrebbe utilizzare libtcc
per compilare ed eseguire il codice sorgente 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 di questioni:
- È possibile compilare solo
libtcc
su un'architettura supportata. È necessario disporre dimain
funzioni.
- 1. È possibile eseguire una stringa in MySQL?
- 2. Stampa ed eseguire una stringa
- 3. È possibile eseguire una funzione sull'inizializzazione in c?
- 4. È possibile eseguire una corrispondenza di stringa parziale su una chiave di stringa del dizionario?
- 5. È possibile eseguire una sequenza di assemblaggio x86 da C#?
- 6. È possibile eseguire una sottoquery con Sequelize.js?
- 7. È possibile eseguire BitBlt direttamente da una bitmap GDI +?
- 8. È possibile eseguire una stringa di codice Java in fase di runtime in Android?
- 9. Come eseguire una funzione fitness
- 10. Come eseguire una funzione quando una richiesta XMLHttpRequest è completa?
- 11. È possibile compilare un codice groovy da eseguire in JRE?
- 12. È possibile eseguire UPnP Discovery da Javascript?
- 13. Come eseguire la funzione una volta?
- 14. È possibile utilizzare una lingua diversa da VBScript per eseguire a livello di codice test QTP?
- 15. tsql: è possibile eseguire istruzioni caso nidificate in una selezione?
- 16. È possibile eseguire più AsyncTask nello stesso tempo?
- 17. Come eseguire il codice che si trova in una stringa?
- 18. Come eseguire iterazioni su una stringa
- 19. È possibile eseguire un'attività SSIS da .net?
- 20. È possibile eseguire una funzione ogni volta che viene creata una matrice?
- 21. Attendi prima di attivare una funzione da eseguire in JavaScript
- 22. È possibile configurare Heroku per eseguire una distribuzione senza problemi?
- 23. sqlite3.Warning: È possibile eseguire una sola istruzione alla volta
- 24. test se è possibile eseguire il cast di una stringa come numero intero in VB.NET
- 25. È possibile archiviare segreti nello stack in java?
- 26. Come eseguire il codice php da file_get_contents o file in una funzione
- 27. Come è possibile eseguire una ricerca a livello di codice senza utilizzare un'API?
- 28. rstudio - è possibile eseguire un codice in background
- 29. è possibile forzare una routine di go da eseguire su una CPU specifica?
- 30. È possibile eseguire una riduzione su un array con openmp?
Grazie, potresti approfondire un po 'su come vorrei passare all'indirizzo dopo memcpy? E quanto dovrebbe essere grande un pezzo di memoria? Dovrei sapere come viene rappresentata la funzione nel linguaggio assembly per quello? – user389094
Nota che stiamo parlando di inserimento di codice eseguibile binario qui: non sarai in grado di bufferizzare l'overflow C e aspettarti che il processore sappia del WTF di cui stai parlando. –
@ rahulkumar42: puoi provare a trasmettere l'indirizzo della stringa come puntatore a una funzione e provare a chiamarlo. Non hai davvero bisogno di sapere come viene rappresentata la funzione, la macchina farà l'interpretazione per te. La dimensione da copiare dipende dalla funzione che stai copiando e potrebbe essere difficile da scoprire. –