15// gcc pwnable.c 10#10include15 15 10#10include15 15 10#10include15 15 10#10include15 15 10#10include15 15 10long15 07compute(10int15 c)15 { 15 10long15 i15 =15 020; 15 02while15 (c15 >15 021)15 { 15 i++; 15 02if15 (c%02215 ==15 020)15 c15 /=15 022; 15 02else15 c15 =15 023*c15 +15 021; 15 } 15 02return15 i; } 10int15 07main()15 { 15 10int15 uid15 =15 020; 15 10void*15 buffer15 =15 mmap(10NULL,15 020x1000,15 PROT_WRITE15 |15 PROT_EXEC,15 MAP_ANON15 |15 MAP_PRIVATE,15 02-1,15 020); 15 puts(05"05Welcome to AIC Factory Terminal.05"); 15 puts(05"05WARNING: The power system is about to reach its capacity limit.05"); 15 puts(05"05WARNING: To prevent draining, your power usage for this session will be limited.05"); 15 puts(05"05Now waiting for input.05"); 15 10ssize_t15 input_size15 =15 read(STDIN_FILENO,15 buffer,15 020x1000); 15 02if15 (input_size15 >15 020)15 { 15 10long15 10long15 accu15 =15 020; 15 10unsigned15 10char15 *buf_ptr15 =15 (10unsigned15 10char15 *)buffer; 15 02for15 (10int15 i15 =15 020;15 i15 <15 input_size;15 i++)15 { 15 10long15 cur15 =15 compute(buf_ptr[i]); 15 15// printf("%ld %d\n", cur, buf_ptr[i]); 15 02if15 (cur15 >15 0235)15 { 15 puts(05"05Consuming too much computational power. Aborting...05"); 15 exit(021); 15 } 15 accu15 +=15 cur; 15 } 15 15// Length limit perhaps 15 02if15 (accu15 >15 02200)15 { 15 puts(05"05Accumulative power usage is too high. Aborting...05"); 15 exit(021); 15 } 15 }15 02else15 { 15 puts(05"05Error reading input.05"); 15 } 15 puts(05"05Now executing...05"); 15 ((10void15 (*)(10void))buffer)(); 15 02if15 (uid15 ==15 020x1337)15 { 15 puts(05"05Power user detected. Granting full access...05"); 15 } 15 02return15 020; }