第二届Parloo杯CTF 应急响应挑战赛初赛WP

admin 2025年5月20日03:29:56评论2 views字数 36868阅读122分53秒阅读模式

心得体会:GPT好GPT妙GPT呱呱呱叫

其他:有点乱凑合看 没做出来的懒得搞了

应急响应:

1.应急响应主线

1.提交堡垒机中留下的flag

第二届Parloo杯CTF 应急响应挑战赛初赛WP

flag:palu{2025_qiandao_flag}

2.提交WAF中隐藏的flag

palu{2025_waf}

爆搜

3.提交Mysql中留下的flag

第二届Parloo杯CTF 应急响应挑战赛初赛WP
第二届Parloo杯CTF 应急响应挑战赛初赛WP

palu{Mysql_@2025}

4.提交攻击者的攻击IP

192.168.20.107

查看waf服务器登录日志,发现192.168.20.107 IP存在攻击行为

第二届Parloo杯CTF 应急响应挑战赛初赛WP

5.提交攻攻击者最早攻击时间flag格式为palu{xxxx-xx-xx-xx-xx-xx}

palu{2025-05-05-00:04:40}

第二届Parloo杯CTF 应急响应挑战赛初赛WP

6.提交web服务泄露的关键文件名

第二届Parloo杯CTF 应急响应挑战赛初赛WP
第二届Parloo杯CTF 应急响应挑战赛初赛WP

7.题解泄露的邮箱地址

第二届Parloo杯CTF 应急响应挑战赛初赛WP

8.提交立足点服务器ip地址

192.168.20.108

日志

9.提交攻击者使用的提权的用户和密码

parloo/parloo

查看ssh服务器用户列表,发现多了后门用户parloo

尝试弱口令等组合密码登录成功

10.提交攻击者留下的的文件内容作为flag提交

palu{hi_2025_parloo_is_hack}

第二届Parloo杯CTF 应急响应挑战赛初赛WP

12.提交攻击者攻击恶意服务器连接地址作为flag提交

47.101.213.153:8082

第二届Parloo杯CTF 应急响应挑战赛初赛WP

14.找到系统中存在信息泄露的服务运行端口作为flag提交

第二届Parloo杯CTF 应急响应挑战赛初赛WP

8081

第二届Parloo杯CTF 应急响应挑战赛初赛WP

15.提交Parloo公司项目经理的身份证号作为flag提交

第二届Parloo杯CTF 应急响应挑战赛初赛WP

16.提交存在危险功能的操作系统路径作为flag提交。flag格式为palu{/xxx/xxx}

/admin/parloo

第二届Parloo杯CTF 应急响应挑战赛初赛WP
第二届Parloo杯CTF 应急响应挑战赛初赛WP
第二届Parloo杯CTF 应急响应挑战赛初赛WP

18.提交攻击者留下的恶意账户名称md5后作为flag进行提交。 格式为palu{md5{xxxxx}}

hack

查询结果:

md5(hack,32) = d78b6f30225cdc811adfe8d4e7c9fd34

第二届Parloo杯CTF 应急响应挑战赛初赛WP

19.提交内部群中留下的flag并提交

第二届Parloo杯CTF 应急响应挑战赛初赛WP

20.请提交攻击者使用维护页面获取到的敏感内容作为flag进行提交

palu{Server_Parloo_2025}

/var/log/parloo/command.log

第二届Parloo杯CTF 应急响应挑战赛初赛WP

21.提交获取敏感内容IP的第一次执行命令时间作为flag进行提交。flag格式为palu{xxxx-xx-xx:xx:xx:xx}

2025-05-04 15:30:38

第二届Parloo杯CTF 应急响应挑战赛初赛WP

22.提交攻击者使用的恶意ip和端口flag格式为palu{xx.xx.xx.xx:xxxx}

10.12.12.13/9999

第二届Parloo杯CTF 应急响应挑战赛初赛WP

23.提交重要数据的明文内容作为flag提交

palu{Password-000}

根据gitea里黑客留下的代码

def custom_encrypt(text, key):    encrypted = []    key_bytes = [ord(c) for c in key]    for i, char in enumerate(text):        shifted = ord(char) + (i % 5 + 1)        xor_key = key_bytes[i % len(key_bytes)]        xored = shifted ^ xor_key        substituted = ((xored & 0x0F) << 4) | ((xored & 0xF0) >> 4)        encrypted.append(f"{substituted:02x}")    return "".join(encrypted)

反向推理,明文应该是palu{}

密文在palu3的桌面上

第二届Parloo杯CTF 应急响应挑战赛初赛WP

写个脚本爆一下

def nibble_swap(x):    return ((x & 0x0F) << 4) | ((x & 0xF0) >> 4)def get_key_char(plain_char, cipher_byte, position):    """从已知的明文字符和对应的密文字节反推密钥字符"""    # 1. 解密时先交换高低位    swapped = nibble_swap(cipher_byte)    # 2. 计算原始字符的偏移值    shifted_plain = ord(plain_char) + (position % 5 + 1)    # 3. 求解密钥字符: key[i] = swapped ^ shifted_plain    key_char = swapped ^ shifted_plain    return key_chardef recover_key(known_plaintext, ciphertext_hex):    """从已知的明文片段和对应的密文中恢复密钥"""    ciphertext_bytes = bytes.fromhex(ciphertext_hex)    recovered_key = []    for i, char in enumerate(known_plaintext):        if i < len(ciphertext_bytes):            key_byte = get_key_char(char, ciphertext_bytes[i], i)            recovered_key.append(chr(key_byte))    return ''.join(recovered_key)def custom_decrypt(cipher_hex, key):    """使用给定的密钥解密密文"""    data = bytes.fromhex(cipher_hex)    kb = [ord(c) for c in key]    res = []    for i, b in enumerate(data):        x = nibble_swap(b)        shifted = x ^ kb[i % len(kb)]        orig = shifted - ((i % 5) + 1)        res.append(chr(orig))    return "".join(res)# 已知信息ciphertext = "c3a1c3c13e326020c3919093e1260525045e"known_plaintext = "palu{"  # 已知的明文前缀# 恢复密钥并解密partial_key = recover_key(known_plaintext, ciphertext)print(f"根据已知明文推导的部分密钥: {partial_key}")# 尝试使用该密钥解密partial_plaintext = custom_decrypt(ciphertext, partial_key)print(f"使用推导的密钥解密结果: {partial_plaintext}")# 如果发现部分密钥形成某种模式,可以尝试扩展它if partial_key.startswith("MySec"):    complete_key = "MySecretKey"  # 猜测完整密钥    complete_plaintext = custom_decrypt(ciphertext, complete_key)    print(f"使用完整猜测密钥 '{complete_key}' 解密结果: {complete_plaintext}")

palu{Password-000}

25.提交恶意程序的外联地址

88.173.90.103

反编译ipconfig.exe

第二届Parloo杯CTF 应急响应挑战赛初赛WP

26.提交攻击这使用的恶意dnslog域名作为flag进行提交

第二届Parloo杯CTF 应急响应挑战赛初赛WP

27.提交寻找反序列化漏洞的端口作为flag进行提交

9999

java 9999

