Quali exploit sono possibili in linguaggi come C / C ++ diversi dagli errori di overflow? [chiuso]

0

So che i programmi C / C ++ sono molto suscettibili agli errori di overflow che portano al compromesso del programma. Ma mi stavo chiedendo, ci sono altre vulnerabilità che possono esistere oltre agli errori di overflow? Sono a conoscenza di riferimenti a puntatori pendenti, spenti di errori interi e interi, ma esiste un modo diverso dall'utilizzare errori di overflow per sfruttare programmi? Se sì, quindi suggerire alcune letture e riferimenti. Grazie

    
posta user148898 18.07.2017 - 13:41
fonte

1 risposta

1

Poiché C (e C ++ che può essere tecnicamente considerato un'aggiunta a C) è vicino all'Assemblea, Gran parte dei dettagli del processore devono essere modellati e controllati all'interno delle sue costruzioni. L'esempio più semplice che mostra questo è il bug di overflow dell'indice dell'array.  Questo bug comporta l'uso improprio di un indice di array in modo tale da recuperare un pezzo di memoria che non è stato assegnato a detto array.

int[2] arrayX;
printf(arrayX[3]);

Un compilatore appropriato si lamenterà nel blocco di codice in alto circa l'indice al di fuori dell'ambito poiché un'analisi statica del codice lo mostra già. Puoi anche utilizzare array creati dinamicamente che sono sconosciuti da quando sono in fase di compilazione e non verrà dato alcun avviso.

Ora, quando si inserisce una funzione si assegna efficacemente un indirizzo di ritorno del codice nello stack. così come le posizioni per il ritorno "oggetto" nella stessa pila. Questo stack è chiamato call stack e non deve essere manipolato dal programma in normali operazioni.

Con entrambe queste meccaniche possiamo "ingannare" un programma per far funzionare il nostro codice. facciamo questo aggiungendo le istruzioni del processore su una locazione di memoria nota e manipolando lo stack di chiamate per cambiare il puntatore di ritorno al mio blocco di codice iniettato. (questo è chiamato codice di iniezione).

Questo comportamento può essere attivato da un errore di overflow o da qualche altra meccanica per regolare lo stack di chiamate, questo dipende dal sistema operativo in uso e dall'hardware in uso, ed è il modo principale in cui gli exploit funzionano.

Esistono tuttavia degli exploit che sfruttano le chiamate di livello inferiore rispetto a C (fondamentalmente iniettando codice macchina / assembly nel codice del programma).

In C ++ ci sono metodi aggiuntivi per aggiungere codice a un'applicazione, attraverso l'utilizzo (o l'abuso) delle meccaniche di caricamento della classe.

Se vuoi conoscere questi concetti ti suggerirei di apprendere su metasploit. Leggendo come funziona C in dettaglio (la bibbia è un buon inizio) e prova a leggere i documenti del compilatore GCC.

    
risposta data 18.07.2017 - 14:30
fonte