
[ Home | Liste | F.A.Q. |
Risorse | Cerca... ]
Archivio: Aprile 2003 ml@sikurezza.org Soggetto: Re: advanced buffer overflow study Mittente: Angelo Dell'Aera Data: 13 Apr 2003 16:49:09 -0000
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
On Wed, 9 Apr 2003 20:22:49 +0200 (CEST)
Marco Ivaldi <raptor@0xdeadbeef.info> wrote:
>PS. Mi manca abo8.c, qualcuno ha idee su come (ed in che condizioni)
>sia possibile exploitarlo? ;)
Ho condotto qualche indagine su abo8.c e sembra che non sia
exploitabile o almeno non in maniera standard. Inoltre, la causa del
segmentation fault sembrerebbe nient'altro che una violazione dei
limiti di pagina. Infatti, dando un'occhiata al codice della strcpy
(preso dalle glibc-2.2.5), si legge questo.
char *
strcpy (dest, src)
char *dest;
const char *src;
{
reg_char c;
char *__unbounded s = (char *__unbounded) CHECK_BOUNDS_LOW (src);
const ptrdiff_t off = CHECK_BOUNDS_LOW (dest) - s - 1;
size_t n;
do
{
c = *s++;
s[off] = c;
}
while (c != '\0');
n = s - src;
(void) CHECK_BOUNDS_HIGH (src + n);
(void) CHECK_BOUNDS_HIGH (dest + n);
return dest;
}
Si vede che la copia avviene tramite quell'offset off. Da un'analisi
con gdb risulta che in %ecx viene memorizzato off mentre in %eax va
il carattere da copiare (vedi prima istruzione asm sotto) e in %edx
l'indirizzo src.
Il ciclo per fare la copia è il seguente
0x804cb40 <strcpy+32>: movzbl (%edx),%eax
0x804cb43 <strcpy+35>: inc %edx
0x804cb44 <strcpy+36>: test %al,%al
0x804cb46 <strcpy+38>: mov %al,(%ecx,%edx,1)
0x804cb49 <strcpy+41>: jne 0x804cb40 <strcpy+32>
e si vede che soltanto %edx viene incrementato di 1 per ogni char da
copiare. Ora la cosa che si può facilmente testare è che abo8
restituisce un segmentation fault quando gli viene passato un numero
di caratteri in ingresso superiore a un certo valore (dipendente anche
dalle opzioni utilizzate). Ciò che mi ha permesso di capire qualcosa
in più è che la strcpy(), superata la fatidica soglia, crasha sempre
sulla stessa istruzione ossia su questa.
s[off] = c;
Ora è evidente che l'unica operazione critica in questa istruzione è
valutare l'indirizzo a cui scrivere c. Ho condotto qualche test e ho
notato che sulla mia macchina ho sempre questa situazione con stringhe
di "A" di diversa lunghezza (oltre la soglia sopra citata).
0x80aeff8: 0x41414141
(gdb)
0x80aeffc: 0x41414141
(gdb)
0x80af000: 0x00000000
Si vede che all'indirizzo 0x80af000 non viene scritto nulla sebbene in
teoria ciò dovrebbe accadere. Fatti due conti coi registri al momento
del SIGSEGV, i conti tornano. Ora, se si assume una dimensione della
pagina pari a 4KB, si trova che 0x80af000/4096 = 32943 ossia questo è
il primo byte di una nuova page frame. Essa non fa parte dell'address
space del processo da cui il SIGSEGV.
IMHO non è semplice (o non è possibile?) exploitare questo codice
anche perchè non essendo il buffer inizializzato non esiste neanche la
possibilità di raggiungere .dtors in quanto il buffer dovrebbe essere
in .bss. Inoltre, a quanto stavo notando, in quella pagina non
sembrerebbe esserci nulla di particolarmente interessante da
sovrascrivere (e questo lo conferma anche il fatto che se si usa come
input una stringa di lunghezza minore anche di un solo byte rispetto a
quella che serve per bypassare i limiti della pagina il programma esce
senza battere ciglio). Forse, se ci fosse qualche altra variabile e/o
puntatore interessante dietro il buffer, qualcosa la si potrebbe anche
fare ma, in questa situazione, personalmente non vedo soluzioni.
Tutto questo IMHO naturalmente. :)
Alla prossima,
Angelo Dell'Aera 'buffer'
Emails : <buffer@antifork.org>
<buffer@users.sourceforge.net>
PGP information in e-mail header
Antifork Research, Inc.
http://www.antifork.org
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)
iD8DBQE+mYzlpONIzxnBXKIRAr+XAKCgZTiQRj/mcXBXiTbU5RfaqJn2qACgs6PO
rZ3GVFSEhgHIXQcJOnCtcf4=
=1Jnn
-----END PGP SIGNATURE-----
________________________________________________________
http://www.sikurezza.org - Italian Security Mailing List
[ Home | Liste | F.A.Q. |
Risorse | Cerca... ]
www.sikurezza.org - Italian Security Mailing List
(c) 1999-2005