Jump to content

2 posts in this topic

Recommended Posts

Posted

/* Welcome freedom fighter. The liberation front has gained access to the

* source code for a wire transfer program used by FIRST NATIONAL CYBER, a

* bank used by the alliance for oppression and we need you to find a

* vulnerability in this program and stea... er liberate the funds from an

* operative named prince_john.

*

* The bank programmers have attempted to put in a number of defense checks

* to prevent abuse of the bank wire network, but we suspect that deadlines

* and corporate training programs have left them without the motivation

* required to think of every possibility.

*

* It is imperative that you find a way to drain the account completely

* otherwise they may be able to withdraw the remaining funds and go

* underground before we can finish tracking them in the physical world.

*

* Good luck and as always, should you be detected your actions will be

* blamed on the Chinese Government.

*

* ~~~0xDEADFEED~~~

*

* To build and run the wire transfer program:

*

* $ cc -o wire_transfer wire_transfer.c

* $ ./wire_transfer

*

*/

 

#include <stdbool.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

 

#define MAXLEN 255

 

typedef struct Account {

int balance;

char owner[MAXLEN];

} Account;

 

Account *init_account(const char *name, int balance);

bool wiretransfer(Account *source, Account *dest, int amount);

void display_balance(Account *account);

void exit_if(bool condition, const char *message);

void validate_heist(Account *target);

 

int main(int argc, const char *argv[])

{

unsigned int transfer_amount;

char input[MAXLEN];

 

printf("----- WELCOME TO FIRST CYBER BANK -----\n");

printf("username: robin_hood\n");

printf("password: *****************\n");

printf("Logged In Successfully!\n");

printf("account> wiretransfer prince_john\n");

printf("----- BEGIN WIRE TRANSFER SETUP -----\n");

 

Account *yours = init_account("robin_hood", 10000);

Account *theirs = init_account("prince_john", 500000);

 

display_balance(yours);

display_balance(theirs);

 

while (true) {

printf("Amount to transfer from your account to theirs: ");

fgets(input, sizeof(input), stdin);

transfer_amount = strtoul(input, NULL, 10);

 

if ((long)transfer_amount > 0) {

break;

}

 

printf("Invalid transfer amount!\n");

}

 

printf("----- ATTEMPTING WIRE TRANSFER -----\n");

printf("Wire transfer status: ");

printf("%s\n", wiretransfer(yours, theirs, transfer_amount) ? "SUCCESS" : "FAILURE");

 

display_balance(yours);

display_balance(theirs);

validate_heist(theirs);

 

free(yours);

free(theirs);

 

return 0;

}

 

Account *init_account(const char *name, int balance)

{

Account *account = malloc(sizeof(Account));

exit_if(account == NULL, "Problem allocating memory");

 

if (account != NULL) {

strncpy(account->owner, name, sizeof(account->owner) - 1);

account->balance = balance;

}

 

return account;

}

 

bool wiretransfer(Account *source, Account *dest, int amount)

{

if (source == NULL || dest == NULL) return false;

if (source->balance - amount < 0) return false;

if (dest->balance + amount < 0) return false;

 

source->balance -= amount;

dest->balance += amount;

return true;

}

 

void display_balance(Account *account)

{

if (account == NULL) return;

printf("%s has $%d in their account.\n", account->owner, account->balance);

}

 

void exit_if(bool condition, const char *message)

{

if (condition) {

perror(message);

exit(EXIT_FAILURE);

}

}

 

void validate_heist(Account *target)

{

if (target->balance == 0) {

printf("Target funds liberated: You win ;)\n");

} else {

printf("Target still has operating funds, try again.\n");

}

}

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
  • Create New...

Important Information

We would like to place cookies on your device to help make this website better. The website cannot give you the best user experience without cookies. You can accept or decline our cookies. You may also adjust your cookie settings. Privacy Policy - Guidelines