Buffer Overflow: calcolo dell'indirizzo di memoria su 64 bit

3

Ho un compito in cui devo sfruttare una vulnerabilità di overflow del buffer su una macchina remota. Ho solo permesso di eseguire il programma, quindi non posso usare gdb. Sono riuscito a prendere il controllo dello strappo e posso con successo traboccare e scrivere il mio indirizzo. Il mio shellcode è pronto (ha stack eseguibile e ASLR disabilitato) ma non riesco a trovare l'indirizzo giusto da restituire. Si tratta di una macchina a 64 bit, quindi l'imbottitura nop non è un'opzione. L'obiettivo principale è accedere a un file di registro che l'eseguibile aggiorna ogni volta che viene eseguito. (è un incarico universitario non preoccuparti di azioni illegali)

Che cosa posso fare? C'è un modo per calcolare l'indirizzo di memoria del buffer, o in un altro modo? Qualsiasi aiuto sarebbe apprezzato

    
posta George Sp 29.05.2017 - 10:35
fonte

1 risposta

3

Se sei fimble con gdb e puoi controllare rip, allora sei ad un passo dalla soluzione.

Facciamo un piccolo esempio

void main() {
  char* buff = "asdf";
}

compilalo

$ gcc test.c

e quindi usa il debugger

$ gdb a.out
 (gdb) set disassembly-flavor intel
(gdb) disassemble main
Dump of assembler code for function main:
 0x00000000004004d6 <+0>:   push   rbp
 0x00000000004004d7 <+1>:   mov    rbp,rsp
 0x00000000004004da <+4>:   mov    QWORD PTR [rbp-0x8],0x400574
 0x00000000004004e2 <+12>:  nop
 0x00000000004004e3 <+13>:  pop    rbp
 0x00000000004004e4 <+14>:  ret    
End of assembler dump.

Quindi il nostro buff variabile è in rbp-0x8 nello stack. Se ASLR disabilitato - l'indirizzo è sempre lo stesso. Puoi ottenerlo con:

(gdb) break *0x00000000004004e2
Breakpoint 1 at 0x4004e2
(gdb) r
Starting program: ./a.out 
Breakpoint 1, 0x00000000004004e2 in main ()
(gdb) p $rbp-0x8
$1 = (void *) 0x7fffffffdbd8
    
risposta data 29.05.2017 - 12:01
fonte

Leggi altre domande sui tag