第二届Parloo杯CTF 应急响应挑战赛初赛WP

28.提交web服务泄露的密钥作为flag进行提

QZYysgMYhG6/CzIJlVpR2g==

第二届Parloo杯CTF 应急响应挑战赛初赛WP

30.提交攻击者在server中留下的账户密码作为flag进行提交。flag格式为palu{username/password}

palu{parloohack/123456}

第二届Parloo杯CTF 应急响应挑战赛初赛WP

31.提交攻击者维权方法的名称作为flag进行提交

parloohack_script.service

第二届Parloo杯CTF 应急响应挑战赛初赛WP

32.提交攻击者留下的木马md5后作为flag进行提交

4123940b3911556d4bf79196cc008bf4

第二届Parloo杯CTF 应急响应挑战赛初赛WP
第二届Parloo杯CTF 应急响应挑战赛初赛WP

36.提交恶意用户的数量作为flag进行提交

99

第二届Parloo杯CTF 应急响应挑战赛初赛WP

37.提交恶意用户的默认密码作为flag进行提交

123456

第二届Parloo杯CTF 应急响应挑战赛初赛WP

38.提交业务数据中攻击者留下的信息作为flag进行提交

palu{crP1ZIVfqrkfdhGy}

第二届Parloo杯CTF 应急响应挑战赛初赛WP

39.提交私人git仓库中留下的内容作为flag进行提交

palu{FO65SruuTukdpBS5}

第二届Parloo杯CTF 应急响应挑战赛初赛WP
ubuntu@ubuntu:/opt/1panel/apps/gitea/gitea/data/git/repositories/admin/palu.git$ git log --all --oneline260a8c1 (HEAD -> main) 添加 paluubuntu@ubuntu:/opt/1panel/apps/gitea/gitea/data/git/repositories/admin/palu.git$ git show 260a8c1commit 260a8c162aa488637ba70ac453ead89a7b3fb7ef (HEAD -> main)Author: admin <[email protected]>Date:   Tue May 13 18:08:09 2025 +0000    添加 paludiff --git a/palu b/palunew file mode 100644index 0000000..b920082--- /dev/null+++ b/palu@@ -0,0 +1 @@+cGFsdXtGTzY1U3J1dVR1a2RwQlM1fQ== No newline at end of fileubuntu@ubuntu:/opt/1panel/apps/gitea/gitea/data/git/repositories/admin/palu.git$ 
第二届Parloo杯CTF 应急响应挑战赛初赛WP

40.提交存在在mysql服务器中的恶意程序的MD5作为flag进行提交

.a

ba7c9fc1ff58b48d0df5c88d2fcc5cd1

第二届Parloo杯CTF 应急响应挑战赛初赛WP

41.提交恶意程序中模拟c2通信的函数名称作为flag进行提交

sudo strings /root/.a[sudo] password for ubuntu: /lib64/ld-linux-x86-64.so.2bj>D6oM5iputsexitsetuidfopenfork__libc_start_main__cxa_finalizefcloseprintffwritelibc.so.6GLIBC_2.2.5GLIBC_2.34_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTablePTE1u+UH/tmp/.malware_log.txtThis is a simulated malicious log file.Hidden file created: /tmp/.malware_log.txtFailed to create hidden file.Simulating network communication to C2 server...Simulated malicious dataData sent: %sCreating child process...Child process running.Child process created successfully.Failed to create child process.Attempting privilege escalation...Privilege escalation successful.Privilege escalation failed.Simulating file encryption...File encrypted: %sSimulating malicious behavior on Linux...Malware simulation complete.9*3$"GCC: (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0Scrt1.o__abi_tagcrtstuff.cderegister_tm_clones__do_global_dtors_auxcompleted.0__do_global_dtors_aux_fini_array_entryframe_dummy__frame_dummy_init_array_entryey.cpp__FRAME_END___DYNAMIC__GNU_EH_FRAME_HDR_GLOBAL_OFFSET_TABLE__Z18create_hidden_filev_Z30simulate_network_communicationv__libc_start_main@GLIBC_2.34_ITM_deregisterTMCloneTableputs@GLIBC_2.2.5_Z19simulate_encryptionv_Z29simulate_privilege_escalationv_edatafclose@GLIBC_2.2.5_finiprintf@GLIBC_2.2.5__data_start__gmon_start____dso_handle_IO_stdin_used_end__bss_startmain_Z20create_child_processvfopen@GLIBC_2.2.5exit@GLIBC_2.2.5fwrite@GLIBC_2.2.5__TMC_END___ITM_registerTMCloneTablesetuid@GLIBC_2.2.5__cxa_finalize@GLIBC_2.2.5_initfork@GLIBC_2.2.5.symtab.strtab.shstrtab.interp.note.gnu.property.note.gnu.build-id.note.ABI-tag.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.got.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.dynamic.data.bss.comment

simulate_network_communication

42.提交恶意程序创建隐藏文件的名称作为flag提交

.malware_log.txt

43.提交恶意程序中模拟权限提升的函数作为flag进行提交

simulate_privilege_escalation

44.提交被钓鱼上线的用户名作为flag进行提交

palu{Parloo-子怡}

第二届Parloo杯CTF 应急响应挑战赛初赛WP

45.提交恶意程序的所在路径作为flag进行提交

palu{C:UsersPublicNwtcacherecvParloo-沉沉}

第二届Parloo杯CTF 应急响应挑战赛初赛WP

46.分析恶意程序的反连地址作为flag进行提交

45.101.213.153

第二届Parloo杯CTF 应急响应挑战赛初赛WP

47.提交恶意c2的服务器登录的账号密码作为flag进行提交。flag格式为palu{username/password}

第二届Parloo杯CTF 应急响应挑战赛初赛WP

2.应急响应-畸形的爱

1.攻击者ip地址1:

第二届Parloo杯CTF 应急响应挑战赛初赛WP

2.攻击者ip地址2:

第二届Parloo杯CTF 应急响应挑战赛初赛WP

4.flag1:

第二届Parloo杯CTF 应急响应挑战赛初赛WP

5.flag2: 

第二届Parloo杯CTF 应急响应挑战赛初赛WP

6.flag3:

第二届Parloo杯CTF 应急响应挑战赛初赛WP
第二届Parloo杯CTF 应急响应挑战赛初赛WP

7.钓鱼文件的哈希32位大写:

第二届Parloo杯CTF 应急响应挑战赛初赛WP

8.webshell密码1:

在shell.php一句话

第二届Parloo杯CTF 应急响应挑战赛初赛WP

9.攻击者开放端口:

爆搜攻击者ip,分析木马的外联IP

palu{1133,1144,8084}

第二届Parloo杯CTF 应急响应挑战赛初赛WP
第二届Parloo杯CTF 应急响应挑战赛初赛WP

10.webshell密码2:

第二届Parloo杯CTF 应急响应挑战赛初赛WP

11.隐藏账户的密码:

第二届Parloo杯CTF 应急响应挑战赛初赛WP

12.攻击者的邮箱:

第二届Parloo杯CTF 应急响应挑战赛初赛WP

13.flag4

第二届Parloo杯CTF 应急响应挑战赛初赛WP

