ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

CTF杂项题soul sipse复盘:从伪加密到音频图片隐写

CTF杂项题soul sipse复盘:从伪加密到音频图片隐写 每次聊到CTF里的杂项题我总会想起[GUET-CTF2019]soul sipse这道题。它不算难但踩点特别全下载下来是一个压缩包解开之后又是一张图片和一段音频最后还藏了一手steghide隐写和编码转换。对刚入门CTF的同学来说这一题跑通基本就把杂项题最常见的几条路都摸了一遍对老手来说也能顺便想想自己是不是拿到附件就习惯性双击、习惯性看后缀名。下面这版思路是我在自己机器上复现时走通的流程工具以Kali自带为主Windows下也有对应替代品整体不依赖特定平台。1. 拿到附件先别急给压缩包做一轮“体检”1.1 建好工作目录记录文件哈希很多新手拿到题目附件第一反应是双击打开这其实是最容易带偏节奏的动作。杂项题里文件名、后缀名、图标都可以伪装甚至压缩包里套压缩包、图片里塞压缩包都是常态。我的习惯是先建一个干净的工作目录比如~/ctf/soul_sipse/把附件复制进去再算一下哈希值记录下来。sha256sum这一步看起来多余但在题目环境里很有用一方面能确认文件下载过程没有损坏另一方面如果后面你修改了文件、解压出了多个同名文件可以靠哈希回溯原始状态。我当时下载到的附件叫soul_sipse.zip大小只有几十KB第一眼感觉就是一道轻量级隐写题。先跑file命令看真实类型再跑binwalk看有没有嵌套文件最后用strings扫一遍可见字符串。这套组合拳做完心里大概就有底了。1.2 file命令后缀名说了不算file是这个流程里最该养成肌肉记忆的命令。它不看后缀名而是读文件头部特征比如ZIP文件头是50 4B 03 04PNG文件头是89 50 4E 47JPEG是FF D8 FF。很多CTF题会把压缩包后缀改成图片或者反过来直接用file就能看穿。$ file soul_sipse.zip soul_sipse.zip: Zip archive data, at least v2.0 to extract确定是ZIP后先别急着解压。我用binwalk扫了一遍发现没有明显的嵌套文件。binwalk在杂项题里是“套娃检测器”经常能在PNG或JPG尾部扫出另一个压缩包、磁盘镜像之类的东西。如果附件本身就是ZIPbinwalk的结果通常比较干净但这步不能省因为有些出题人会往ZIP末尾追加额外数据只有binwalk或foremost这类工具能把它分离出来。strings也顺手跑一下$ strings soul_sipse.zip | head -20ZIP里的文件名一般是可见的所以strings能看到1.wav、2.png这类压缩成员名但看不到文件内容。如果看到明显的flag字样或奇怪的base64那说明出题人手动把一个文件塞进了ZIP而不是用压缩工具打包的这种情况后面处理方式完全不同。1.3 题目名称也是线索但别过度解读soul sipse这个英文名看起来不太像正常单词。一开始我以为是某个单词的倒序比如espis之类还试着做凯撒移位折腾了一会儿没结果。后来我悟了有些赛题的命名就是出题人随手玩梗真正有用的线索不会只写在名字里。与其在命名上猜来猜去不如先把文件层面的信息挖干净。不过名字也不是完全没用。这道题里音频频谱中藏的口令正好就是soulsipse说明出题人把关键的隐写密码变成了题目名。这算是一种很典型的提示方式让题目名承担“口令提示”的角色但不直接告诉你它是密码需要你从音频或图片里找到对应关系。环境方面我建议准备这些Kali Linux或WSL、Audacity、7-Zip、010 Editor或HxD、zsteg、Stegsolve、steghide、fcrackzip外加一个CyberChef或“随波逐流”这类编码工具。这套组合基本覆盖了杂项题90%的日常需求。2. ZIP需要密码先判断伪加密再决定要不要爆破2.1 用unzip探路用zipinfo看加密位unzip soul_sipse.zip的时候直接弹出了密码提示。这时候不要立刻掏字典爆破先冷静判断一下是真加密还是伪加密。伪加密是CTF里非常常见的考点ZIP文件头里有一个“加密标志位”置1表示需要密码但压缩数据本身并没有真正加密。只要把这个标志位改回0文件就能正常解压。在Linux下我一般先用zipinfo -v看ZIP的详细结构$ zipinfo -v soul_sipse.zip重点看每个文件条目里的file encryption和general purpose bit flag。如果显示encryption或bit flag包含0x0001说明加密位被置上了。再看中央目录里是否有对应的加密字段。判断伪加密最直接的办法是用十六进制编辑器打开ZIP找本地文件头50 4B 03 04和中央目录文件头50 4B 01 02检查偏移6处的两个字节。如果这个值是00 00正常如果是01 00、09 00之类加密位就是1。2.2 伪加密的判定与解除操作ZIP的通用位标记是两字节最低位bit 0为1代表加密bit 3为1代表使用了数据描述符。很多出题人喜欢把09 00或01 00当作伪加密标志直接改成00 00就能绕过密码。我用010 Editor打开soul_sipse.zip搜索二进制50 4B 03 04定位到第一个本地文件头。偏移结构是50 4B 03 04占4字节随后是“版本”“通用位标记”“压缩方式”“时间”“日期”“CRC”“压缩后大小”“压缩前大小”“文件名长度”“扩展字段长度”其中通用位标记在文件头偏移6的位置。把那里的09 00改成00 00保存。改完后重新解压$ unzip soul_sipse.zip Archive: soul_sipse.zip extracting: 1.wav extracting: 2.png如果改完能正常解压说明这确实是伪加密如果解压到一半报CRC failed或invalid compressed data说明压缩数据本身真的被加密了这时才需要去跑字典爆破。我见过不少新手一看到要密码就直接开始fcrackzip跑了一整夜没结果最后发现只是09 00变成00 00的事。先判断再动手能省下大把时间。2.3 如果真加密字典爆破怎么选词顺手说一下真加密的情况。真加密的ZIP用fcrackzip算是最快的$ fcrackzip -D -p /usr/share/wordlists/rockyou.txt -u soul_sipse.zip-D表示字典模式-p指定字典路径-u表示尝试解压来验证密码是否正确。有些题目的密码是纯数字可以用-b暴力模式配合字符集fcrackzip -b -c aA1! -l 1-8 -u。不过纯暴力对于8位以上密码基本不现实CTF题里出现真加密时密码一般藏在文件名、图片注释或题干描述里而不是让你硬跑。解压出的两个文件我用file验证了一下$ file 1.wav 1.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, stereo 44100 Hz $ file 2.png 2.png: PNG image data, 960 x 540, 8-bit/color RGBA, non-interlaced一个标准WAV一个标准PNG。到这里题目已经从“压缩包”阶段进入到“音频图片隐写”阶段后面的重点全在信息提取上。3. 音频隐写分析Audacity里不止有波形3.1 先听再看波形里往往有线索WAV文件先丢进Audacity。别急着关掉先播放一遍听一听。这道题的音频听起来不像正常音乐更像是一段被处理过的噪声中间偶尔有一些细微的“滴答”声。单纯用耳朵听基本得不到有效信息但是听一遍能帮助判断音频类型如果是明文的摩斯码你会听到明显的长短音如果是SSTV会听到类似传真机的尖锐声音如果只是噪声大概率信息藏在频谱或LSB里。把波形放大看幅度包络没有特别明显的规则脉冲所以这道题不在时域波形上做文章。接下来重点看频谱。3.2 频谱图里抄出一段摩斯密码在Audacity里把视图切换到Spectrogram常见路径是View - Spectrogram。刚切过去时可能是一团模糊的色块这时候不要灰心去Spectrogram Settings把窗口大小Window size调到2048或4096FFT分辨率越高频率上的细节越清晰。再把显示颜色调成对比明显的方案就能看到频谱中间有一段由窄条和宽条组成的图案眼熟的人马上就能认出这是摩斯码。摩斯码的特征说穿了很简单一个短音对应.一个长音对应-字符间有明显的间隔。我在频谱图里用鼠标选中一段仔细看节奏抄下来是... --- ..- .-.. ... .. .--. ... .这段用摩斯码逐字符解得到的就是soulsipse。点划节奏如果抄错后面密码就会对不上。这里有个小技巧用Audacity的选区工具把每一段分别框选边放大边记录不要靠肉眼扫一遍就完事。摩斯码中间字符间隔比点间间隔宽只要不是急着赶时间基本不会看错。抄出soulsipse后我一度以为这就是flag的一部分但尝试直接提交显然不对。后来想到题目名就叫soul sipse说明它更像一个口令或提示而不是最终flag。这个怀疑最终在图片隐写环节得到了验证。3.3 音频隐写的其他常见套路SSTV/DTMF顺便把音频隐写的常见套路梳理一下。除了频谱里藏摩斯码CTF里还经常出现SSTV慢扫描电视、DTMF电话按键音、反向音频、音频LSB、相位差等玩法。SSTV会把一张图片编码成一长段尖锐的音频解码工具常用RX-SSTV或MMSSTV把音频播放给软件就能还原出图片图片里往往直接写着flag。DTMF则是电话按键产生的双音多频信号每个键对应两个频率组合可以用频谱或DTMF解码器转成数字串。判断依据很简单SSTV音频通常有规律重复的同步头听感类似传真机DTMF则是一连串短促的按键音。如果波形、频谱都没有明显图案还能试试把音频反相、左右声道相减有时两个声道的差异里藏着另一段信息。这道题只用到了频谱摩斯但知道这些衍生玩法对打CTF新人赛很有帮助因为很多入门题就是从这几个套路里轮换出题。4. 图片隐写用steghide把隐藏文件“钓”出来4.1 排除LSBzsteg和Stegsolve先扫一遍拿到2.png第一反应是看图片本身。用图片查看器打开是一张看起来无关紧要的图没有任何可见文字。接着跑zsteg这个工具专门检测PNG和BMP的LSB隐写、IDAT隐写等$ zsteg 2.png如果LSB里藏了数据zsteg会输出一些可打印字符串或文件特征。我扫描之后没有发现直接可用的文本说明这道题大概率不走LSB路线。再用Stegsolve打开逐通道、逐位翻看也没有看到明显的二维码或文字。这轮排查的意义在于排除“图片直接藏信息”的可能。很多新手做完LSB没发现东西就停下其实图片隐写除了像素位操作还有一类基于“文件嵌入”的做法也就是把隐藏文件写进图片的多余区域需要专用工具提取。这时候就要想到steghide。4.2 steghide需要口令音频密码派上用场steghide是一个常见的隐写工具能把文件藏进JPEG、PNG、WAV等文件里。它跟你交互的时候需要口令这口令不一定在图片里可能在题目其他文件里。先用无口令状态测试$ steghide info 2.png输入空口令后工具提示could not extract any hidden data。这个提示很迷惑人它既可能是真的没有隐藏文件也可能是口令错误导致提取失败。结合之前音频里抄出的soulsipse我决定把soulsipse当作口令再试一次$ steghide info 2.png -p soulsipse如果口令匹配steghide info会列出嵌入的文件信息比如文件名flag.txt、大小、加密算法等。随后提取$ steghide extract -sf 2.png -p soulsipse wrote extracted data to flag.txt.目录下多了一个flag.txt说明整条链路走通了。到这一步前面所有的铺垫都有了意义压缩包伪加密是为了让选手接触到音频音频频谱里的摩斯码是为了给图片隐写提供口令图片隐写则藏着真正的flag文件。一题三关环环相扣。4.3 为什么密码不对时工具不直接报错steghide跟普通解压软件不太一样它不会在你输错口令时明确告诉你“Wrong Password”而是统一提示无法提取数据。原因在于steghide的解密机制它用口令生成一个密钥流然后按这个密钥流去文件数据区搜索嵌入文件头的签名。口令不对时扫描结果就是找不到可验证的嵌入数据所以只能给出模糊的失败提示。这个特性经常坑人。如果你不知道音频里藏着口令面对“could not extract any hidden data”很可能就换一个方向直接放弃图片隐写。所以遇到这种情况一定要回头想想题目里有没有哪个字符串看起来像口令文件名、题目名、图片属性、音频频谱都可能是口令来源。5. 最后一步是剥编码从Base64到flag5.1 识别字符串是Base64还是Hexflag.txt打开后不是明文flag而是一串看起来没什么规律的字符。很多CTF题最后都会留一道“编码关”目的就是让选手不能一眼看到答案。识别编码类型有迹可循。Base64最常见的特征是字符集只包含A-Z、a-z、0-9、、/末尾可能有号补位。如果你看到一串以ZmxhZ3开头的字符串基本可以断定是Base64因为ZmxhZ3正好是flag三个字母的Base64编码。Hex字符串则只包含0-9a-f长度一般是偶数看起来像666c61677b...实际上666c6167就是flag的十六进制。5.2 用命令行和CyberChef逐层解码我在flag.txt里看到的是一段Base64先在Linux命令行里验证$ cat flag.txt ZmxhZ3tzMHVsX3MxcHNlX3MxbXBsZV9tMXNjfQ $ echo ZmxhZ3tzMHVsX3MxcHNlX3MxbXBsZV9tMXNjfQ | base64 -dbase64 -d解出来如果依然是乱码那就把结果继续识别是Hex就转Hex是URL编码就unquote是凯撒就暴力移位。我这次解出来直接是flag{...}格式说明编码层数不多。有的题喜欢套两层、三层比如先Base64再Hex再凯撒或者反过来。这时候用CyberChef的Magic功能可以自动识别常见编码也能拖拽模块手动一步步解。国产的“随波逐流CTF编码工具”也内置了大量解码模块适合赛场上快速尝试。5.3 CTF里常见的“编码套娃”套路“编码套娃”是杂项题最后的常用考点。常见组合有Base64Base64、Base64Hex、Hex凯撒、URL编码Base64、摩斯Base64、Ook/Brainfuck转文本等。Ook和Brainfuck这类字符型编程语言也常被当作编码题特征是只有几种重复符号比如Ook. Ook? Ook!以及 - [ ] . ,。处理“套娃”时我习惯每解一层就把结果单独保存成一个文件并在旁边标注用了什么解码方式。一旦解出flag{立刻停止如果连续解了三层还是乱码可能方向错了要回头看看是不是需要先反转字符串、倒序文件内容或者对字符做大小写变换再解码。这场编码战里最忌讳的就是手速太快、不保留中间结果。看到疑似Base64就直接在线工具解结果被URL编码卡住反复粘贴也看不到过程很容易陷入“以为自己在解题其实在猜答案”的状态。保持中间过程可追溯永远是杂项题的高效姿势。6. 常见问题排查与杂项题速查表6.1 我踩过的几个坑这道题我第一次做的时候在ZIP解压阶段浪费了很长时间。看到要密码就直接上了fcrackzip用rockyou字典跑了几分钟没出结果后来才意识到是伪加密。改标志位的时候又因为忘了备份改错了一个字节导致整个压缩包打不开只能重新下载附件。所以现在遇到要密码的压缩包我第一件事永远是先看加密标志位不会急着爆破修改文件前也一定先留一个原始副本。音频频谱阶段也踩过坑。Audacity默认的频谱图窗口大小偏小如果直接截图抄摩斯码点划边界很模糊容易把.看成-。把Window size调到4096之后清晰度明显提升。另外摩斯码识别时最好用选区工具把每个字符间隔框出来而不是靠肉眼数点划否则短音和长音的相对长度很容易被视觉误差影响。最后是steghide的坑。我第一次提取失败后以为是图片被二次压缩导致嵌入数据损坏差点放弃。后来想起网上下载的题目图片可能被论坛重新压缩过于是从原始ZIP重新解压用未修改过的2.png再试才顺利提取出flag.txt。这个细节提醒我做题时最好始终基于原始附件不要用被工具“优化”过的文件。6.2 一张表备查工具与适用场景工具适用场景关键命令/操作file识别文件真实类型file 附件名binwalk检测并分离嵌套文件binwalk -e 附件名strings提取文件中的可见字符串strings 附件名010 Editor / HxD查看和修改十六进制找50 4B 03 04改加密位fcrackzipZIP真加密字典爆破fcrackzip -D -p 字典 -u 文件Audacity波形、频谱、摩斯、DTMFView - SpectrogramzstegPNG/BMP的LSB隐写zsteg 文件名Stegsolve图像各通道、位平面分析手动翻看steghideJPEG/PNG/WAV隐写提取steghide extract -sf 文件CyberChef / 随波逐流编码解码套娃Magic自动识别这张表不需要背下来但建议打印出来或者放在收藏夹。做得多了会发现杂项题翻来覆去就是这些工具的排列组合。6.3 把做题顺序固定成肌肉记忆我自己总结的杂项题通用顺序是先file再strings再binwalk再用十六进制编辑器看结构如果附件是压缩包先判断真假加密如果是音频先听、再看波形、再看频谱如果是图片先看原图、再查LSB、再查隐写工具最后所有提取出来的字符串都走一遍编码识别。这套流程不一定每次都能一步到位但至少能帮你避免最蠢的无头苍蝇式搜索。对于刚入门CTF的同学我真的建议拿soul sipse这种题做“流程训练”。它没有复杂的漏洞利用也不依赖某个特定赛事环境纯粹是在考你有没有把基础操作练熟。把这一题从头到尾自己走一遍比你不停刷十几道同类型但答案直接的题目要管用得多。最后再分享一个小技巧做杂项题时每拿到一个中间结果就在文件名里加上当前状态比如1.wav_original、2.png_unmodified、flag.txt_b64。这样一旦后面的操作出了问题你能随时回到上一个“干净状态”不会因为反复修改导致线索丢失。这道题我后来复现过很多次每次按照“体检-解压-音频-图片-编码”的顺序走半小时内都能通但第一次因为没有固定流程硬是折腾了一晚上。希望这篇记录能让你少走我走过的那段弯路。
返回列表