Tengo el siguiente escenario: se llama a printf con una cadena de 20 bytes (19 caracteres + 0x00) que controlo. La cadena no puede contener n, s, S y $.
Mi objetivo es omitir un strcmp con un valor aleatorio (ya sea utilizando el exploit para leer el valor aleatorio o para modificar ese valor)
Esto es lo que se ve la pila antes de printf Se llama:
0xffffcf90: 0xffffcfb8 - this points to my input string
0xffffcf94: 0xffffd00c - this points to the bytes I have to guess
0xffffcf98: 0x00000001
0xffffcf9c: 0x00f0b6ff
0xffffcfa0: 0xffffcfde
0xffffcfa4: 0x00000001
0xffffcfa8: 0x000000c2
0xffffcfac: 0xffffd00c
0xffffcfb0: 0xffffcfde
0xffffcfb4: 0x00000013
0xffffcfb8: 0x61616161 - this is where my input string is located
0xffffcfbc: 0x61616161
0xffffcfc0: 0x61616161
0xffffcfc4: 0x61616161
0xffffcfc8: 0x00616161 - end of input string
0xffffcfcc: 0x594e1600
0xffffcfd0: 0x00000000
0xffffcfd4: 0xffffd074
0xffffcfd8: 0xffffd028
0xffffcfdc: 0x08048944
0xffffcfe0: 0xffffd00c
0xffffcfe4: 0x0000002f
0xffffcfe8: 0xf7e17dc8
0xffffcfec: 0xf7fbf000
0xffffcff0: 0x00008000
0xffffcff4: 0xf7fbb000
0xffffcff8: 0xf7fb9244
0xffffcffc: 0xffffd0d4
0xffffd000: 0x00000001
0xffffd004: 0x00000000
0xffffd008: 0x00000000
0xffffd00c: 0x5f526b6c - start of the bytes I have to guess
0xffffd010: 0xb5a551b9
0xffffd014: 0x29a9bfd5
0xffffd018: 0x00f8b9d0
0xffffd01c: 0x594e1600 - end of the bytes I have to guess
0xffffd020: 0xf7fbb3dc
0xffffd024: 0xffffd040
0xffffd028: 0x00000000
0xffffd02c: 0xf7e23637
Dado que 0xffffd00c
está en la pila, %s
habría solucionado fácilmente mi problema; sin embargo, no puedo usar %s
o %S
. No puedo usar $
, así que el acceso directo a los parámetros está fuera de la cuestión. Y no puedo usar %n
por lo que no puedo anular la cadena que tengo que adivinar para que sea más fácil.
Si uso use %p%p%p%p%p%p%p%p%p
, esto me dará datos entre 0xffffcf94
y 0xffffcfb4
Intenté que %llu
obtuviera 64 bits, pero mi entrada solo contiene 19 caracteres.
Por lo que sé sobre los formatos de cadena, %s
es el único que trata el parámetro como un puntero, y me da lo que está en la dirección representada por el valor, no el valor. %p
solo genera el valor como un puntero, y me da 0xFFFFFFFF
en lugar de FFFFFFFF
(como %x
)
Este escenario es parte de un desafío de wargame y la vulnerabilidad del formato de cadena es una de las debilidades encontradas. No estoy 100% seguro de que este es el camino a seguir, así que me pregunto si me falta algo cuando se trata de explotaciones de formato de cadena (dadas las restricciones que tengo), antes de explorar otros escenarios