Sto provando a sfruttare un file binario che ho accesso al codice sorgente.
int flag = 0;
int main() {
char buf[0x50];
puts("Who are you? ");
printf("> ");
fgets(buf, 0x50, stdin);
printf(buf);
if (flag == 1337) {
puts("Enjoy your shell!");
system("/bin/sh");}
else {
puts("Not allowed");
}
return 0;
}
Come puoi vedere dal codice sorgente, se flag è 1377 otterrò una shell. Posso vederlo anche con gdb.
0x4007ec <main+175> mov eax, DWORD PTR [rip+0x200892] # 0x601084 <flag>
0x4007f2 <main+181> cmp eax, 0x539
Le misure di sicurezza sono configurate in questo modo:
Canary : Yes
NX : Yes
PIE : No
Fortify : No
RelRO : Partial
Quindi, prima di tutto non posso fare il classico overflow del buffer perché il programma usa fgets
per raccogliere input. Ovviamente c'è anche il canarino, ma non farà del male perché se potessi cambiare il valore del flag (prima che fosse fatto l'assegno di Canary) avrei avuto successo nell'ottenere quel guscio. Non so se quello che sto pensando è giusto, quindi per favore correggimi se sbaglio.
La mia prima conclusione è stata che non sarei stato in grado di sfruttare buf
per riscrivere il valore del flag. (Supponevo che buf
e flag
fossero posizionati uno accanto all'altro nello stack). Penso di aver ragione su questo perché quando ho dato un'occhiata al $rsp
registrati e ho scoperto che solo la quantità consentita di "A" è stata messa in pila. Quindi anche se il flag fosse posizionato proprio sotto di esso, il valore del flag non verrebbe sovrascritto. Ho ragione finora? Questa sarebbe la mia prima domanda
0x7fffffffdaf0: 0x41414141 0x41414141 0x41414141 0x41414141
0x7fffffffdb00: 0x41414141 0x41414141 0x41414141 0x41414141
0x7fffffffdb10: 0x41414141 0x41414141 0x41414141 0x41414141
0x7fffffffdb20: 0x41414141 0x41414141 0x41414141 0x41414141
0x7fffffffdb30: 0x41414141 0x41414141 0x41414141 0x00414141
0x7fffffffdb40: 0x00400840 0x00000000 0x96703f00 0x948afed7
0x7fffffffdb50: 0xffffdc40 0x00007fff 0x00000000 0x00000000
Quindi, come potrei essere in grado di valutare tale valore? Penso che l'exploit debba provenire dal payload fornito da un utente malintenzionato ma buf
è l'unico modo per ottenere quel payload nello stack. Dal momento che non riesco a sovrascrivere i registri facendo traboccare buf
sono un po 'perso.