CTF:

1.循环锁链

# 加密函数:链式 XOR 环def encrypt_flag(flag_bytes):    encrypted = bytearray(len(flag_bytes))    for i in range(len(flag_bytes)):        prev = encrypted[i - 1] if i > 0 else encrypted[-1]        encrypted[i] = flag_bytes[i] ^ prev    return bytes(encrypted)# 解密函数:暴力找起点 + 环形链式 XOR 解锁def decrypt_chain(cipher, known_prefix=b"palu{"):    prefix_len = len(known_prefix)    for start in range(len(cipher)):        decrypted = bytearray(len(cipher))        for i in range(prefix_len):            decrypted[(start + i) % len(cipher)] = known_prefix[i]        for i in range(prefix_len, len(cipher)):            idx = (start + i) % len(cipher)            prev_idx = (start + i - 1) % len(cipher)            decrypted[idx] = cipher[prev_idx] ^ decrypted[prev_idx]        for i in range(start - 1, start - len(cipher), -1):            idx = i % len(cipher)            next_idx = (i + 1) % len(cipher)            decrypted[idx] = cipher[idx] ^ decrypted[next_idx]        if decrypted[start:start + prefix_len] == known_prefix:            return bytes(decrypted)    return None# 示例使用if __name__ == "__main__":    # 原始明文    flag = b"palu{iC7uDoJJMAWnIhkkCNiIoCZZVmiPrk9}"    encrypted = encrypt_flag(flag)    print("[*] Encrypted (hex):", encrypted.hex())    decrypted = decrypt_chain(encrypted)    if decrypted:        print("[+] Decrypted flag:", decrypted.decode())    else:        print("[-] Decryption failed.")#palu{iC7uDoJJMAWnIhkkCNiIoCZZVmiPrk9}

2.轮回密码

import base64def samsara_decrypt(cipher_bytes, key_word):    cycle_step = len(key_word) % 6 + 1    key = key_word    # 逆异或操作    phase3_xor = bytes([c ^ key[i % len(key)] for i, c in enumerate(cipher_bytes)])    # 循环左移恢复phase2    n = cycle_step    phase2_bytes = bytes([((c << n) & 0xFF) | (c >> (8 - n)) for c in phase3_xor])    try:        phase1_bytes = base64.b85decode(phase2_bytes)    except:        return None    # 循环左移恢复明文    original_bytes = bytes([((c << n) & 0xFF) | (c >> (8 - n)) for c in phase1_bytes])    return original_bytes# 示例使用if __name__ == "__main__":    key = b"Bore"    # 假设密文是用户提供的轮回密文(需要正确编码为字节)    cipher_text = "y¦_›6>X¬y–!,!n¡mSaÜñüë—9¼6™"    cipher_bytes = cipher_text.encode('latin-1')    flag_bytes = samsara_decrypt(cipher_bytes, key)    if flag_bytes:        print("Flag:", flag_bytes.decode('latin-1'))    else:        print("解密失败")#palu{reincarnation_cipher}

3.RSA_Quartic_Quandary

import mathfrom Crypto.Util.number import long_to_bytes# 从 output.txt 中读取参数params = {}with open('/mnt/data/output.txt', 'r') as f:    for line in f:        if '=' in line:            key, value = line.strip().split('=')            params[key.strip()] = int(value.strip())n = params['n']e = params['e']c = params['c']s = params['s']# 恢复 p 和 q 的函数def recover_p_q(n: int, s: int):    A2 = s + 2 * n * n    A = math.isqrt(A2)    if A * A != A2:        raise ValueError("A² 不是完全平方数")    sum2 = A + 2 * n    diff2 = A - 2 * n    r1 = math.isqrt(sum2)    r2 = math.isqrt(diff2)    if r1 * r1 != sum2 or r2 * r2 != diff2:        raise ValueError("p+q 或 p−q 的平方不成立")    p = (r1 + r2) // 2    q = (r1 - r2) // 2    if p * q != n:        raise ValueError("p*q ≠ n")    return p, q# 执行计算p, q = recover_p_q(n, s)phi = (p - 1) * (q - 1)d = pow(e, -1, phi)m = pow(c, d, n)flag = long_to_bytes(m).decode()flag#palu{This_is_a_fake_flag_change_it_for_real_use}

4.欧几里得

c = 1426774899479339414711783875769670405758108494041927642533743607154735397076811133205075799614352194241060726689487117802867974494099614371033282640015883625484033889861# Try all possible 2-byte valuesfor i in range(65536):  # 2^16 possibilities    # Convert to bytes, repeat 35 times, then back to integer    potential_m2 = int.from_bytes(i.to_bytes(2, 'big') * 35, 'big')    # Compute potential flag value    potential_m1 = c - potential_m2    # Convert to bytes and check if it starts with "palu{"    try:        flag = potential_m1.to_bytes((potential_m1.bit_length() + 7) // 8, 'big')        if flag.startswith(b'palu{') and flag.endswith(b'}'):            print(f"Found flag: {flag.decode()}")            break    except:        continue    # palu{48b635a7a2474ef743e333478b67a2f5}

5.易如反掌

