overflow del buffer dello stack nella funzione principale? [chiuso]

7

Sto cercando di sfruttare una vulnerabilità di overflow basata sullo stack. Tutti gli esempi che riesco a trovare utilizzano però un indirizzo ret . L'overflow del buffer che ho trovato si trova all'interno della funzione principale e non riesco a trovare alcun esempio su come farlo.

Il codice è simile a questo:

int main(){
   while (1){
   //some code
      switch() {
         case 0:
         char id[128];
         sscanf(buffer,"%s", id);
         break;
      }
   }
}

Il contenuto del buffer è controllato dall'utente.

    
posta Noah Goldsmid 21.04.2015 - 14:07
fonte

1 risposta

14

Ti sei imbattuto nella parte più difficile dello sfruttamento di un buffer overflow: determina come ottenere il codice da eseguire. L'iniezione di codice è banale una volta trovata la vulnerabilità, ma facendo in modo che la CPU inizi ad eseguire quel codice, non tanto.

Senza una strong comprensione di impilamento del layout dei riquadri , troverai il resto difficile da seguire.

Un punto di nota è che in C, main , dal punto di vista del processo, è solo un'altra funzione che viene chiamata (questo è diverso in C ++ vedi commento sotto). Mentre lo si pensa come l'inizio dell'esecuzione, per la CPU è una chiamata a funzione completa con un indirizzo di ritorno nello stack. Quindi sfruttare un difetto in main equivale a sfruttare un difetto in qualsiasi altra funzione.

Come attaccante, tutto ciò che puoi fare con un buffer overflow è scrivere nella sezione dati del processo, devi trovare un modo per fare in modo che il processo legga qualcosa dai dati che controllano ciò che verrà eseguito. Fondamentalmente, hai bisogno di un posto nella memoria dei dati in cui il processo cercherà di determinare cosa deve essere eseguito successivamente (cioè: per determinare il valore del contatore del programma o del PC).

Il tipo più comune di posizioni nella memoria di dati che influisce sul PC è il puntatore di ritorno di una funzione. Al ritorno da una funzione, la CPU leggerà il puntatore di ritorno fuori dallo stack e imposterà il PC su di esso (o l'istruzione successiva - dettagli sulla CPU). A meno che tu non ritorni dalla funzione main è molto improbabile che tu esegua un attacco riuscito. Avrai bisogno di un po 'di spazio nei dati, preferibilmente sullo heap, in cui il processore leggerà i dati utilizzati per impostare il PC.

Gli altri luoghi "comuni" (molto meno comuni) nella memoria di dati utilizzati per sfruttare un attacco di overflow del buffer sono i puntatori di funzione seguiti da una chiamata di funzione e tabelle delle eccezioni seguite da un'eccezione. Nessuno di questi sembra applicabile alla tua applicazione. Quindi probabilmente hai una vulnerabilità di overflow del buffer dello stack non sfruttabile. Il peggio che sospetto che tu possa fare è mandare in crash la tua app.

I passaggi che l'utente malintenzionato deve compiere per uno sfruttamento dell'overflow del buffer stack standard sono:

  1. Identifica la vulnerabilità di overflow del buffer dello stack.
  2. Determina l'indirizzo dello stack al momento della vulnerabilità.
  3. Determina l'indirizzo del puntatore di ritorno della funzione nel frame dello stack corrente.
  4. Scrivi codice (spesso chiamato shellcode ) per l'attacco.
  5. Crea un input che carica il codice e modifica la funzione return pointer to point a shellcode on stack.

Quindi, ora che hai trovato la vulnerabilità, devi determinare l'indirizzo dello stack per la chiamata a main . Il modo più semplice per farlo è stampare l'indirizzo di id . Successivamente, la posizione del puntatore di ritorno. È probabile che due parole siano più in memoria di id . Qualcosa come (char *)id-2*sizeof(int) .

Il prossimo passo è scrivere il tuo shellcode. Ti suggerirei di creare una funzione nel tuo programma che stampi la stringa "attacco riuscito" e quindi esca. Rendi il tuo shellcode una chiamata a questa funzione.

Adesso siediti e impagina i dati nello stack (questo layout dello stack frame dovrebbe aiutare) incluso un indirizzo di ritorno che salta al buffer della variabile id . Converti i dati dello stack in ASCII e inseriscilo nel programma.

Questa pagina ha un esempio più concreto di ciò che ho descritto.

    
risposta data 21.04.2015 - 17:47
fonte

Leggi altre domande sui tag