L'esecuzione dello shellcode nell'heap porta a segfault

0

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
    
posta Joris 13.04.2018 - 21:17
fonte

0 risposte

Leggi altre domande sui tag