from sage.all import Matrix, ZZimport hashlibfrom math import logdef find_e(N_list, E_list, bit_d=800, lll_kwargs=None):    r = len(N_list)    assert len(E_list) == r,     # 放大因子 M = 2^bit_d    M = ZZ(2) ** bit_d    # 构造 (r+1)x(r+1) 的格基矩阵    B = Matrix(ZZ, r+1)    # 第一行: [M, E[0], E[1], ..., E[r-1]]    B[0,0] = M    for i, Ei in enumerate(E_list, start=1):        B[0,i] = Ei    # 对角线填充 -N[i-1]^2    for i, Ni in enumerate(N_list, start=1):        B[i,i] = -Ni**2    # 执行 LLL 规约    if lll_kwargs is None:        lll_kwargs = {}    L = B.LLL(**lll_kwargs)    # 在规约结果中搜索第 0 列能被 M 整除的向量    candidates = []    for v in L.rows():        coeff = v[0]        if coeff % M == 0:            d_candidate = abs(coeff // M)            # 验证 d 的大小合理性            if 1 < d_candidate < 2**bit_d:                candidates.append(d_candidate)    return candidates# —— 主流程 —— ## 题目提供的 N 列表N = [23796646026878116589547283793150995927866567938335548416869023482791889761195291718895745055959853934513618760888513821480917766191633897946306199721200583177442944168533218236080466338723721813833112934172813408785753690869328477108925253250272864647989241887047368829689684698870160049332949549671046125158024445929082758264311584669347802324514633164611600348485747482925940752960745308927584754759033237553398957651216385369140164712159020014009858771182426893515016507774993840721603911101735647966838456333878426803669855790758035721418868768618171692143354466457771363078719423863861881209003100274869680348729, 19552522218179875003847447592795537408210008360038264050591506858077823059915495579150792312404199675077331435544143983146080988327453540449160493126531689234464110427289951139790715136775261122038034076109559997394039408007831367922647325571759843192843854522333120187643778356206039403073606561618190519937691323868253954852564110558105862497499849080112804340364976236598384571278659796189204447521325485338769935361453819608921520780103184296098278610439625935404967972315908808657494638735904210709873823527111315139018387713381604550946445856087746716671838144925662314348628830687634437271225081272705532826343, 20588310030910623387356293638800302031856407530120841616298227518984893505166480372963166394317326422544430837759332223527939420321960057410073228508230111170414845403161052128790464277007579491219950440477721075788978767309211469555824310913593208232853272958011299985202799390532181335087622499894389777412111445377637396650710486263652440053717323053536700098339137819966260269752816515681602936416736576044630343136577023173210517247609888936337876211461528203642347119434700140264859102502126842250671976238033270367185358966766106988830596616311824691409766437473419074865115209866730272194297815209976737570183, 18468380817178794606027384089796802449939260582378979728469492439450780893746976934315768186829245395964644992296264093276556001477514083927556578752836255491334765496791841945178275793885002188397918857222419803612711637177559554489679414049308077300718317502586411333302434329130562745942681716547306138457088216901181646333860559988117376012816579422902808478175975263110581667936249474308868051767856694498210084853797453949193117835061402537058150493808371384063278793041752943930928932275052745657700368980150842377283198946138726219378646040515809994704174471793592322237777371900834531014326150160506449286179]# 题目提供的 E 列表E = [229904181453273080302209653709086531153804577507365859149808244958841045687064628362978517491609413507875726243121473678430010600891588643092042173698830147997497783886459583186019270582236955524620567373560535686287255124958954671737097645556109314142383275516997850786599322033792080045303427363366927030304214333894247469120513426641296678531965795930756543043851154646310114366477311633838078242963665452936523438928643273392454483600446242320078010627755587492056369779661382734170244060951095344418599686788550312205964136120979823565225768814898285224838691541122088693411388097496320157113230752327025862802020421665288007529320920942060329299409362236414929126050037144149017275031336018100081931062647888329912802477032857776085190828105602067426203163344931483638271679183910241511044338001446584634203146294743522375846913845041274967653508735863706778364499099286484552570083394223973734909997825522191349543295855925973354640349809770822075226834555111927586299176453943116511915434890643239957459427390624136283086434711471863737451011157026905191204496081860277138227247744470804087252965368757930797560277881668806206419629425126031049566579233056222579590529869798537893505779097868221221068867624660759084762471141, 374749619911728044650812367560174497001343067563440477135516664935394734686391543012901514676044211541958613458868769659861216149364768233000844624035620893309356372294598009760824255187442531508754966566917198975934706398309982525100772311586501118200858124845012643495006029930202324305874402291277845166060497038915773767003006049720519011634861166208163030159519901867416488082395270295488885724507937683469910251316231210838654273986152493722244271430422693265608430755620420680629979226285393465423870727975987787149515374769359243334743541460110042872587610309611770320600248289328406805995688596910226273861759369388105641549933915686192055533242723330981192183310876306968103333706140401422550917946410378174896274789619184565321544130428008804628699594759946577979319393247067750024729672029363433673084437510430506410293512293930056667971242862448029841846596288648691077795207341975907335202945548990662460491169957175452745622341245617265849042542964819126377775749222973138584978725470886059043251544634105653274564085280013340679259157119014619894553239015777411757887293044706448625760604242512494466386343040583010961386979963779928616733980046763291988848903515836247301007113187121999960487508948748354549628160741, 111738429639840672983162926852338651562094139707285850255632987705635459657893186493838711733560515475806567653354737245246745810892238414756414117557971683747269900627524702653772058841085258035513296218047505149691384287812041721130367506731427022265277885965948486359682023555050085264531256406043361391744086539522028829421284667293339869140564699750714145488199268791908205712660933607330454849730499840287271163350865799682565216636393526339218836244889719975150503253630419647851422620890082315396457329065508602521784001607236788620811397449483104884860551374031790663030220424841642241965983726516537123807061999084476076850833658360594525986997125319941689903869138176347916707622148840226672408554102717625456819726220575710494929111642866840516339713870850732638906870325693572445316904688582043485093120585767903009745325497085286577015692005747499504730575062998090846463157669448943725039951120963375521054164657547731579771203443617489609201617736584055562887243883898406182052632245189418568410854530995044542628531851356363297989653392057214167031332353949367816700838296651167799441279086074308299608106786918676697564002641234952760724731325383088682051108589283162705846714876543662335188222683115878319143239781, 185935167438248768027713217055147583431480103445262049361952417166499278728434926508937684304985810617277398880507451351333771783039360671467147075085417403764439214700549777320094501151755362122677245586884124615115132430034242191429064710012407308619977881929109092467325180864745257810774684549914888829203014922855369708286801194645263982661023515570231007900615244109762444081806466412714045462184361892356485713147687194230341085490571821445962465385514845915484336766973332384198790601633964078447446832581798146300515184339036127604597014458389481920870330726947546808739829589808006774479656385317205167932706748974482578749055876192429032258189528408353619365693624106394913101463023497175917598944803733849984703912670992613579847331081015979121834040110652608301633876167262248103403520536210279949844194696898862249482809107840303473964914083996538912970715834110371196970613332286296427286356036576876121010776933023901744994067564045429384172315640135483480089769992730928266885675143187679290648773060781987273082229827156531141515679114580622348238382074084270808291251400949744720804368426414308355267344210055608246286737478682527960260877955900464059404976906697164610891962198768354924180929300959036213841843941]# 调用函数candidates = find_e(N, E, bit_d=800, lll_kwargs={"eta": 0.501})# 输出结果if candidates:    print(f"找到 {len(candidates)} 个候选 d:")    for d in candidates:        # 计算位长度,兼容 SageMath Integer        bit_length = d.bit_length() if hasattr(d, 'bit_length') else int(log(d, 2)) + 1        print(f"d = {d}")        print(f"d 的位数: {bit_length}")        flag = "palu{" + hashlib.md5(str(d).encode()).hexdigest() + "}"        print(f"Flag: {flag}n")else:    print("未找到合适的 d 候选")

找到 1 个候选 d:

d = 4179423138350648633511603754580428752783447242202659775128505849773750010739782037758703319498715813081743032947622794072010600485826874110735478135715298345482643471515080914168066457318628922553866888869769462396548904235402414462199207661

d 的位数: 800

Flag: palu{b1fc01a38bae760451bcffe777e51b1d}

6.星际广播站

第二届Parloo杯CTF 应急响应挑战赛初赛WP

任意文件下载,下载源码app.py

第二届Parloo杯CTF 应急响应挑战赛初赛WP

找到数据库

先爆破出所有密码

