密码挑战 CTF crypto 100 分 未解 动态分:初始 100 分,已解 0 队,最低 25...
Criado em: 22 de maio de 2026
Respondido usando GPT-5.5 Thinking por Chat01
Criado em: 22 de maio de 2026
Respondido usando GPT-5.5 Thinking por Chat01
密码挑战
CTF
crypto
100 分
未解
动态分:初始 100 分,已解 0 队,最低 25 分,当前 100 分。
pythonimport os, pathlib, stat, mimetypes, json, subprocess, textwrap, zipfile, tarfile, gzip, shutil, sys, hashlib, binascii p='/mnt/data/zip (1)' print(os.path.exists(p), os.path.getsize(p)) print(open(p,'rb').read(16)) print(mimetypes.guess_type(p))
pythonimport zipfile, os, pathlib, shutil, subprocess, json, textwrap, binascii src='/mnt/data/zip (1)' out='/mnt/data/chal' shutil.rmtree(out, ignore_errors=True) os.makedirs(out, exist_ok=True) with zipfile.ZipFile(src) as z: print(z.namelist()) z.extractall(out) for root, dirs, files in os.walk(out): for f in files: fp=os.path.join(root,f) print(fp, os.path.getsize(fp), open(fp,'rb').read(80))
pythonfp='/mnt/data/chal/╕╜╝■.txt' data=open(fp,'rb').read() print(data.decode('utf-8','replace'))
pythonSstr='1002773875431658367671665822006771085816631054109509173556585546508965236428620487083647585179992085437922318783218149808537210712780660412301729655917441546549321914516504576' k=len(Sstr) S=int(Sstr) k, S % (2**min(k,200)) (175, 0)
pythonfrom math import log2 M=5**k inv=pow(2, -10000, M) r=(S*inv)%M print(k, M.bit_length(), r.bit_length()) print(r) b=r.to_bytes((r.bit_length()+7)//8,'big') print(len(b), b) print(b.decode(errors='replace')) # verify N=r << 10000 print(str(N).endswith(Sstr)) print(len(str(N)), str(N)[-200:]) print(len(b))
解出来了,flag 是:
textTSGCTF{0K4y_Y0U_are_r3aDy_t0_Go_aNd_dO_M0r3_CryPt}
核心思路:
题目给的是:
pythonassert(str(int.from_bytes(flag, 'big') << 10000).endswith(S))
也就是:
textflag_int * 2^10000 ≡ S mod 10^k
其中 k = len(S) = 175。
因为:
text10^k = 2^k * 5^k
且 S 可以被 2^175 整除,所以只需要在模 5^175 下求解:
textflag_int ≡ S * inverse(2^10000, 5^175) mod 5^175
恢复脚本:
pythonS = int("1002773875431658367671665822006771085816631054109509173556585546508965236428620487083647585179992085437922318783218149808537210712780660412301729655917441546549321914516504576") k = 175 M = 5 ** k flag_int = S * pow(2, -10000, M) % M flag = flag_int.to_bytes((flag_int.bit_length() + 7) // 8, "big") print(flag.decode())
输出:
textTSGCTF{0K4y_Y0U_are_r3aDy_t0_Go_aNd_dO_M0r3_CryPt}