Printf inyectar 0x00

2

Al realizar una explotación de cadena de formato, ¿cómo inyecta una dirección que contiene 0x00?

#include<stdio.h>

int main(int argc,char *argv[])
{
    char buf[80];
    snprintf(buf, 79, argv[1]);
    printf(buf);
}

¿Cómo obtendría una devolución a libc si, por ejemplo, la dirección del sistema es 00112233 (Little endian)

Donde la dirección del sistema contenía un byte nulo. Para utilizar la vulnerabilidad de impresión, su entrada se pasó primero a través de snprintf, que se detuvo en la primera vez que se produjo un byte nulo.

    
pregunta robertkin 22.01.2015 - 16:15
fuente

1 respuesta

3

Es probable que primero deba habilitar la compatibilidad con el carácter% n, ya que está deshabilitado de forma predeterminada en algunos sistemas operativos. El programa vulnerable tendría que tener la siguiente declaración:

_set_printf_count_output(1);

A continuación, deberá determinar dónde está almacenada en la pila la dirección de retorno que desea sobrescribir. En este caso, podría sobrescribir la dirección de retorno de printf o main . Una de estas ubicaciones deberá sobrescribir con el valor 00112233.

Debe sobrescribir la dirección de retorno un byte a la vez generando una entrada a printf para que sea equivalente a

printf("%naaaaaaaaaaa%naaaaaaaaaaa%naaaaaaaaaaa%n",&LSB,&LSB+1,&LSB+2,&MSB);

El primer% n escribirá efectivamente un byte cero o nulo en la dirección de retorno LSB ya que el número total de caracteres que printf ha escrito en ese punto es cero. El segundo% n imprimirá el valor 11 en el segundo byte de la dirección de retorno, el tercero 22 y así sucesivamente. Lo dejo como un ejercicio para que usted elabore la carga real de buf [].

    
respondido por el Vahid 22.01.2015 - 17:14
fuente

Lea otras preguntas en las etiquetas