import randomimport stringfrom gmssl import sm3, func# SM3 哈希函数def sm3_hash(data):    if isinstance(data, str):        data = data.encode('utf-8')    hash_bytes = sm3.sm3_hash(func.bytes_to_list(data))    return hash_bytes# 生成用户密码def generate_password(username):    characters = string.ascii_letters + string.digits    random.seed(username)    password = "".join(random.choices(characters, k=6))    return password# 从 users.db 提取的 password_hashdb_password_hashes = {    "1": "ca83068078d2bc06ac4c04924f99b477a0a35a12f659464e42e4ee96afd8f353",    "2": "3bd3bbac07672f601b144792552b694cd34fb18abc49bb104efac3b7fcb84d22",    "3": "add18805784bd36c9f9eac096e50b5fd117835470dc1c4f8d713e283530114dc",    "4": "4ed0d44cf690a18831cc9f740bccb2430acc1e2938cab3af58e6354195b2e749",    "5": "6ddb90db3b0c561c5838f38b5f9e248f43f0bc546f88d1074c356ee8d5aa5061",    "6": "62b83cc0db41dc7117d51119ce942212930378aa5a3ec16819e7893bbcfb13b5",    "7": "9c154c21c08bfd1769b5b0f4bf792b13ed874265aa6583cf523f0bc42c855164",    "8": "19a5cb911f0ee25c5472c3c1de1c61da819dfacc1480934f1f1faf6326d86ea7",    "9": "36a7fa0d8c739fd54b74cf9cb14b5954ede0c4f90d78d5fa1eeb4efbd200d401",    "10": "b840b769bd66983c4b3e29b9468391daf31d7abcc6cf11cac824a0c507689922",    "11": "880bc791064b7725438adefc0c118f58a2ee879a6f3d4577eb6f9016cdbd3ad3",    "12": "6b6053a722debb8fcd035bf016cbbc36332b7e790f35ac07e24290d00012604e",    "13": "c5ec53ebd07ab62b107b50ce80dc25800086402fcab9b8b3733547a482504e7f",    "14": "9d2a21aa504093b158765311601e056ef9387d2505f186d6f8063ed8593ea564",    "15": "bf9d7ef811c7c0d6cf654135997d7b155c15911da8d1f933e8aa3716b6cd198c",    "16": "9921ea0d6c980859fc6ab00ff15b928a2b0bce57c88a1cfb913a946a1e198991",    "17": "716e8600514b137d943dedc44b03653678356719b8830e066e2fa78f017e6606",    "18": "0daa30e39aa3113993320f2694c1e358576842139dd881fa6ac679047418eb69",    "19": "84dec0c459053a7a92a1a6817c7d105c9a7a9ef99cecc7d27cc27e41c97eb144",    "20": "a63884546cda24daa047b5a39fbbbb8b619f306910868f1c1d041fdea9cd959e",    "21": "b24a377810a1761892c1edce0155c6859f759a95b2d096e0d59bde2254db6a6f",    "22": "ab0df6f9124aa97d66a658e15b3d9fd6dc9fff9f048fc979ed122e5b0f6328f0",    "23": "2fe0edfe5d473c81605d607be5ce514d17a1c327b41ee9c5947c41d21726dc79",    "24": "245e60f9b40954e0d4ccecd8b6ed9722a3116e7cbabfc51fbe1bd3e120e08cbc",    "25": "e3b9f5b9e331286ed950bdb513360249ff6d92d0ee3b6ad3e49faef2b7b3c190",    "26": "dcebc0008a8910be149c49a638f0f39d99354bb2190d716a1276c35cfbac841b",    "27": "a075d2161ac5ea3a6f07de7f265d056d45f79362fa6de4af5e32c0fe38ae5838",    "28": "788c567e1b86c4db83cb20fe839f36995e97ed3d2a086f0b7231c733a6f7d7a8",    "29": "9f5fa54911638b1b2cd401453ad4b83733216b690bd3161442c21441f714b314",    "30": "d1dc4b53fe264c759aa9f768f607eb6cc75472419befe1f58eee944e492c3ec0",    "31": "e3192b5a6415abf5847fa528c7d4d161e4caffd05c3400fac452869c5fa1d8e2",    "32": "36032240cbedc6c318167c9eed7b42ccfdeec02ec2f77d92e2197cc7f92cf229",    "33": "ffc75cffcc52f0dfde4ab6a59174663d9e0bbfd9ca25feb6f4d675736ee799c5",    "34": "98dd184c40970c073e242f153a27231b1381c9a8d29b98e28b502521757b029a",    "35": "badaae3845b05a68b2ee973a9b72fc5d34ebbcc92a9be93883057aa855830750",    "36": "241681b4bb45ba3b82da48128f31954757477e840352f83c2d7e7da337591077",    "37": "3233178fd22f0da4a4ae03c7ca5fe1f76751a902a76d9571897bef754fe586d5",    "38": "2d28e4525ce25a5aa19d9f45263fcbdbf4cf5a9e176b82616885f69ee688ad48",    "39": "d597db5e08ac8b93e323576a63ce7a9e8c70d292b281a10871f70f89928f1632",    "40": "d52bca484bddaa72ce2143ed15fd550d56aaf30f9d054d8756e6e2f6f0438b13",    "41": "5680f7ef67f8a511b2aebabb22d8513e82170c38072a53de8c41b81f4c91d722",    "42": "200b84f06c6a58711250cbdb0f37aea2ba2e7d2a9e3ed07c13653231c7c121e0",    "43": "b154abb0b00b748da4e78502145e94507d680d27811a4b325cf7657f71de5f4e",    "44": "65cb9ffa60e4a90ac50f7351f1f91cae17e0c1097fd1b157edee7a388012d7ee",    "45": "6f153feebde21d7ab274b31e2b46545432ae53b0765e60f612adc4b7a9bf03ee",    "46": "6ea15497a2c6fafaab9ea998ef7cc457908e19a60f7a47af8215af9ed4812a7c",    "47": "e4df5587f84e22709ae8dcb23a280456f920f28d72d84e4f90d56b8cbcfb563f",    "48": "59b312aa74f531b0beba2a37d7bf3027d32f26c439265f17b54bae9817f743da",    "49": "2277ee25146c1fc6f97e685e55a33184fb949d88a090056a5ee82bdd8a086539",    "50": "463c6fa10bdb8e65781420899417f6c59898920dc6fa636a09aa7273f546a0c5",    "51": "a917e8d06a6a29d883de76bd55a971ebca6956b22013e72d328f23b55e104bca",    "52": "2a6e0b8adc098287c3bc2ef87cf729da8cfdb07b3e05ab3a6f405edde2b2885a",    "53": "a3b6706c9183b51e86c0b657604df28811c9c004d474f07a3e7cdab4dcc2c960",    "54": "1496f35bb11c8196faedfe6b706a43704a082c5455eeaf58a36aa95d0bd30f48",    "55": "9496a5d368ca3a473cd17e06dec6de5f6e7fc746c96814c176fc1fd1de5bff84",    "56": "7e16045490fd7c6bef66db191f98b468f4bd35fdb5d25247c96f2fae2a2c0c65",    "57": "b6c84ff0caf2f22b9f732e156ce6b1252758beacefd64cfce93146ebdec16cce",    "58": "97501cef124a06251bbf4b17fbf49caab801107eab9d9b848895fb9d9c22b772",    "59": "5e0503a2524bf96326edf5d16ead58d2359965ba72aacbb3ec308165fd234227",    "60": "85d300463cf0d6fe3040db9c9882b220a773779d6a7445e10321cb2de48ea1c4",    "61": "8b7be0dc769a8907ce0af2ce50801440278c7173c873de6b45fda2cd66985a8e",    "62": "af529389a41cb4609cbc6cd4ad749d19fb8d5a18437ab8d6022cb86dc4540548",    "63": "21b24abd861a2d1259f3ab5c92852b13e302f81767dd31ff5a73fe837cde1667",    "64": "b349ac77c96b1e62d62b9b34f755ca9d8db238cf07e267153abc862e1ac2b9fa",    "65": "cb350c45f13daebdaa4e28cd23de23cd726f0f8c8182de3f9f29070c3244e80e",    "66": "986eb63c46abb1beda4b5be0e06be56021be98d5793af69fefd92257f403af5c",    "67": "71e6d02aeaea65df5e9d690fe54095960068935a3e040c56b7fe4238b0237662",    "68": "d2d92924dc90fd393ab066a9996c75c52ce765a3db04b643a2edbfa97ba85eb6",    "69": "9abfae7e3e6a00eebae2dfe1bcd6be39162d3399e1657e15aee3da42147a04fd",    "70": "d62012a82f42527398fba99aa7317431cb7cc78c62681d076e3651121f07e01c",    "71": "866cf76e06e4be28faae4521aef72ba50966579ee8b5731fd092b97b1150f8c5",    "72": "cbbf33a72cfff87a6130a8cfd039b3eea6446ae3e4b3cafc772bdfb156a3e238",    "73": "5601f0f3600ab42400b087fdb22e7272affbabd170da6c59a7173367f761dfa5",    "74": "5742e8113d8c17e024734feddf6d1e577b11c25988031aaf337cb6c2da896662",    "75": "25de19204e2e136c404e10d2516bd8ee1b496624ad07d1991fc2511da3eeede9",    "76": "7948ad4a784a5f85ba17d7e14ad40d568a414099b10c056198e4e8e89e2552e9",    "77": "8cdffcad8a9cf414c29c240970919b3082b3acb516b46621ac291fbd698389be",    "78": "99a9fe8c987739c170064471382bf6c1f9ddcefdbceee4ce2754496cb4cf0148",    "79": "d2a5a0824fd55085a4e01f0d5698d80e5efa56c46866bcb24c7d108b2efb5e7e",    "80": "bda873ccbc7c7f03d34030c14eb59219678943fd995eb11362b18fea460830d2",    "81": "d59e4f5e15f088d19f0662513ce995e8498196545907230ea21b3393c88ecfa1",    "82": "fe5429921ef6a6151f492b4fa1af9349218e77bee0dd692367ee4abc83f8f496",    "83": "ae407b0192615106c2aa7440328241402063b887c18f89138b24fda8229378b2",    "84": "7c5b77eca47ff4b2b2a194e77e300db25566dc7c738abfecbdfb21349e8c1060",    "85": "85bb6a3dda95584c5c74a12af9a98944443eecc9b5028af5c6434847fe684d41",    "86": "5a0af8d31f99e74f9afc4faea35c3299ed38499347ec7c663ed8f117de7734e7",    "87": "ef1fba14f6f253f5d3c71ac1ceb72b62725cb1ef41d6282d8cdcf4aa4b295dc9",    "88": "203719f3a5389316ba74037bcbf7ca06417b7f9c23017f0e782d76292b4f8cec",    "89": "d2179324effc018eb23d2a2fc7a05faa6984f3aba3a2694bd1d8f26cbc08671b",    "90": "2b1c60de4f551b17e8bef6bcec71b2a4de6aa1836a9f0b14254db2f7822257a0",    "91": "3590d36d05caa8eb345c5a5e63d8c81a9a82b42345fcf20bf4ba60e67b6d6b69",    "92": "99d3d033c4f17b5198768a7a15a1e5624cd66e060f2d94ee1c304f4d6ea5338d",    "93": "5dbfe36f86eebed926c00d58a1c5431d2e44344b2128f3607ad95efaa5d96803",    "94": "1c2cf50e2191ab9180cf05914e187f250576387e429a3797609e9b07c8705365",    "95": "5d473d94a285cac94400e7defeb9166acd34fd0f0111ad2585265a6a4b66cb41",    "96": "0b97ce24141affe369cfc3e041e3066fa9d8c38a93ebff67feb5aabf3fd10475",    "97": "fb95345f161c5e8548eb5970cfc140c42f0ed22d90ce2419168f1e474777a190",    "98": "d9fced3def25bc93a5e7c7afcc4c1dd9fc509e9f2bfdc42b44562e5e8f10e904",    "99": "ce2467ecd92d59102bb56e01c2a46cdb8eef8155f13daf79ac7a774738302e6e",    "100": "01d00ef4f83231b519e5b63be5b4d67b02f6169568e9fc9780160f946da04c92",    "101": "17d27ea6b1bd50cf2362d2c1d6ce94102b995cd35457dccd42460e62c41f7229",    "102": "c6b506d04cd9ac70c8bf57f9d4559a6c6c77671694e563d2ad2d6dbd426e4977",    "103": "502db04ad7484483a874a53309986f17984999a2e5df512f7ed7a062be88a3c7",    "104": "4e311cdad29dddc6c48c58efcc5803f7ee618f94d54356af14a021a6379c9506",    "105": "186708b856de9b4c6ca52cfa0950b97a4130b1205030d111bff97e7dc09b1b6e",    "106": "a58d771ddb9b0d2d379f8df83bceb0563742f6a2de155ba6b7dfd518f29d5051",    "107": "7d6a1f06e51e28f93e44f002f72ec5526a0a2bdc4c34cc76ef546e5bcff07cf9",    "108": "617a2b4b36bbdbf29a48139e3f46de0165ed264dcd44ad51785854e61e4d91c9",    "109": "1f301814385bee3b8d65674a9e2c522bd83671fc041d8b9fe1d7f4f9f2242fa5",    "110": "2925206d544eb6fba164179287b8ecffba44e3549b509d2324a68a76eac2e549",    "111": "5df0e1bb4cb964693094af19465f14e245d434c02fccd09aaa0417e0fa040f5e",    "112": "8fa0490157a0150a252df5dbd51a585d26ac7842175ade50c33849901d4e83d0",    "113": "c91f818a3d7928ac29bb3e3edb2d28d829b08eab27e923f93f7d3ac3307d0733",    "114": "7b573c3cf64740de5e3fd05653a2e9dfd45b67e845e895ea0321336e3855a70b",    "115": "5d96da48111a8e90ae7d6276a25ba768e7ad85a31f9fbb89af06e7ad5e596870",    "116": "af525054c771f23789177cff429c18f8f000cca3968621a737b75ce5b8cfb09c",    "117": "accf563d067d009353cf2473d586c9602e722bd41427e3b85a6f0161141d5af5",    "118": "24e378dc2225134e104da6559a04d12b38bedbc4b62b43951ea2863452dba340",    "119": "c26a04a4e3555025d3c4f29fe230a9f03fe2bd4b0eb14a2d0c57f4d4aa5db95d",    "120": "58de9182e081155ce9cda84dfa9306bac0c7de9079178bbe4183a7c7ada2ed3b",    "121": "456e683f3618015edc7ada65ac00c3658d64fed17c77635019f576cf80a31379",    "122": "938ae1431cb630b58480a5ef6fbc5573fc9b8fdb17df9618a3c01c58870f820b",    "123": "3c80f2da88ad177fbb135075a15b3435e3b33258241bf2229cee5b5046dc0190",    "124": "753be15ac34e3f8c1744c4bd5b448b4333a1d5caf9fa9b0f44ee9fa741803480",    "125": "2f39de2b2613334fe4dccfbc461faa5405e280afce40a4eef7a5121b7a932d98",    "126": "27baf235ca5e1d14c09fe92bba63ec6126df69f5c7499d56e1b448a8cccf91c7",    "127": "d7d181914e674c94d8287aa6ab37d0bc75bea29a22450afc7ef9a81f80ba1452",    "128": "cbdbf76ba20b67046b632e96e0b0b424e7ec396d703fb9db4806a68061bff379",}# 破解所有用户的密码passwords = {}for i in range(1, 129):  # 用户 1 到 128    username = str(i)    password = generate_password(username)    calculated_hash = sm3_hash(password)    if calculated_hash == db_password_hashes[username]:        passwords[username] = password        print(f"用户名: {username}, 密码: {password}, 哈希匹配")    else:        print(f"用户名: {username}, 密码: {password}, 哈希不匹配")# 保存密码到文件with open("user_passwords.txt", "w") as f:    f.write("用户名,密码n")    for username, password in passwords.items():        f.write(f"{username},{password}n")print("密码已保存到 user_passwords.txt")print(f"成功破解 {len(passwords)} 个用户的密码")

