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?
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
Quali flag del compilatore stai usando, quale compilatore. Puoi fornire il programma completo e il codice di exploit? – Stellarator
Una scuola che dà tampone sfrutta i compiti di casa ... Rispetto! –