Print Stack Canary
Ingrandire lo stack stampato
Immagina una situazione in cui un programma vulnerabile a un overflow dello stack può eseguire una funzione puts che punta a una parte dell'overflow dello stack. L'attaccante sa che il primo byte del canary è un byte nullo (\x00
) e il resto del canary sono byte casuali. Quindi, l'attaccante può creare un overflow che sovrascrive lo stack fino al solo primo byte del canary.
Successivamente, l'attaccante chiama la funzionalità puts nel mezzo del payload che stamperà tutto il canary (eccetto il primo byte nullo).
Con queste informazioni, l'attaccante può creare e inviare un nuovo attacco conoscendo il canary (nella stessa sessione del programma).
Ovviamente, questa tattica è molto limitata poiché l'attaccante deve essere in grado di stampare il contenuto del suo payload per esfiltrare il canary e quindi essere in grado di creare un nuovo payload (nella stessa sessione del programma) e inviare il vero buffer overflow.
Esempi CTF:
64 bit, ASLR abilitato ma nessun PIE, il primo passo è riempire un overflow fino al byte 0x00 del canary per poi chiamare puts e leakarlo. Con il canary viene creato un gadget ROP per chiamare puts per leakare l'indirizzo di puts dalla GOT e un gadget ROP per chiamare
system('/bin/sh')
32 bit, ARM, no relro, canary, nx, no pie. Overflow con una chiamata a puts su di esso per leakare il canary + ret2lib chiamando
system
con una catena ROP per pop r0 (arg/bin/sh
) e pc (indirizzo di system)
Lettura Arbitraria
Con una lettura arbitraria come quella fornita dalle stringhe di formato potrebbe essere possibile leakare il canary. Controlla questo esempio: https://ir0nstone.gitbook.io/notes/types/stack/canaries e puoi leggere su come abusare delle stringhe di formato per leggere indirizzi di memoria arbitrari in:
Format StringsQuesta sfida abusa in modo molto semplice di una stringa di formato per leggere il canary dallo stack
Last updated