Files
2023-09-12 08:18:06 +02:00

80 lines
1.9 KiB
C

#define MAX_SIZE 32
const uint32_t a = 1103515245;
const uint32_t c = 12345;
const uint32_t m = 2147483647;
uint32_t seed = 1337;
unsigned char user_input[MAX_SIZE];
const uint32_t STATE[4] = {0x1e48add6, 0xaaa7550c, 0x18df53bf, 0xe6af1116};
uint32_t start[] = {0x0, 0x0, 0x0, 0x0};
uint32_t gen_random(void) {
seed = (uint32_t)(((uint32_t)a * (uint32_t)seed + (uint32_t)c) % m);
return (uint32_t)seed;
}
void setup() {
Serial.begin(115200);
Serial.println("==================================================");
Serial.println("= SECURE LOCK - v0.5 =");
Serial.println("==================================================");
}
int check_pass(uint32_t start[]) {
Serial.println("checking\n");
uint32_t temp = 0;
for (int i = 0; i < 4; ++i) {
temp = start[i];
temp *= (uint32_t)0xcafebeef;
temp += (uint32_t)gen_random();
temp *= (uint32_t)0xfacefeed;
temp ^= (uint32_t)gen_random();
if ((uint32_t)temp != (uint32_t)STATE[i]) {
return 0;
}
}
return 1;
}
void loop() {
memset(user_input,0,MAX_SIZE);
memset(start, 0, 16);
Serial.println("Enter your password: ");
while (Serial.available() == 0) {
delay(100);
}
Serial.readBytes(user_input, MAX_SIZE);
Serial.println();
for (int i = 0; i < 4; i++) {
start[i] |= ((uint32_t)user_input[(i * 4)] << 24);
start[i] |= ((uint32_t)user_input[(i * 4)+1] << 16);
start[i] |= ((uint32_t)user_input[(i * 4)+2] << 8);
start[i] |= ((uint32_t)user_input[(i * 4)+3] << 0);
Serial.println(start[i],HEX);
}
if (check_pass(start) == 1) {
Serial.print("Thats it!\r\nSubmit in the format FLAG{");
for (int i = 0; i < 4; i++) {
Serial.print(start[i],HEX);
}
Serial.println("}");
while (true) { delay(1000); }
}
// Failed, just spin
Serial.println("Incorrect password!");
while (true) {delay(1000); }
}