HTB Global Cyber Skill Benchmark 2025
We’re back at it with another CTF writeup. As now I’m a working professional, I’m eligible to take part in the HTB Global Cyber Skill Benchmark 2025
under Team ProCheckUp. In this CTF, we were placed 141/796 within the competition. It’s actually quite impressive, considering only like 5 of us are playing the CTF. I had the the chance to solve challenges of different categories (ML,RE,Forensics,ICS,Crypto) but I won’t be covering everything in this writeup. Here are some of the challenges I found interestingly fun.
ML: UPLINK ARTIFACTS
This challenge falls under the Machine Learning category. It presents a CSV file with a bunch of floating numbers and thats about it. So knowing it’s ML challenge, it has something to do with the floats, which is either rounding up and convert it into text, or graph plotting (Yes, graph plotting it is). So, after trying out the first approach to convert the content to text, which of course didn’t work, I went to graph plotting method. One of the most useful library for this use case in python is the Python pandas library that mainly used for data analysis, that allows data manipulation, and matplotlib which has the graph plotting feature.
This challenge is a bunch of trial and error on the graph plotting. By scripting out (with help of some AI) different views and type of data visualizing methods, I was able to get an idea of which approach I can take.
As you can see on the graph generated, The red dots assembles a squarish shape, which gives me an idea that It might not be plaintext directly for the flag, but a QR code embedded. After noticing that, I start to only focus on the red dots, which were identified as 'label 1' floats value
within the CSV file. I then proceed to plot the graph with only label 1's value
and ignore the rest and it got me a QR, but not scannable yet.
I know everything was correct, just need to make it scannable and then we’re done. So I quickly use AI to improve the script by rounding up the values and rendering it to make it scannable.
Working Script:
1 | import numpy as np |
Output: Final QRCode
Flag: HTB{clu5t3r_k3y_l34k3d}
RE: TINYPLATFORMER
I don’t normally look at reverse engineering, cuz I know I’m bad at it. BUT, special scenario like if its mobile reversing or GAME HACKING
, then we go! This challenge provide players with a no extension file
named TinyPlatformer
. So quickly i just went to check the file type, x64 executable, so I just run and see what it is before actually working on the challenge. It’s basically a platformer game, that requires the player to collect the coins within a short period of time to pass the level.
But after level 1, its impossible to pass level 2 (idk…maybe skill issue). So I just close the game and only now I notice that it was built through PyGame:
1 | └─$ ./TinyPlatformer |
At this point I’m like OH YEA OK GOOD
my small research on game development and game hacking after WGMY24 have a good influence here hahaha. So now I got to working. First step is to unpack this application. I used one of python standalone library call pyinstxtractor that extracts the content within the PyInstaller.
1 | └─$ ls TinyPlatformer_extracted |
After extracting it, there are alot of pyc (python compiled) files
that are basically non-readable bytecodes. We will focus on getting the main.pyc content as I assumed that’s where all the important codes are. So what we can do now is to convert the byte codes into readable codes using uncompyle6 and leak the code. I faced some installation issue within my vm and wasn’t sure what happened but in the end I just installed and run it within python virtual environment.
1 | └─$ python3 -m venv venv && source venv/bin/activate && uncompyle6 main.pyc |
And there it is, the main code of the game. The important part of the code that I notice was the
1 | COLLECTIBLES = [ |
The COLLECTIBLES array
shows the location of the collectibles (the coins) that should be collected to win the game. But the game also have a code that does not just give you the flag directly. To solve the challenge, we must collect the coin in correct order to get the secret flag. The order you collect them matters as the game tracks this in player.secret
function. When you finish, it checks if your collection order satisfies all the conditions.
For example in Level 1, if you label collectibles 0-5:You must collect #0 after #2, #1 before #4 and #2 after #5.
If the order is incorrect, the game will not generate the correct key to decrypt the flag.
Hence, I just build a script to help me find the correct collection order in order to get the key and decrypt the flag.
1 | from itertools import permutations |
output:
1 | [*] Starting solver... |
Flag: HTB{pl4tf0rm3r_r3vv1ng}
HTB Global Cyber Skill Benchmark 2025
https://w0rmhol3.netlify.app/2025/05/28/HTB-Global-Cyber-Skills-Benchmark/