2010-07-11 14 views
8
#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

2

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.

+0

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

+0

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. –

+0

@ 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. –

8

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 :(

+2

Esiste un 'eval()' di tipo: scrivi un compilatore C, compila la stringa in codice macchina, quindi eseguila. –

+0

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

+0

@Chris: buon punto;) @rahul: Sicuramente una buona esperienza di apprendimento, sembra divertente :) – Stephen

5

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:

  1. È possibile compilare solo
  2. libtcc su un'architettura supportata. È necessario disporre di main funzioni.
Problemi correlati