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