CTF数据安全学习:杂项第一课,从识破伪装开始
原创
allby森林之家
allby森林之家
allby森林之家
2026年11月6日 17:50
福建
去阅读
打 CTF 杂项题,最憋屈的死法是什么?
那就是把题(文件)下载下来后,发现双击怎么都打不开——题都打不开还做个毛?!
这道题未必难,或许是一个没有后缀的文件,或者是一个\"图片\",但你却卡死在了关卡的入口,对CTF望而远之……
我见过太多人栽在这儿,没关系,今天看完这篇文,就带你打开这座故弄玄虚、装神弄鬼的安全大门!
这一步其实有个标准的钥匙答案,那就是:后缀会说谎,但文件头不会。
【渗透测试与技术学习仅限授权环境与靶场,这是红线。】
文件头是什么?
每个文件的开头几个字节,是这套格式的\"身份证\",行话叫魔数(Magic Number)。
PNG 永远以 89 50 4E 47 0D 0A 1A 0A 开头;JPEG 永远是 FF D8 FF;ZIP 是 50 4B 03 04;gzip 是 1F 8B
不管后缀改成什么、文件名起得多清纯,前几个字节都骗不了人,所以解题第一步,那就是别信后缀,直接看头部(file 命令干的就是这件事)
binwalk 更狠一点,它不止看头部,还会把整个文件从头扫到尾,把所有魔数出现的位置全列出来(这里提一嘴,出题人有个惯用爱好:那就是把一个 ZIP 拼在 PNG 屁股后面)
扔进扫描器,输出如下:
题目B:没有后缀的49字节乱码
第二题更进一步:一个叫 no\_extension 的文件,什么后缀都没有,记事本打开全是乱码。
扫描器输出:
但扫描器扫出来的东西就多了:
手写扫描器,核心就几十行
把今天的主角放出来。魔数表 + 两个函数,一目了然:
MAGIC = [
(b'\\x89PNG\\r\
\\x1a\
', 'PNG image'),
(b'\\xff\\xd8\\xff', 'JPEG image'),
(b'PK\\x03\\x04', 'ZIP archive'),
(b'\\x1f\\x8b', 'gzip stream'),
# ... 按需扩展
]
def head_type(data): # file 的逻辑
for sig, name in MAGIC:
if data.startswith(sig):
return name
def scan_all(data): # binwalk 的逻辑
hits = []
for sig, name in MAGIC:
start = 0
while True:
i = data.find(sig, start)
if i < 0: break
hits.append((i, name))
start = i + 1
return sorted(hits)
head\_type 看开头,scan\_all 扫全文。如果要带去比赛,再往 MAGIC 表里补全几十个常见魔数,然后给 offset 附近加一段 hexdump 预览,就算是一个能进考场的自用工具了~
有个提醒要说下:就算扫出多个魔数也不一定都是拼接!JPEG 内部就天然含有长得像压缩流的字节序列,会有误报。位置对不对,要结合文件大小和结构合理性自己判断
工具只报坐标,判断还在于人!So要记住:工具给你的是线索,最后破题还得靠你自己的脑子。
【所有实验文件均为本地构造的演示靶题,仅用于教学,这是红线。】
【小彩蛋】评论区的各位萌新可以猜个数:一张 1080P 的图,理论上能塞下多少个字符的 flag?
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论