Estoy intentando realizar un ataque de cadena de formato simple en este programa:
#include <stdio.h>
int main(int argc, char *argv[])
{
printf(argv[1]);
}
No tengo ningún problema en filtrar la pila de la forma habitual al pasar una cadena de formato como esta:
./test "%x %x %x %x"
o con acceso directo a parámetros como este:
./test "%4\$x"
A continuación, estoy tratando de averiguar la ubicación (el parámetro nth) de la cadena de formato en la pila de esta manera:
for ((i = 1; i < 200; i++)); do echo -n "$i " && ./test "AAAAAAAA%$i\$x" 0; done | grep 4141
Una vez que sepa el valor de $i
(digamos 134) donde aparece la cadena "AAAA ...", debería poder leer direcciones arbitrarias como esta:
./test $'\xaa\xbb\xcc\xdd%134\$s'
Supongo que es la forma tradicional de filtrar información a través de un error de cadena de formato (como se describe en El manual de Shellcoder ).
Sin embargo, la cadena de formato que estoy pasando no está bien empaquetada en un parámetro discreto $i
th (no tengo una mejor manera de expresarlo). Curiosamente, la mitad está presente en 133 (palabra superior) y la mitad en 134 (palabra inferior). ¿Cómo se supone que debo pasar direcciones arbitrarias como se mencionó anteriormente en esta situación? Supongo que tengo que usar un tipo diferente de formato para obtener la dirección exacta, pero no estoy seguro de cómo proceder.
También, ./test $'\xaa\xbb\xcc\xdd%134$s'
, simplemente imprime el equivalente ascii de esos valores hexadecimales. El argumento no funciona exactamente como debe (espero que quede claro en lo que estoy tratando de lograr aquí). ¿Cuál es la forma correcta de pasar estas direcciones?
Si ayuda, estoy en Ubuntu12 i386 y uso Bash.