Negli ultimi giorni ho passato troppo tempo a cercare di risolvere una sfida di buffer-overflow, ma mi sono bloccato e non riesco a scoprire perché.
La situazione è la seguente: Ho un binario (Linux x86_64) che carica, decodifica e decomprime un carico utile. Innanzitutto, i dati vengono archiviati nell'heap, ma anche la decompressione (non sicura) copia i dati nello stack.
Sono arrivato a un punto in cui ho shellcode nell'heap e ho sovrascritto l'indirizzo di ritorno all'inizio dello shellcode. In gdb, posso confermare che l'IP salta effettivamente all'istruzione shellcode corretta ( xor rax,rax
). Ma quando passo ulteriormente (quindi il xor
viene eseguito), ottengo un segfault.
Questo è l'output di info proc mappings
appena prima del salto allo 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]
Il salto è a 0x60e0ae
. Quindi dovrebbe essere nel mucchio, giusto?
Ho pensato che il segfault potrebbe verificarsi perché free()
è stato chiamato sul buffer. Tuttavia, se lascio gdb saltare la chiamata a free()
, ottengo comunque il segfault. Quindi ho capito che non può essere il problema.
C'è qualcosa di ovvio che mi manca sul perché ottengo il segfault?
Modifica: l'output richiesto di 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