Utilicé un programa simple para probar y aprender desbordamientos basados en la pila. Este es mi programa:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
char buffer[256];
if(argc !=2)
exit(0);
printf("%p\n",buffer);
strcpy(buffer,argv[1]);
printf("%s\n",buffer);
return 0x00;
}
y con algunos cálculos descubrí la longitud y el orden de mi carga útil:
264 * 'A' + RIP (6bytes) + Shellcode
Conocimiento:
- RIP no puede ser más grande que "0x00007fffffffffff"
- El valor previsto de RIP es "0x61FD50"
- La carga útil no puede contener "0x00"
Entonces, si mi código de shell es algo así como 200 * 'C' y usa la carga inferior para el argumento de la línea de comandos de mi programa, será como:
264 * 'A' + "\ x61 \ xFD \ x50" [:: - 1] +200 * 'C'
pero cuando veo el RIP del depurador es igual a "4015db". Sé que esto sucede porque la carga útil tiene 3 bytes para RIP pero RIP necesita 8 bytes para sobrescribirse, por lo que utilizará mis 3 bytes ("\ x61 \ xFD \ x50") más 5 bytes de 'C' y se volvió más grande que "0x00007fffffffffff". ¿Cómo puedo forzar que tome solo 3 bytes algo así como:
"\ x00 \ x00 \ x00 \ x00 \ x00 \ x61 \ xFD \ x50" [:: - 1]
en mi carga útil? Estoy usando python para escribir mi carga y subprocess.call ("bof.exe" + payload) para ejecutarlo. La versión es Windows 10 (x64) P.S: Estoy usando MingW64 y este comando para compilar mis códigos c ++:
g ++ -Wall -fexceptions -fno-stack-protector bof.cpp -o bof.exe
Gracias en avanzado