登录进去看

第二届Parloo杯CTF 应急响应挑战赛初赛WP

广播攻击

e = 127

写个脚本批量获取C值

import requestsfrom bs4 import BeautifulSoupimport csvimport time# 读取 user_passwords.txtpasswords = {}with open("user_passwords.txt", "r") as f:    reader = csv.reader(f)    next(reader)  # 跳过标题行    for row in reader:        passwords[row[0]] = row[1]# 读取 n_values.csv(假设格式为 username,N)n_values = {}with open("n_values2.csv", "r") as f:    reader = csv.reader(f)    next(reader)    for row in reader:        n_values[row[0]] = int(row[1])base_url = "http://challenge.qsnctf.com:31127"session = requests.Session()data = []  # 存储 (N, C) 对# 登录用户 1 到 73 并获取 Cfor i in range(1, 129):    username = str(i)    if username not in passwords or username not in n_values:        print(f"缺少数据: username={username}")        continue    password = passwords[username]    n_value = n_values[username]    # 提交登录请求    login_url = f"{base_url}/login"    form_data = {        "username": username,        "password_hash": password    }    response = session.post(login_url, data=form_data, allow_redirects=False)    if response.status_code == 302 and response.headers.get("Location") == "/dashboard":        print(f"登录成功: {username}")        # 访问 dashboard        dashboard_url = f"{base_url}/dashboard"        response = session.get(dashboard_url)        # 解析 HTML        soup = BeautifulSoup(response.text, 'html.parser')        c_tag = soup.find("span", class_="data-value")        if c_tag:            c_value = int(c_tag.text.strip())            data.append((n_value, c_value))            print(f"获取 C: username={username}, C={c_value}")        else:            print(f"无法解析 C 值: username={username}")    else:        print(f"登录失败: username={username}, status_code={response.status_code}")    # 避免请求过快    time.sleep(1)# 保存 (N, C) 对到 nc_pairs.txtwith open("nc_pairs2.txt", "w") as f:    writer = csv.writer(f)    for n, c in data:        writer.writerow([n, c])print(f"收集到 {len(data)} 个 (N, C) 对")print("数据已保存到 nc_pairs2.txt")

