Flagyard
Table of Contents
Pwn: Babyauth
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *secret;
__attribute__((noreturn))
void fatal(const char *msg) {
printf("[-] %s\n", msg);
exit(1);
}
__attribute__((constructor))
void setup(void) {
setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
if (!(secret = getenv("SECRET")))
fatal("App secret is not set");
}
void getval(const char *msg, long *v) {
printf("%s", msg);
if (scanf("%ld%*c", v) != 1)
fatal("I/O Error");
}
void getstr(const char *msg, char *s, int len) {
printf("%s", msg);
if (!fgets(s, len, stdin))
fatal("I/O Error");
s[strcspn(s, "\n")] = '\0';
}
int main() {
int is_admin, len;
char *password;
is_admin = 0;
// Integer overflow here at getval, enter 60000000000 and we are able to overflow the is_admin variable to turn it into 1 without having to enter the correct password. Why 60000000000? I figured it out by trial and error in gdb.
getval("length: ", (long*)&len);
if (!(password = (char*)malloc(len + 1)))
fatal("Memory Error");
getstr("password: ", password, len); //
if (strcmp(secret, password) == 0)
is_admin = 1;
free(password);
if (is_admin == 1) {
puts("[+] Authenticated");
system("/bin/sh");
} else {
puts("[-] Authentication failed");
}
return 0;
}
Flag: FlagY{tYp3_c0nfUs10n_m4k3s_a_b4D_r3sULt}