2011-10-12 5 views
10

Fondamentalmente la funzione sto sfruttando è questo:È necessario sfruttare l'overflow del buffer. Non riesci a capire come annullare lo stack dopo l'esecuzione del codice exploit?

int getbufn() 
{ 
    char buf[512]; 
    Gets(buf); 
    return 1; 
} 

Quando si esegue il programma principale la funzione esegue 5 volte e ogni volta la posizione di cambiamenti BUF e così pure la posizione di% ebp. Quello che dovrei fare è inserire un valore esadecimale specifico, consente di dire 0xFFFFFFFF, in una variabile e le principali programma controlla ogni volta per vedere se tale variabile è lì. Se lo è, si esegue di nuovo fino a quando non sono state eseguite tutte e 5 le volte e il programma esce in modo silenzioso.

Il problema che sto avendo è che proprio prima del controllo per il valore esadecimale c'è un controllo per un altro valore che è costante, diciamo 0x12345678. Se ho danneggiato 0x12345678 e non c'è, il programma esplode su di me.

Ho capito che 0x12345678 è memorizzato in -0x10 (% ebp) quindi so che è basato su% ebp e conosco l'indirizzo di% ebp ogni volta ma posso solo far funzionare l'exploit la prima volta . Lo faccio fondamentalmente nopsled-zione 496 byte e avendo questo codice macchina byte per byte:

mov 0xFFFFFFFF, %eax 
movl address old ebp, %ebp 
push correct return adress in function main 
ret 

che finisce per essere 5 parole e un byte per ritorno lungo che compilo con 0x313131 per renderlo lunga 6 parole . A questo punto la mia stringa di exploit è lunga 520 byte che è esattamente quanto il buffer è inferiore a% ebp e quindi aggiungo l'indirizzo di ebp vecchio e un indirizzo da qualche parte all'interno del mio nopsled sovrascrivendo il valore corrente in% ebp così come il ritorno indirizzo per getbufn.

Il problema è quando il programma esegue una seconda volta% ebp è in un indirizzo 0x10 inferiore al suo indirizzo precedente quindi il mio modo di non corrompere% ebp non funziona e il principale rileva che 0x12345678 non è a -0x10 (% ebp). Come faccio a interrompere% ebp?

+1

non è possibile calcolare% ebp come un offset da% esp? Cioè ripristino% non EBP con un 'movl' di un indirizzo immediato, ma copiando% esp in% ebp e l'aggiunta di un offset su di esso? – pmdj

+0

Quali flag del compilatore stai usando, quale compilatore. Puoi fornire il programma completo e il codice di exploit? – Stellarator

+3

Una scuola che dà tampone sfrutta i compiti di casa ... Rispetto! –

risposta

5

pmjordan ha ragione, dovresti essere in grado di calcolare dove% ebp è in relazione a% esp. Ricorda,% esp è il tuo attuale puntatore stack e% ebp è dove il puntatore dello stack era per la funzione precedente. Invece di avere un% ebp statico, devi avere uno dinamico calcolato da% esp (o in realtà solo guardando ciò che è memorizzato nella memoria situata in% esp offset dalle variabili stack). Il codice pseudo sarebbe qualcosa di simile:

  1. calcolare l'offset di% ebp da% esp
  2. leggere il valore memorizzato in quella posizione di memoria e conservare per se stessi
  3. fare il vostro exploit
  4. ripristinare il vecchio valore di% ebp memorizzato nella fase 2
  5. ret