Al compilar con:
gcc -m32 -fno-pie -no-pie -g bof.c -fno-stack-protector -z execstack -o bof32
Puedo sobrescribir la dirección de retorno con casi cualquier valor, excepto una dirección de retorno válida.
Cuandointentoutilizarunadirecciónderetornoválida,elúltimobytesesobrescribeconalgodiferente,como0xffffd8fe,obtengounadirecciónincorrecta...
Entonces,loqueestoypreguntandoesqueaunquehayacerradolaproteccióndelapila,latartadeapagadoylaejecuciónhabilitadadelapila,tambiénpuseelASLRdelkernela0,¿hayalgunaotrarazónporlaqueestopodríacausarunerrorparacontrolarcompletamenteelEIP?
AquíestáelCódigo.Noteestoypidiendoqueresuelvasestopormí,soloteestoypidiendounconsejosobreporquéestoactúadelamaneraenquelohace.
#include<stdio.h>#include<stdlib.h>#include<string.h>voidvalidate(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;
}
Nota: en caso de que esto importe mi sistema es x86_64 y compilé el binario como x86, este programa tiene badchars que son "\ x09 \ x0a \ x0b \ x0c \ x0d \ x20", y la estructura de la carga útil es la siguiente . payload="A" * 132 + ret + 28byteshellcode + "A" * 44.