Ho usato un semplice programma per testare e imparare gli overflow basati sullo stack questo è il mio programma:
#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;
}
e con alcuni calcoli ho scoperto la lunghezza e l'ordine del mio carico utile:
264 * 'A' + RIP (6bytes) + Shellcode
Conoscenza:
- RIP non può essere più grande di "0x00007fffffffffff"
- Il valore previsto per RIP è "0x61FD50"
- Il payload non può contenere "0x00"
Quindi se il mio shellcode è qualcosa come 200 * 'C' e uso sotto payload per l'argomento della mia linea di comando del programma, sarà come:
264 * 'A' + "\x61\xFD\x50"[::-1]+200 * 'C'
ma quando guardo il debugger RIP equivale a "4015db". So che questo accade perché il payload ha 3 byte per RIP ma RIP ha bisogno di 8 byte da sovrascrivere, quindi userà i miei 3 byte ("\ x61 \ xFD \ x50") più 5 byte di "C" e diventerà più grande di "0x00007fffffffffff". Come posso costringerlo a prendere solo 3 byte qualcosa come:
"\x00\x00\x00\x00\x00\x61\xFD\x50"[::-1]
nel mio carico utile? Sto usando python per scrivere il mio payload e subprocess.call ("bof.exe" + payload) per eseguirlo. Os è Windows 10 (x64) P.S: Sto usando MingW64 e questo comando per compilare i miei codici c ++:
g++ -Wall -fexceptions -fno-stack-protector bof.cpp -o bof.exe
Grazie in anticipo