Last active
June 24, 2021 18:15
-
-
Save philzook58/47a9e1d63c2b5551cc0168bb22ebf8c9 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdlib.h> | |
#include <stdio.h> | |
#include <string.h> | |
#include <time.h> | |
#define FLAG_BUFFER 128 | |
#define MAX_SYM_LEN 4 | |
typedef struct Stonks { | |
int shares; | |
char symbol[MAX_SYM_LEN + 1]; | |
struct Stonks *next; | |
} Stonk; | |
typedef struct Portfolios { | |
int money; | |
Stonk *head; | |
} Portfolio; | |
int view_portfolio(Portfolio *p) { | |
if (!p) { | |
return 1; | |
} | |
printf("\nPortfolio as of "); | |
fflush(stdout); | |
system("date"); // TODO: implement this in C | |
fflush(stdout); | |
printf("\n\n"); | |
Stonk *head = p->head; | |
if (!head) { | |
printf("You don't own any stonks!\n"); | |
} | |
while (head) { | |
printf("%d shares of %s\n", head->shares, head->symbol); | |
head = head->next; | |
} | |
return 0; | |
} | |
Stonk *pick_symbol_with_AI(int shares) { | |
if (shares < 1) { | |
return NULL; | |
} | |
Stonk *stonk = malloc(sizeof(Stonk)); | |
stonk->shares = shares; | |
int AI_symbol_len = (rand() % MAX_SYM_LEN) + 1; | |
for (int i = 0; i <= MAX_SYM_LEN; i++) { | |
if (i < AI_symbol_len) { | |
stonk->symbol[i] = 'A' + (rand() % 26); | |
} else { | |
stonk->symbol[i] = '\0'; | |
} | |
} | |
stonk->next = NULL; | |
return stonk; | |
} | |
int buy_stonks(Portfolio *p) { | |
if (!p) { | |
return 1; | |
} | |
char api_buf[FLAG_BUFFER]; | |
FILE *f = fopen("api","r"); | |
if (!f) { | |
printf("Flag file not found. Contact an admin.\n"); | |
exit(1); | |
} | |
fgets(api_buf, FLAG_BUFFER, f); | |
int money = p->money; | |
int shares = 0; | |
Stonk *temp = NULL; | |
printf("Using patented AI algorithms to buy stonks\n"); | |
while (money > 0) { | |
shares = (rand() % money) + 1; | |
temp = pick_symbol_with_AI(shares); | |
temp->next = p->head; | |
p->head = temp; | |
money -= shares; | |
} | |
printf("Stonks chosen\n"); | |
// TODO: Figure out how to read token from file, for now just ask | |
char *user_buf = malloc(300 + 1); | |
printf("What is your API token?\n"); | |
scanf("%300s", user_buf); | |
printf("Buying stonks with token:\n"); | |
printf(user_buf); | |
// TODO: Actually use key to interact with API | |
view_portfolio(p); | |
return 0; | |
} | |
Portfolio *initialize_portfolio() { | |
Portfolio *p = malloc(sizeof(Portfolio)); | |
p->money = (rand() % 2018) + 1; | |
p->head = NULL; | |
return p; | |
} | |
void free_portfolio(Portfolio *p) { | |
Stonk *current = p->head; | |
Stonk *next = NULL; | |
while (current) { | |
next = current->next; | |
free(current); | |
current = next; | |
} | |
free(p); | |
} | |
int main(int argc, char *argv[]) | |
{ | |
setbuf(stdout, NULL); | |
srand(time(NULL)); | |
Portfolio *p = initialize_portfolio(); | |
if (!p) { | |
printf("Memory failure\n"); | |
exit(1); | |
} | |
int resp = 0; | |
printf("Welcome back to the trading app!\n\n"); | |
printf("What would you like to do?\n"); | |
printf("1) Buy some stonks!\n"); | |
printf("2) View my portfolio\n"); | |
scanf("%d", &resp); | |
if (resp == 1) { | |
buy_stonks(p); | |
} else if (resp == 2) { | |
view_portfolio(p); | |
} | |
free_portfolio(p); | |
printf("Goodbye!\n"); | |
exit(0); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdint.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <unistd.h> | |
#include <fcntl.h> | |
#include <ctype.h> | |
#define FLAG_BUFFER 200 | |
#define LINE_BUFFER_SIZE 20 | |
typedef struct { | |
uintptr_t (*whatToDo)(); | |
char *username; | |
} cmd; | |
char choice; | |
cmd *user; | |
void hahaexploitgobrrr(){ | |
char buf[FLAG_BUFFER]; | |
FILE *f = fopen("flag.txt","r"); | |
fgets(buf,FLAG_BUFFER,f); | |
fprintf(stdout,"%s\n",buf); | |
fflush(stdout); | |
} | |
char * getsline(void) { | |
getchar(); | |
char * line = malloc(100), * linep = line; | |
size_t lenmax = 100, len = lenmax; | |
int c; | |
if(line == NULL) | |
return NULL; | |
for(;;) { | |
c = fgetc(stdin); | |
if(c == EOF) | |
break; | |
if(--len == 0) { | |
len = lenmax; | |
char * linen = realloc(linep, lenmax *= 2); | |
if(linen == NULL) { | |
free(linep); | |
return NULL; | |
} | |
line = linen + (line - linep); | |
linep = linen; | |
} | |
if((*line++ = c) == '\n') | |
break; | |
} | |
*line = '\0'; | |
return linep; | |
} | |
void doProcess(cmd* obj) { | |
(*obj->whatToDo)(); | |
} | |
void s(){ | |
printf("OOP! Memory leak...%p\n",hahaexploitgobrrr); | |
puts("Thanks for subsribing! I really recommend becoming a premium member!"); | |
} | |
void p(){ | |
puts("Membership pending... (There's also a super-subscription you can also get for twice the price!)"); | |
} | |
void m(){ | |
puts("Account created."); | |
} | |
void leaveMessage(){ | |
puts("I only read premium member messages but you can "); | |
puts("try anyways:"); | |
char* msg = (char*)malloc(8); | |
read(0, msg, 8); | |
} | |
void i(){ | |
char response; | |
puts("You're leaving already(Y/N)?"); | |
scanf(" %c", &response); | |
if(toupper(response)=='Y'){ | |
puts("Bye!"); | |
free(user); | |
}else{ | |
puts("Ok. Get premium membership please!"); | |
} | |
} | |
void printMenu(){ | |
puts("Welcome to my stream! ^W^"); | |
puts("=========================="); | |
puts("(S)ubscribe to my channel"); | |
puts("(I)nquire about account deletion"); | |
puts("(M)ake an Twixer account"); | |
puts("(P)ay for premium membership"); | |
puts("(l)eave a message(with or without logging in)"); | |
puts("(e)xit"); | |
} | |
void processInput(){ | |
scanf(" %c", &choice); | |
choice = toupper(choice); | |
switch(choice){ | |
case 'S': | |
if(user){ | |
user->whatToDo = (void*)s; | |
}else{ | |
puts("Not logged in!"); | |
} | |
break; | |
case 'P': | |
user->whatToDo = (void*)p; | |
break; | |
case 'I': | |
user->whatToDo = (void*)i; | |
break; | |
case 'M': | |
user->whatToDo = (void*)m; | |
puts("==========================="); | |
puts("Registration: Welcome to Twixer!"); | |
puts("Enter your username: "); | |
user->username = getsline(); | |
break; | |
case 'L': | |
leaveMessage(); | |
break; | |
case 'E': | |
exit(0); | |
default: | |
puts("Invalid option!"); | |
exit(1); | |
break; | |
} | |
} | |
int main(){ | |
setbuf(stdout, NULL); | |
user = (cmd *)malloc(sizeof(user)); | |
while(1){ | |
printMenu(); | |
processInput(); | |
//if(user){ | |
doProcess(user); | |
//} | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment