Ho uno snippet di codice con la classica vulnerabilità strcpy
int main(int argc, char argv[][]){
char buffer[8];
strcpy(buffer, argv[1]);
}
Disassemblando il file binario, possiamo vedere rsp
è diminuito di 0x10
byte ( =16
)
Quindi possiamo effettivamente sovrascrivere rbp
dopo 16 byte e restituire l'indirizzo dopo 24 byte. Prima che la funzione ritorni, rax
punta verso l'inizio del nostro shellcode.
Ecco il mio approccio per attaccare il programma. Il nostro shellcode sarà nel seguente formato
"A"*16 + "B"*8 + "C"*8
Poiché ASLR è abilitato, ho sostituito l'indirizzo di ritorno a un indirizzo di jmpq *%rax
, quindi il carico utile ora diventerà
"A"*16 + "B"*8 + "\x77\x04\x40"
e passando in gdb, posso vedere che l'esecuzione è diretta all'inizio di "A". Tuttavia, il buffer è troppo piccolo per inserire uno shellcode ( system(/bin/sh)
). Cosa dovrei fare qui?
Ecco cosa sto pensando:
-
Utilizza l'approccio egghunter. Tuttavia, non sono in grado di inviare più di 24 byte di dati all'applicazione, poiché l'indirizzo di ritorno include byte nulli, termina il mio shellcode.
-
Trova uno shellcode più piccolo di 24 byte per Linux a 64 bit. (Immagino che questo non sia possibile)
-
approccio ROP, tuttavia, ASLR è abilitato, non riesco a capire l'indirizzo di base di libc
Ho letto molti tutorial e molti di loro hanno un buffer grande come char buffer[500]
invece char buffer[8]
. Sarà fantastico se qualcuno mi guidi nel posto giusto.