Últimamente he estado practicando ataques de cadena de formato y pensé que sabía cómo funcionaba, pero después de horas de investigación no logré obtener los resultados esperados.
Hice un programa de ejemplo que tiene un búfer lleno y un búfer explotable de cadena de formato:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv)
{
char buf[50] = { 0 };
memset(&buf[0], 'A', 49);
printf("Data: '%s'\n", &buf[0]);
printf(argv[1]);
return 0;
}
gcc a.c -fno-stack-protector
Por alguna razón, cuando lo ejecuto con el exploit de cadena de formato, obtengo solo el 25% de A
en lugar del total de 49 completado gracias a la llamada memset
.
$ ./a.out "'python -c 'print "%08x " * 30''"
Data: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
00000002 17d37780 7fffffc7 00000000 0000003a ca18d548 00000000 41414141 41414141 41414141 41414141 41414141 41414141 ca180041 0d423100 00400680 17991830 00000000 ca18d548 17f60ca0 004005d6 00000000 c642cb54 004004e0 ca18d540 00000000 00000000 63a2cb54 e492cb54 00000000
Además, he estado intentando recuperar el A
individualmente yendo carácter por carácter, pero parece fallar después de cierta cantidad:
$ ./a.out "'python -c 'print "%08x " * 7 + "%c" * 25''"
Data: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
00000002 225e2780 7fffffc7 00000000 0000003a 5264fb08 00000000 AAAAAAA�������
¿Por qué el primer comando solo imprime aproximadamente la mitad del número de A
s esperado?
¿Por qué el segundo comando no imprime el A
s después de una cierta cantidad?
Gracias.