La ejecución de shellcode en el montón conduce a segfault

0

Durante los últimos días, he pasado demasiado tiempo tratando de resolver un desafío de desbordamiento de búfer, pero me quedé atascado y no puedo descubrir por qué.

La situación es la siguiente: tengo un binario (Linux x86_64) que carga, descifra y descomprime una carga útil. Primero, los datos se almacenan en el montón, pero la descompresión también (de manera poco segura) copia los datos a la pila.

Llegué a un punto en el que tengo Shellcode en el montón y he sobrescrito la dirección de retorno al inicio de ese Shellcode. En gdb, puedo confirmar que la IP realmente salta a la instrucción de shellcode correcta ( xor rax,rax ). Pero cuando paso más (así se ejecuta xor ), obtengo un error de seguridad.

Esta es la salida de info proc mappings justo antes del salto al shellcode:

Mapped address spaces:

      Start Addr           End Addr       Size     Offset objfile
        0x400000           0x401000     0x1000        0x0 myfile
        0x401000           0x40d000     0xc000     0x1000 myfile
        0x60c000           0x60e000     0x2000     0xc000 myfile
        0x60e000           0x617000     0x9000        0x0 [heap]
  0x7fffff7df000     0x7ffffffdf000   0x800000        0x0 [stack]
  0x7ffffffdf000     0x7ffffffe0000     0x1000        0x0 [vdso]

El salto es a 0x60e0ae . Así que eso debería estar en el montón, ¿verdad?

Pensé que el fallo de seguridad podría ocurrir porque se llamó a free() en el búfer. Sin embargo, si dejo que gdb omita la llamada a free() , todavía obtendré el segfault. Así que pensé que ese no puede ser el problema.

¿Hay algo obvio que me esté perdiendo de por qué obtengo la falla de seguridad?

Editar: La salida solicitada de maintenance info sections :

[0]     0x00400120->0x00400123 at 0x00000120: .init ALLOC LOAD READONLY CODE HAS_CONTENTS
[1]     0x00400130->0x0040a652 at 0x00000130: .text ALLOC LOAD READONLY CODE HAS_CONTENTS
[2]     0x0040a652->0x0040a655 at 0x0000a652: .fini ALLOC LOAD READONLY CODE HAS_CONTENTS
[3]     0x0040a660->0x0040b684 at 0x0000a660: .rodata ALLOC LOAD READONLY DATA HAS_CONTENTS
[4]     0x0040b688->0x0040c0ec at 0x0000b688: .eh_frame ALLOC LOAD READONLY DATA HAS_CONTENTS
[5]     0x0060cfe8->0x0060cff0 at 0x0000cfe8: .init_array ALLOC LOAD DATA HAS_CONTENTS
[6]     0x0060cff0->0x0060cff8 at 0x0000cff0: .fini_array ALLOC LOAD DATA HAS_CONTENTS
[7]     0x0060cff8->0x0060d000 at 0x0000cff8: .jcr ALLOC LOAD DATA HAS_CONTENTS
[8]     0x0060d000->0x0060d0f8 at 0x0000d000: .data ALLOC LOAD DATA HAS_CONTENTS
[9]     0x0060d100->0x0060db38 at 0x0000d0f8: .bss ALLOC
[10]     0x00000000->0x0000002d at 0x0000d0f8: .comment READONLY HAS_CONTENTS
    
pregunta Joris 13.04.2018 - 21:17
fuente

0 respuestas

Lea otras preguntas en las etiquetas