
+ Reversing, Rebuilding, and Failing Better: My Cyber Security Challenge Belgium Qualifier Experience +
+I tackled buffer overflows, reversed Android apps, cracked crypto puzzles, and …
+diff --git a/assets/images/blog/blog-1.jpg b/assets/images/blog/blog-1.jpg
index 2fcaedc..d2a9a28 100644
Binary files a/assets/images/blog/blog-1.jpg and b/assets/images/blog/blog-1.jpg differ
diff --git a/assets/images/blog/blog-2.jpg b/assets/images/blog/blog-2.jpg
index d2a9a28..2fcaedc 100644
Binary files a/assets/images/blog/blog-2.jpg and b/assets/images/blog/blog-2.jpg differ
diff --git a/assets/images/blog/post-2/binexpl.png b/assets/images/blog/post-2/binexpl.png
new file mode 100644
index 0000000..0ee5464
Binary files /dev/null and b/assets/images/blog/post-2/binexpl.png differ
diff --git a/assets/images/blog/post-2/infiniteluck.png b/assets/images/blog/post-2/infiniteluck.png
new file mode 100644
index 0000000..60c4a72
Binary files /dev/null and b/assets/images/blog/post-2/infiniteluck.png differ
diff --git a/assets/images/blog/post-2/infiniteluck_solved.png b/assets/images/blog/post-2/infiniteluck_solved.png
new file mode 100644
index 0000000..9bc32bd
Binary files /dev/null and b/assets/images/blog/post-2/infiniteluck_solved.png differ
diff --git a/assets/images/blog/post-2/ourencissec.png b/assets/images/blog/post-2/ourencissec.png
new file mode 100644
index 0000000..3ddd3bd
Binary files /dev/null and b/assets/images/blog/post-2/ourencissec.png differ
diff --git a/content/blog/post-1.md b/content/blog/post-1.md
index 8c2dbeb..adcd495 100644
--- a/content/blog/post-1.md
+++ b/content/blog/post-1.md
@@ -1,6 +1,6 @@
---
title: "Cyber Defence on the Digital Frontline: A Mission with NATO"
-image: "images/blog/blog-2.jpg"
+image: "images/blog/blog-1.jpg"
date: "2025-05-13 00:00:00 +0000 UTC"
description: "An inside look into Howest’s participation in NATO’s world-leading cyber defence exercise, Locked Shields."
categories: ["cybersecurity", "event recap"]
@@ -27,7 +27,7 @@ The exercise required more than technical fixes. It demanded communication with
#### The Black Team: Rapid Response in Action
-A new but powerful presence in the simulation was the Black Team, a rapid-response unit deployed when problems became too complex for any single team. Acting like special forces, they jumped in when incidents crossed team boundaries or demanded unconventional solutions. Their mission was to find out what was happening, assess the impact and suggest fast, creative responses. Introduced just last year, this team quickly proved its value again in 2025. They even embraced the role with style — “you can wear sunglasses inside” became their unofficial motto.
+A new but powerful presence in the simulation was the Black Team, a rapid-response unit deployed when problems became too complex for any single team. Acting like special forces, they jumped in when incidents crossed team boundaries or demanded unconventional solutions. Their mission was to find out what was happening, assess the impact and suggest fast, creative responses. Introduced just last year, this team quickly proved its value again in 2025. They even embraced the role with style “you can wear sunglasses inside” became their unofficial motto.
Their presence underlined a critical lesson: not every problem fits neatly within a team’s silo. Real-world defence requires flexibility, speed and lateral thinking.
diff --git a/content/blog/post-2.md b/content/blog/post-2.md
new file mode 100644
index 0000000..75e7578
--- /dev/null
+++ b/content/blog/post-2.md
@@ -0,0 +1,85 @@
+---
+title: "Reversing, Rebuilding, and Failing Better: My Cyber Security Challenge Belgium Qualifier Experience"
+image: "images/blog/post-2/binexpl.png"
+date: "2025-03-15 00:00:00 +0000 UTC"
+description: "I tackled buffer overflows, reversed Android apps, cracked crypto puzzles, and solved a 'one-in-a-million' guessing game, but the challenge that stuck with me was rebuilding a fragmented DEX in memory."
+categories: ["cybersecurity", "CTF", "education"]
+draft: false
+---
+
+# Reversing, Rebuilding, and Failing Better: My Cyber Security Challenge Belgium Qualifier Experience
+
+On March 14 and 15, I joined the Cyber Security Challenge Belgium qualifiers with three teammates. For two days, we threw ourselves at CTF challenges covering binary exploitation, Android reversing, cryptography, and more.
+
+What follows is a recap of the challenges I personally worked on, some I solved, some I didn’t—but all of them left me with new skills and new ideas.
+
+#### A Buffer Overflow to Warm Up
+
+One of the first challenges I picked involved a binary with a basic stack overflow. I used standard techniques, finding the offset, hijacking the return address, and injecting shellcode. Tools like `pwntools` helped automate the payload crafting. It was a great warm-up and a confidence boost once it worked.
+
+{{< image src="images/blog/post-2/binexpl.png" caption="Binary Exploitation Flag" alt="alter-text" height="425" width="860" position="center" command="fit" option="q100" class="img-fluid" title="Binary Exploitation Flag" >}}
+
+#### OurEncIsSec: Zip Bombs and OEIS
+
+Then there was a more elaborate cryptography challenge: 18 zip files, each password-protected. We cracked the first three passwords using John the Ripper and got numeric values from them. I searched the sequence in OEIS and found it matched [A007408](https://oeis.org/A007408), which gave us the full pattern of passwords.
+
+Using this, I could extract all zip contents automatically, reconstruct the password-protected message, and finally reveal the flag.
+
+{{< image src="images/blog/post-2/ourencissec.png" caption="Picture of the solution" alt="alter-text" height="425" width="860" position="center" command="fit" option="q100" class="img-fluid" title="OurEncIsSec being cracked" >}}
+
+#### Infinite Luck: One in a Million?
+
+One challenge involved “guessing” a thousand random numbers between 1 and 10. The banner claimed it required infinite luck, but of course, the randomness was seeded. After inspecting the generator, I realized it was deterministic. By precomputing seeds and output sequences, I could match the challenge’s banner to a specific seed and regenerate the entire solution.
+
+
+
+{{< image src="images/blog/post-2/infiniteluck.png" caption="Challange picture" alt="alter-text" height="425" width="860" position="center" command="fit" option="q100" class="img-fluid" title="Binary Exploitation Flag" >}}
+{{< image src="images/blog/post-2/infiniteluck_solved.png" caption="Correct number order" alt="alter-text" height="425" width="860" position="center" command="fit" option="q100" class="img-fluid" title="Binary Exploitation Flag" >}}
+
+
+
+#### Android Reversing: FRIDA and JADX
+
+Several APKs were part of the qualifier set. I used JADX to decompile them and FRIDA to patch logic at runtime. In one challenge, I bypassed license validation by forcing key methods to return true and unlocking hidden functionality.
+
+#### The Challenge That Stuck with Me: Rebuilding a Split DEX
+
+This one stood out.
+
+The app used a 4×8 button grid. Pressing buttons loaded a sequence of `blockXX` files from assets. These were concatenated in-memory and passed into `InMemoryDexClassLoader` to load a class called `be.dauntless.flag.Flag`.
+
+```java
+Class loadClass = new InMemoryDexClassLoader(ByteBuffer.wrap(byteArrayOutputStream.toByteArray()), getClassLoader())
+ .loadClass("be.dauntless.flag.Flag");
+````
+
+Each `block` was a fragment of a DEX file, but the app didn’t tell you the right order. I tried manually inspecting the fragments, identifying methods, string constants, and offsets—to infer how to reassemble the full file. I got close, but didn’t crack it in time.
+
+That challenge stuck with me because it combined static analysis, runtime introspection, and logic reconstruction. It wasn’t just technical, it was creative.
+
+#### The One That Got Away: TLS Fingerprinting
+
+Another challenge involved a Go-based TLS server that rejected all client connections unless they matched a specific fingerprint. I used Go’s `tls.Config` to replicate the version, cipher suites, and ALPN:
+
+```go
+tls.Config{
+ MinVersion: tls.VersionTLS13,
+ CipherSuites: []uint16{
+ tls.TLS_AES_128_GCM_SHA256,
+ // ...
+ },
+ NextProtos: []string{"h2"},
+}
+```
+
+Despite that, the server still refused the connection. I suspect it was using JA4 or similar TLS fingerprinting techniques we couldn’t fully emulate. We had to move on, but I’d love to revisit that one someday.
+
+#### Final Thoughts
+
+I didn’t solve everything. But that wasn’t the point. Every challenge was a practical puzzle, something to decode, reverse, bypass, or just understand a little better.
+
+Working as a team with Evarist, Nathan, and Waut made it even more valuable. We bounced ideas off each other, divided tasks, and got a much broader set of challenges covered.
+
+The Cyber Security Challenge Belgium qualifiers weren’t easy. But they were the best kind of difficult, the kind that teaches you something whether you solve the problem or not.
+
+
diff --git a/content/project/project-2.md b/content/project/project-2.md
index db985f2..3161069 100644
--- a/content/project/project-2.md
+++ b/content/project/project-2.md
@@ -67,13 +67,13 @@ rc-service nginx start
rc-update add nginx
```
-Now my Hugo site is live and served directly as static files—no backend, no database, just HTML, CSS, and JS.
+Now my Hugo site is live and served directly as static files, no backend, no database, just HTML, CSS, and JS.
I tackled buffer overflows, reversed Android apps, cracked crypto puzzles, and …
### Why Alpine + Hugo?
-Alpine Linux is minimal and fast, perfect for serving static sites with low resource usage. Combined with Hugo’s speed and flexibility, I get a complete, performant setup that I fully control. It’s secure, lightweight, and easy to update—just rebuild and re-upload the `public/` folder.
+Alpine Linux is minimal and fast, perfect for serving static sites with low resource usage. Combined with Hugo’s speed and flexibility, I get a complete, performant setup that I fully control. It’s secure, lightweight, and easy to update, just rebuild and re-upload the `public/` folder.
diff --git a/hugo_stats.json b/hugo_stats.json
index cadc941..035ff57 100644
--- a/hugo_stats.json
+++ b/hugo_stats.json
@@ -77,6 +77,11 @@
"btn",
"btn-outline-primary",
"btn-primary",
+ "caption-Binary-Exploitation-Flag",
+ "caption-Challange-picture",
+ "caption-Correct-number-order",
+ "caption-OurEncIsSec-Screenshot",
+ "caption-Picture-of-the-solution",
"caption-an-image-caption",
"card",
"card-body",
@@ -263,14 +268,25 @@
"warning"
],
"ids": [
+ "a-buffer-overflow-to-warm-up",
+ "android-reversing-frida-and-jadx",
+ "android-reversing-with-frida-and-jadx",
"architecture-overview",
"banner",
+ "binary-exploitation-finding-the-overflow",
"blockquote",
"blog",
+ "caption-Binary Exploitation Flag",
+ "caption-Challange picture",
+ "caption-Correct number order",
+ "caption-OurEncIsSec Screenshot",
+ "caption-Picture of the solution",
"caption-an image caption",
"code-and-syntax-highlighting",
"contact",
"creating-the-hugo-site",
+ "cryptography-and-pattern-matching",
+ "cryptography-guessing-seeds",
"customization",
"cyber-defence-on-the-digital-frontline-a-mission-with-nato",
"drmdtool",
@@ -282,6 +298,7 @@
"final-thoughts",
"firstName",
"five-things-i-took-away",
+ "from-android-reversing-to-broken-tls-my-experience-at-the-cyber-security-challenge-belgium-qualifiers",
"from-the-battlefield-to-the-classroom",
"goals-and-use-case",
"heading-1",
@@ -296,6 +313,7 @@
"human-factors-and-growth",
"image",
"index-page",
+ "infinite-luck-one-in-a-million",
"inline-html",
"its-not-just-tech",
"lastName",
@@ -304,6 +322,7 @@
"navbar",
"on-a-mission-with-nato-cyber-defence-on-the-frontline",
"ordered-list",
+ "ourencissec-zip-bombs-and-oeis",
"paragraph",
"phone",
"portfolio",
@@ -311,12 +330,16 @@
"progress-page",
"repository",
"resume",
+ "reversing-rebuilding-and-failing-better-my-cyber-security-challenge-belgium-qualifier-experience",
"select-page",
"sidebarContent",
"skill",
"tables",
"the-black-team-rapid-response-in-action",
+ "the-challenge-that-stuck-with-me-rebuilding-a-split-dex",
"the-exercise-locked-shields",
+ "the-go-server-that-didnt-budge",
+ "the-one-that-got-away-tls-fingerprinting",
"toggler",
"ui-previews",
"unordered-list",
@@ -326,6 +349,7 @@
"whats-new",
"why-alpine--hugo",
"why-it-mattered",
+ "working-as-a-team",
"you-cant-prepare-for-this",
"youtube-video"
]
diff --git a/public/blog/index.html b/public/blog/index.html
index 7f5220c..b076257 100644
--- a/public/blog/index.html
+++ b/public/blog/index.html
@@ -470,27 +470,27 @@
+
+
+ Reversing, Rebuilding, and Failing Better: My Cyber Security Challenge Belgium Qualifier Experience
+
+ What do you do when a rogue process might be malware, or maybe just a poorly named service? What happens when your teammate refuses to act unless something is “officially malicious”? The team faced cultural clashes, communication breakdowns and stress-testing of both systems and people.
The exercise required more than technical fixes. It demanded communication with simulated commanders, media and public stakeholders. Reporting became just as important as patching. It taught participants how to translate technical impact into real-world consequences. Not “port 8443 unreachable”, but “our air defence system is degraded, and we cannot fly planes”.
A new but powerful presence in the simulation was the Black Team, a rapid-response unit deployed when problems became too complex for any single team. Acting like special forces, they jumped in when incidents crossed team boundaries or demanded unconventional solutions. Their mission was to find out what was happening, assess the impact and suggest fast, creative responses. Introduced just last year, this team quickly proved its value again in 2025. They even embraced the role with style — “you can wear sunglasses inside” became their unofficial motto.
+A new but powerful presence in the simulation was the Black Team, a rapid-response unit deployed when problems became too complex for any single team. Acting like special forces, they jumped in when incidents crossed team boundaries or demanded unconventional solutions. Their mission was to find out what was happening, assess the impact and suggest fast, creative responses. Introduced just last year, this team quickly proved its value again in 2025. They even embraced the role with style “you can wear sunglasses inside” became their unofficial motto.
Their presence underlined a critical lesson: not every problem fits neatly within a team’s silo. Real-world defence requires flexibility, speed and lateral thinking.
There were plenty of mishaps. Misfired scripts, team mix-ups, and one case where a DNS setup from a previous year was reused by mistake. Someone tried renaming cut
to shutdown
, breaking essential operations until it was fixed. Systems rebooted into chaos, a manual was uploaded to public GitHub, and the team had to quickly learn the difference between symbolic links and real binaries.
Howest’s ongoing commitment to world-class cybersecurity training took center stage again as six lecturers from the Cyber Security program joined forces with experts from Latvia, Luxembourg and Belgium in one of NATO’s most intensive simulations: the Locked Shields exercise, hosted by the Cooperative Cyber Defence Centre of Excellence (CCDCOE). Now in its fifth year of participation, the Howest team shared their firsthand experiences at a special evening talk at Howest Bruges.
-Locked Shields is no ordinary simulation. It is a full-scale, live-fire cyber defence exercise involving more than 6,000 machines and a narrative scenario so detailed it includes geopolitics, disinformation and even fictional countries. This year, the Blue Team 03 (our team) defended a simulated nation’s critical infrastructure including power plants, satellites, 5G networks and banking systems, all while under constant attack from a coordinated Red Team using automated scripts and over 28,000 attacks across two days.
-And yes, every team (Red, Blue, Yellow, White) uses Ansible. For everything.
-What do you do when a rogue process might be malware, or maybe just a poorly named service? What happens when your teammate refuses to act unless something is “officially malicious”? The team faced cultural clashes, communication breakdowns and stress-testing of both systems and people.
-The exercise required more than technical fixes. It demanded communication with simulated commanders, media and public stakeholders. Reporting became just as important as patching. It taught participants how to translate technical impact into real-world consequences. Not “port 8443 unreachable”, but “our air defence system is degraded, and we cannot fly planes”.
-A new but powerful presence in the simulation was the Black Team, a rapid-response unit deployed when problems became too complex for any single team. Acting like special forces, they jumped in when incidents crossed team boundaries or demanded unconventional solutions. Their mission was to find out what was happening, assess the impact and suggest fast, creative responses. Introduced just last year, this team quickly proved its value again in 2025. They even embraced the role with style — “you can wear sunglasses inside” became their unofficial motto.
-Their presence underlined a critical lesson: not every problem fits neatly within a team’s silo. Real-world defence requires flexibility, speed and lateral thinking.
-There were plenty of mishaps. Misfired scripts, team mix-ups, and one case where a DNS setup from a previous year was reused by mistake. Someone tried renaming cut
to shutdown
, breaking essential operations until it was fixed. Systems rebooted into chaos, a manual was uploaded to public GitHub, and the team had to quickly learn the difference between symbolic links and real binaries.
From detecting malware with Velociraptor and Q9, to encountering teammates who took orders literally, the learning was intense. One participant noted that while Belgian and Luxembourg teams prioritized knowledge sharing, others preferred strict protocol. This highlighted cultural differences and the importance of interpersonal skills.
-The biggest lesson? You are never fully prepared. Every iteration of Locked Shields is different. But each one sharpens not only your skills, but also your ability to function as a team under extreme conditions.
-This experience directly impacts the classroom. Inspired by the exercise, Howest is introducing new hands-on courses like “Glutamine” in semester five. Students will be dropped into realistic broken networks, with misconfigurations, fake firewalls and simulated threats. It is chaos, but controlled. And that is the point.
-As one speaker said: “You don’t win Locked Shields. You just survive it better than the rest.”
+On March 14 and 15, I joined the Cyber Security Challenge Belgium qualifiers with three teammates. For two days, we threw ourselves at CTF challenges covering binary exploitation, Android reversing, cryptography, and more.
+What follows is a recap of the challenges I personally worked on, some I solved, some I didn’t—but all of them left me with new skills and new ideas.
+One of the first challenges I picked involved a binary with a basic stack overflow. I used standard techniques, finding the offset, hijacking the return address, and injecting shellcode. Tools like pwntools
helped automate the payload crafting. It was a great warm-up and a confidence boost once it worked.
Then there was a more elaborate cryptography challenge: 18 zip files, each password-protected. We cracked the first three passwords using John the Ripper and got numeric values from them. I searched the sequence in OEIS and found it matched A007408, which gave us the full pattern of passwords.
+Using this, I could extract all zip contents automatically, reconstruct the password-protected message, and finally reveal the flag.
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +One challenge involved “guessing” a thousand random numbers between 1 and 10. The banner claimed it required infinite luck, but of course, the randomness was seeded. After inspecting the generator, I realized it was deterministic. By precomputing seeds and output sequences, I could match the challenge’s banner to a specific seed and regenerate the entire solution.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Several APKs were part of the qualifier set. I used JADX to decompile them and FRIDA to patch logic at runtime. In one challenge, I bypassed license validation by forcing key methods to return true and unlocking hidden functionality.
+This one stood out.
+The app used a 4×8 button grid. Pressing buttons loaded a sequence of blockXX
files from assets. These were concatenated in-memory and passed into InMemoryDexClassLoader
to load a class called be.dauntless.flag.Flag
.
Class loadClass = new InMemoryDexClassLoader(ByteBuffer.wrap(byteArrayOutputStream.toByteArray()), getClassLoader())
+ .loadClass("be.dauntless.flag.Flag");
+
Each block
was a fragment of a DEX file, but the app didn’t tell you the right order. I tried manually inspecting the fragments, identifying methods, string constants, and offsets—to infer how to reassemble the full file. I got close, but didn’t crack it in time.
That challenge stuck with me because it combined static analysis, runtime introspection, and logic reconstruction. It wasn’t just technical, it was creative.
+Another challenge involved a Go-based TLS server that rejected all client connections unless they matched a specific fingerprint. I used Go’s tls.Config
to replicate the version, cipher suites, and ALPN:
tls.Config{
+ MinVersion: tls.VersionTLS13,
+ CipherSuites: []uint16{
+ tls.TLS_AES_128_GCM_SHA256,
+ // ...
+ },
+ NextProtos: []string{"h2"},
+}
+
Despite that, the server still refused the connection. I suspect it was using JA4 or similar TLS fingerprinting techniques we couldn’t fully emulate. We had to move on, but I’d love to revisit that one someday.
The exercise teaches more than just cybersecurity. It builds trust. It proves that knowing your teammates can be as important as knowing the tools. Whether that comes from a shared flight or a pre-exercise barbecue, it all matters when the pressure hits.
-Want to see how cyber defence works in real life? This is it.
-I didn’t solve everything. But that wasn’t the point. Every challenge was a practical puzzle, something to decode, reverse, bypass, or just understand a little better.
+Working as a team with Evarist, Nathan, and Waut made it even more valuable. We bounced ideas off each other, divided tasks, and got a much broader set of challenges covered.
+The Cyber Security Challenge Belgium qualifiers weren’t easy. But they were the best kind of difficult, the kind that teaches you something whether you solve the problem or not.
Category
+ +Buffer overflows, Android apps, crypto challenges, and a TLS fingerprint puzzle …
+I tackled buffer overflows, reversed Android apps, cracked crypto puzzles, and …
+