// gcc pwnable.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
long compute(int c) {
long i = 0;
while (c > 1) {
i++;
if (c%2 == 0) c /= 2;
else c = 3*c + 1;
}
return i;
}
int main() {
int uid = 0;
void* buffer = mmap(NULL, 0x1000, PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_PRIVATE, -1, 0);
puts("Welcome to AIC Factory Terminal.");
puts("WARNING: The power system is about to reach its capacity limit.");
puts("WARNING: To prevent draining, your power usage for this session will be limited.");
puts("Now waiting for input.");
ssize_t input_size = read(STDIN_FILENO, buffer, 0x1000);
if (input_size > 0) {
long long accu = 0;
unsigned char *buf_ptr = (unsigned char *)buffer;
for (int i = 0; i < input_size; i++) {
long cur = compute(buf_ptr[i]);
// printf("%ld %d\n", cur, buf_ptr[i]);
if (cur > 35) {
puts("Consuming too much computational power. Aborting...");
exit(1);
}
accu += cur;
}
// Length limit perhaps
if (accu > 200) {
puts("Accumulative power usage is too high. Aborting...");
exit(1);
}
} else {
puts("Error reading input.");
}
puts("Now executing...");
((void (*)(void))buffer)();
if (uid == 0x1337) {
puts("Power user detected. Granting full access...");
}
return 0;
}