之后解密

from gmpy2 import irootfrom functools import reducefrom sympy import mod_inversefrom math import gcdimport randomfrom Crypto.Util.number import long_to_bytesdef are_pairwise_coprime(nums):    for i in range(len(nums)):        for j in range(i + 1, len(nums)):            if gcd(nums[i], nums[j]) != 1:                return False    return Truedef crt(a, m):    N = reduce(lambda x, y: x * y, m)    x = 0    for i in range(len(a)):        Ni = N // m[i]        Mi = mod_inverse(Ni, m[i])        x += a[i] * Ni * Mi    return x % N# 读取 nc_pairs.txt(处理空行)n = []c = []with open("nc_pairs2.txt", "r") as f:    lines = f.readlines()    for line in lines:        line = line.strip()        if line:  # 跳过空行            n_c = line.split(',')            if len(n_c) == 2:                try:                    n.append(int(n_c[0]))                    c.append(int(n_c[1]))                except ValueError:                    print(f"无效行: {line}")e = 127# 验证数据print(f"读取到 {len(n)} 个 (N, C) 对")assert len(n) >= e, f"需要至少 {e} 个 (N, C) 对,当前只有 {len(n)} 个"assert len(c) == len(n), "N 和 C 数量不匹配"indices = random.sample(range(len(n)), e)n = [n[i] for i in indices]c = [c[i] for i in indices]# 检查互素if not are_pairwise_coprime(n):    print("模数 N 不两两互素,尝试其他对")    exit(1)# 执行 CRTme = crt(c, n)print(f"CRT 结果 (me): {me}")# 开 E 次方m, exact = iroot(me, e)if exact:    flag = long_to_bytes(m).decode('utf-8')    print(f"解密结果 (整数): {m}")    print(f"Flag: {flag}")

Flag: palu{ed77d005085d4ddd94ca9aba647da50e}

7.时间循环的信使

def extract_flag(log_path):    entries = []    start_seen = False    with open(log_path, 'r') as f:        for line in f:            line = line.strip()            # 标记开始            if 'start_of_cycle' in line:                start_seen = True                continue            # 标记结束            elif 'end_of_cycle' in line:                break            # 跳过非标准格式行            if not start_seen or '|' not in line:                continue            timestamp_str, value = line.split('|', 1)            # 只保留8位全相同字符组成的值            if len(value) == 8 and all(c == value[0] for c in value):                entries.append((int(timestamp_str), value))    # 按时间戳升序排序    entries.sort(key=lambda x: x[0])    # 提取每条记录中首字符,拼接为十六进制字符串    hex_str = ''.join(v[0] for _, v in entries)    # 解码为 ASCII 字符串    flag = bytes.fromhex(hex_str).decode('utf-8')    return flag

8.时空折叠

# 提取十六进制部分(例如:00000000fe)raw_hex_matches = re.findall(r"at ([0-9a-fA-F]+) ns", log_data)# 解码逻辑处理decoded_bytes = []for hex_str in raw_hex_matches:    value = int(hex_str, 16)    low_byte = value & 0xFF    filtered = low_byte & 0x7F    decoded_byte = filtered ^ 0x0E    decoded_bytes.append(decoded_byte)# 尝试转换为字符串try:    flag_final = bytes(decoded_bytes).decode('utf-8')except Exception as e:    flag_final = f"解码失败: {e}"flag_final

9.时空交织的密语

解析时间戳

每 4 字节为一个整数,代表 UNIX 时间戳,按大端格式读取。

提取低位值

对每个时间戳取低位(timestamp % 16),即提取出“秒数”的低 4 位,转为 16 进制字符。

