Attacco di overflow del buffer

1

Sto imparando gli attacchi di buffer overflow e una cosa che non sono in grado di capire è che nella maggior parte dei sistemi operativi uno stack potrebbe non essere necessariamente un blocco contiguo di memoria nella memoria fisica. se è vero, allora come può un overflow sovrascrivere gli altri dati nello stack?

    
posta Manvendra Singh 26.02.2017 - 18:33
fonte

2 risposte

2

Lo stack potrebbe non essere fisicamente contiguo ma logicamente contiguo. Se il puntatore restituito dalla funzione è logicamente di 20 byte o 2000 byte sopra il puntatore dello stack corrente, è sufficiente compensare una scrittura della quantità corretta per distruggerla. Lo stack deve sempre essere logicamente contiguo per funzionare correttamente.

Un problema molto più grande per gli sfruttatori moderni è che le pagine dello stack dovrebbero essere contrassegnate come non eseguibili. Le sole pagine contrassegnate come eseguibili dovrebbero essere le pagine di codice (programma) e quelle dovrebbero essere contrassegnate come non modificabili. Questo non sconfigge tutti gli attacchi di overflow dello stack, ma sconfigge quelli "classici".

    
risposta data 27.02.2017 - 06:42
fonte
3

La mappatura logica per l'indirizzo fisico viene eseguita dalla segmentazione e dalle unità di paging della CPU. Un processo (che significa sia il tuo programma che qualsiasi codice malevolo che viene eseguito nel suo spazio indirizzo) non conosce questa mappatura; vedono uno spazio di indirizzamento continuo, anche se lo spazio di indirizzamento potrebbe non essere mappato a regioni continue di memoria fisica da parte dell'unità di cercapersone.

Il tuo esempio non funziona, perché la dimensione della pagina, almeno su x86, è almeno di 4k. Quindi non possiamo avere un limite di pagina tra 0x100 e 0x104. Questi indirizzi si assocerebbero alla stessa memoria fisica, perché si troverebbero nella stessa pagina.

Tuttavia, ciò non importa, perché anche se il tuo codice dannoso ha scritto dati su un limite di pagina, ciò non avrebbe magicamente disattivato l'unità di paging; al contrario, l'unità di paging tradurrebbe l'indirizzo virtuale nell'indirizzo fisico dell'altra pagina.

È davvero piuttosto semplice. Supponendo che abbiamo a che fare con pagine 4k, le pagine iniziano con indirizzi fisici con gli ultimi 12 bit azzerati.

Gli ultimi 12 bit di qualsiasi indirizzo virtuale sono un offset in una pagina. Gli altri bit di un indirizzo vengono utilizzati per identificare la pagina in una tabella di pagina multistrato, che a sua volta memorizza l'indirizzo fisico della pagina.

Un programma in esecuzione (e che include qualsiasi codice malevolo in esecuzione nello stesso spazio indirizzo) non può scrivere direttamente agli indirizzi fisici; qualsiasi indirizzo fornito dalle istruzioni della macchina è considerato un indirizzo virtuale e finisce sempre per essere tradotto dalla segmentazione e dall'unità di paging della CPU, quindi il "gap" tra 0x1000 e 0x2000 che si percepisce non esiste per il programma.

    
risposta data 26.02.2017 - 20:07
fonte

Leggi altre domande sui tag