Explotación de formato de cadena

4

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

    
pregunta Timo89 27.12.2016 - 12:51
fuente

1 respuesta

2

Los especificadores de conversión - a, A, e, E, f, F, g, or G - para argumentos dobles largos se pueden usar para obtener 64 bits a la vez.

Básicamente, printf("%a") obtendrá 64 bits de la pila y los convertirá en una constante de punto flotante hexadecimal.

Más información sobre constantes de punto flotante hexadecimal - enlace

    
respondido por el Timo89 28.12.2016 - 20:10
fuente

Lea otras preguntas en las etiquetas