拼接十六进制字符串

将所有十六进制字符依次拼接,构成一个 hex 编码字符串。

去除填充噪声

根据题目提示,数据开头和结尾可能存在填充字符。对 hex 串进行修剪,移除非 ASCII 或不完整字符对。

转换为明文

将最终的十六进制串转为 ASCII,即可得到隐藏信息。

import structdef extract_flag_from_timestamps(file_path):    with open(file_path, 'rb') as f:        content = f.read()    # 将每4字节解析为大端时间戳整数    timestamps = [struct.unpack('>I', content[i:i+4])[0] for i in range(0, len(content), 4)]    # 每个时间戳对16取模,得到低位值,转为十六进制字符    hex_digits = [format(ts % 16, 'x') for ts in timestamps]    # 拼接为 hex 字符串并修剪首尾    hex_string = ''.join(hex_digits)[1:-1]    # 转为明文    try:        message = bytes.fromhex(hex_string).decode('utf-8')    except Exception:        message = "解码失败,可能存在非 UTF-8 字符"    return message# 执行flag = extract_flag_from_timestamps('timestream.bin')print("Recovered flag:", flag)

palu{Time_1s_B1nary_Whisper}

10.量子迷宫

文件编码识别

初步检查 .b85 后缀,猜测为某种 Base85 编码(可能是标准 Ascii85 或 Python 的 Base85)。

结构观察

解码后出现大量 QUBIT|0⟩ 和 QUBIT|1⟩ 的形式。可以推测这是二进制比特流的变种表达。

提取有效数据

将每个 QUBIT|x⟩ 中的 x 提取出来组成纯二进制串,然后每 8 位转为 ASCII 字符。

import base64, rewith open('quantum_log.b85', 'rb') as f:    raw = f.read()# 解码尝试:优先 Base85,失败则切换 Ascii85try:    decoded = base64.b85decode(raw)except Exception:    decoded = base64.a85decode(raw)text = decoded.decode('utf-8', errors='ignore')bits = re.findall(r"QUBIT|([01])⟩", text)bit_str = ''.join(bits)# 每8位还原字符flag = ''.join(chr(int(bit_str[i:i+8], 2)) for i in range(0, len(bit_str), 8) if len(bit_str[i:i+8]) == 8)#palu{aea437c12b149750383fe56727ec5344}

11.签到

关注公众号。。。

12.TopSecret

pdf复制扔gpt一把出

第二届Parloo杯CTF 应急响应挑战赛初赛WP

palu{You_re_a_real_50w}

13.screenshot

第二届Parloo杯CTF 应急响应挑战赛初赛WP

14.几何闪烁的秘密

分帧,有字母的组成flag

第二届Parloo杯CTF 应急响应挑战赛初赛WP

15.问卷调查

第二届Parloo杯CTF 应急响应挑战赛初赛WP

16.catbank

palu{895ce430e61e41c695435c041f315508}

转账到刚好1000000就出flag

第二届Parloo杯CTF 应急响应挑战赛初赛WP

17.catnet

第二届Parloo杯CTF 应急响应挑战赛初赛WP
第二届Parloo杯CTF 应急响应挑战赛初赛WP

改header

第二届Parloo杯CTF 应急响应挑战赛初赛WP

爆破一下

第二届Parloo杯CTF 应急响应挑战赛初赛WP
第二届Parloo杯CTF 应急响应挑战赛初赛WP

palu{68f5c24c7035470fb0a55b2a616f320e}

18.ezblog

app.jar 发现assets路由可以下载文件,直接下载源码,查看key

第二届Parloo杯CTF 应急响应挑战赛初赛WP
第二届Parloo杯CTF 应急响应挑战赛初赛WP

palu{7baaef896aba4d139b4f63208bd8f7b9}

19.PositionalXOR

# positional_xor_decrypt.pydef decrypt_positional_xor(file_path):    with open(file_path, 'rb') as f:        encrypted = f.read()    decrypted = bytes([b ^ i for i, b in enumerate(encrypted)])    try:        return decrypted.decode('utf-8')    except UnicodeDecodeError:        return decryptedif __name__ == "__main__":    flag = decrypt_positional_xor("encrypted.bin")    print("Decrypted flag:", flag)#Decrypted flag: palu{PositionalXOR_sample}

20.Asymmetric

RSA

第二届Parloo杯CTF 应急响应挑战赛初赛WP
from Crypto.Util.number import inverse, long_to_bytesdef decrypt_rsa_with_factors(factors, e, c):    """使用已知的质因数解密RSA密文"""    # 计算N    n = 1    for factor in factors:        n *= factor    print(f"计算得到的N = {n}")    # 计算欧拉函数φ(n)    phi = 1    for factor in factors:        phi *= (factor - 1)    print(f"欧拉函数φ(n) = {phi}")    # 计算私钥d    d = inverse(e, phi)    print(f"计算得到私钥d = {d}")    # 使用私钥解密    m = pow(c, d, n)    print(f"解密后的数字: {m}")    # 尝试将数字转换为ASCII字符串    try:        # 先尝试直接转换        plaintext = long_to_bytes(m).decode('utf-8')        print(f"解密后的明文: {plaintext}")        return plaintext    except:        # 如果直接转换失败,尝试处理十六进制表示        print("尝试通过十六进制解析...")        hex_text = hex(m)[2:]        if len(hex_text) % 2 == 1:            hex_text = '0' + hex_text        # 输出十六进制和二进制供参考        print(f"十六进制: {hex_text}")        print(f"二进制: {bin(m)[2:]}")        try:            # 尝试从十六进制转换为ASCII            bytes_data = bytes.fromhex(hex_text)            ascii_text = bytes_data.decode('utf-8', errors='replace')            print(f"从十六进制转换得到: {ascii_text}")            return ascii_text        except Exception as e:            print(f"十六进制转换出错: {e}")            # 尝试字节一个个转换            result = ""            try:                byte_chunks = [m.to_bytes((m.bit_length() + 7) // 8, byteorder='big')]                for chunk in byte_chunks:                    result += chunk.decode('utf-8', errors='replace')                print(f"字节转换得到: {result}")                return result            except Exception as e:                print(f"字节转换出错: {e}")                # 最后尝试查看每个字节的ASCII表示                bytes_array = m.to_bytes((m.bit_length() + 7) // 8, byteorder='big')                readable = ''.join([chr(b) if 32 <= b <= 126 else '.' for b in bytes_array])                print(f"可打印字符: {readable}")                return readable# 主函数def main():    # 给定的RSA参数和质因数    factors = [3, 47, 2287, 3101092514893, 100000000000000003]    e = 65537    c = 94846032130173601911230363560972235    # 解密过程    plaintext = decrypt_rsa_with_factors(factors, e, c)    print("n最终明文结果:", plaintext)if __name__ == "__main__":    main()# palu{3a5Y_R$A}

原文始发于微信公众号(取证与溯源):第二届“Parloo杯”CTF 应急响应挑战赛初赛WP

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年5月20日03:29:56
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   第二届Parloo杯CTF 应急响应挑战赛初赛WPhttp://cn-sec.com/archives/4081933.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息