news 2026/4/15 18:16:24

CTF之misc杂项解题技巧总结(二)——隐写术

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CTF之misc杂项解题技巧总结(二)——隐写术

CTF部落

高质量CTF社区,致力于国内网CTF比赛研究,每日分享行业最新资讯,交流解答各类技术问题。星球中可以获取各类CTF比赛信息、解题工具、技巧、书籍、各种资源,发布政府机关、企业、厂商网络安全招聘信息,及内类内推资格。所有发布的内容均精心挑选、成体系化,让你远离无用信息及零碎的知识点。

CTF之misc杂项解题技巧总结(二)——隐写术

隐写术Steganography

(一)NTFS数据流隐写

(二)base64隐写

(三)图像隐写

(四)零宽字符隐写

(五)word隐写

(六)PYC隐写

(七)音频隐写

(八)文件合成与分离

(九)BMP/PDF隐写

【附】检测工具

隐写术Steganography

(一)NTFS数据流隐写

参考NTFS数据流隐写_m0re’s blog

NTFS是微软Windows NT内核的系列操作系统支持的、一个特别为网络和磁盘配额、文件加密等管理安全特性设计的磁盘格式。NTFS比FAT文件系统更稳定,更安全,功能也更为强大。

这个NTFS数据流文件,也叫Alternate data streams,简称ADS,是NTFS文件系统的一个特性之一,允许单独的数据流文件存在,同时也允许一个文件附着多个数据流,即除了主文件流之外还允许许多非主文件流寄生在主文件流之中,它使用资源派生的方式来维持与文件相关信息,并且这些寄生的数据流文件我们使用资源管理器是看不到的。

(二)base64隐写

参考:[Base64隐写 (cltheorem.github.io)](https://cltheorem.github.io/2018/10/base64隐写/#:~:text=可以看出一串base64的编码最多也只有4bit的隐写空间,所以实现隐写往往需要大量编码串。,隐写时把明文的每个 字符用8位二进制数表示,由此将整个明文串转为bit串,按顺序填入base64编码串的可隐写位中即可实现隐写。)

题目:

Base64码表:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=

Base64是一种用64个可打印字符来表示二进制数据的方法。

base64编码
  1. 1个字节对应8个比特,一个可打印字符对应6个比特,即一个单元,将目标字串变成二进制数据流,然后6个一单元划分对应成码表的索引,用base64码表中的字符替换。

    码文c和明文m的关系为len©×6len(m)×8len©×6len(m)×8,即len©×3len(m)×4len©×3len(m)×4,那么必须码文字符串的长度必须为4的倍数,明文字符串的长度必须为3的倍数。

  2. 对于明文字符串长度不足3的倍数的情况用每一个二进制位用0 bit0 bit补足直到满足明文字符串长度为3的倍数。

    不难看出,一个base64码文最多可以有2个‘=’,最少可以没有等号(此时明文长度刚好是3的倍数)。

base64解码
  1. 把码文末端的‘=’去除

  2. 在其二进制数据的末尾丢弃最小数目的二进制位使二进制位数为8的倍数,然后8位一组进行ASCII编码。

base64隐写原理

在base64解码中,去除等号之后将末尾一些二进制位丢弃使二进制位数为8的倍数,所以一些隐藏数据可以写在可以被丢弃的部分,这部分可以随意写成任意值而不用担心影响解码的结果,同时也说明了不同的base64码文可能生成相同的明文。

下面是提取脚本

import re path = 'flag.txt' #your path b64char = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' with open(path, 'r')as f: cipher = [i.strip() for i in f.readlines()] plaintext = '' for i in cipher: if i[-2] == '=': # There are 4-bit hidden info while end with two '=' bin_message = bin(b64char.index(i[-3]))[2:].zfill(4) plaintext += bin_message[-4:] elif i[-1] == '=': # There are 2-bit hidden info while end with one '=' bin_message = bin(b64char.index(i[-2]))[2:].zfill(2) plaintext += bin_message[-2:] plaintext = re.findall('.{8}', plaintext) # 8bits/group plaintext = ''.join([chr(int(i,2)) for i in plaintext]) print(plaintext)

下面是隐写脚本

#!/usr/bin/env python import base64 with open('./gitanjali.txt', 'r')as f: data = [i.strip() for i in f.readlines()] base64Data = [base64.b64encode(i) for i in data] b64char = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' msg = 'Gitanjali' # 隐写内容,注意隐写内容不应超过最大隐写bit数 msg_bit = ''.join([bin(ord(i))[2:].zfill(8) for i in msg]) offset = 0 new_data = [] for i in base64Data: if i[-2]=='=': # There are 4-bit hidden info while end with two '=' offset = int(msg_bit[:4],2) i = i.replace(i[-3], b64char[b64char.index(i[-3])+offset]) msg_bit = msg_bit[4:] elif i[-1]=='=': # There are 2-bit hidden info while end with one '=' offset = int(msg_bit[:2],2) i = i.replace(i[-2], b64char[b64char.index(i[-2])+offset]) msg_bit = msg_bit[2:] new_data.append(i+"\n") with open('./encodeFile.txt', 'w')as f: f.writelines(new_data)

(三)图像隐写

EXIF信息隐藏

可交换图像文件格式(英语:Exchangeable image file format,官方简称Exif),是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。Exif信息是可以被任意编辑的,因此只有参考的功能。——《百度百科》

exiftool使用 exiftool查看图片属性 (yii3.cn)

有时候会出现许多文件的情况,此时想找出某一个关键的信息字段可以用下面的指令

exiftool *|grep flag #搜索当前文件夹下所有文件的exif信息中的flag字符

还有直接在图片属性的备注里给出flag,这种情况可以用010editor或者winhex等工具打开图片搜索关键字如flag、ctf等查看。

宽高修改
IHDR隐写(.png)

对.png格式的图片进行宽高的修改进而隐藏图片关键信息

import zlib import struct filename = #图片路径 crc_str= #图片的CRC值 # 同时爆破宽度和高度 with open(filename, 'rb') as f: all_b = f.read() data = bytearray(all_b[12:29]) n = 4095 for w in range(n): width = bytearray(struct.pack('>i', w)) for h in range(n): height = bytearray(struct.pack('>i', h)) for x in range(4): data[x+4] = width[x] data[x+8] = height[x] crc32result = zlib.crc32(data) #替换成图片的crc if crc32result == crc_str: print("宽为:", end = '') print(width, end = ' ') print(int.from_bytes(width, byteorder='big')) print("高为:", end = '') print(height, end = ' ') print(int.from_bytes(height, byteorder='big'))
.jpg宽高隐写

SOF0段的X_imageY_image分别记录图片的宽和高,直接修改,不用担心校验错误。

.bmp宽高隐写
IDAT隐写(.png)

图像数据块 IDAT(image data chunk):它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。

  1. 储存图像像数数据

  2. 在数据流中可包含多个连续顺序的图像数据块

  3. 采用 LZ77 算法的派生算法进行压缩

  4. 可以用 zlib 解压缩

值得注意的是,IDAT 块只有当上一个块充满时,才会继续一个新的块。一旦出现不符合这个规律的情况(有一块IDAT还没填满但紧跟其后的是一个新的块),那么就是人为添加了数据块。

破解:010 editor直接提取出数据,然后扔进zlib解压脚本(如下)里解压获得原始数据。

#! /usr/bin/env python import zlib import binascii IDAT = ".........".decode('hex') #填入dump出的IDAT数据 result = binascii.hexlify(zlib.decompress(IDAT)) print (result.decode('hex')) print (len(result.decode('hex')))
LSB隐写

原理:LSB全称Least Significant Bit,最低有效位。PNG文件中的图像像数一般是由RGB三原色(红绿蓝)组成,每一种颜色占用8位,取值范围为0x00~0xFF,即有256种颜色,一共包含了256的3次方的颜色,即16777216种颜色,人类的眼睛可以区分约1000万种不同的颜色,这意味着人类的眼睛无法区分余下的颜色大约有6777216种,LSB隐写就是修改RGB颜色分量的最低二进制位(LSB),而人类的眼睛不会注意到这前后的变化,每个像素可以携带3比特的信息

判断方法(来源于网络,谨慎参考)

参考:png文件隐写——不负责任的总结:

提取工具:

outguess隐写(.jpeg)

题目:[WUSTCTF2020]alison_likes_jojo

使用outguess实现隐写加密与解密

F5隐写
盲水印

盲水印是一种肉眼不可见的水印方式,可以保持图片美观的同时,保护资源版权。

JPHide(.jpeg)

先解压压缩JPEG图像,得到DCT系数;然后对隐藏信息用户给定的密码进行Blowfish加密;再利用Blowfish算法生成伪随机序列,并据此找到需要改变的DCT系数,将其末位变为需要隐藏的信息的值,最后把DCT系数重新压回成JPEG图片。

SilentEye(.jpeg)

(四)零宽字符隐写

参考:一个你所不知道的加密方式–零宽字符加密 - 知乎 (zhihu.com)

在线解码(需要多个网站都试试):

辨别:把目标文本粘贴到vim中

零宽字符是一种在浏览器中不打印的字符,大致相当于 display: none ,在许多文本应用中也不显示,比如邮箱、QQ、微信、文本编辑器等

html中有三种零宽字符 – 零宽空格、零宽连字、零宽不连字

零宽字符在浏览器中对应的转义字符 零宽空格 --- ​ 零宽不连字 --- ‌ 零宽连字 --- ‍

零宽字符在Unicode中的编码为

\u200B \u200C \u200D

(五)word隐写

  1. word中隐藏字段:在Word中选中要隐藏的字段,右击选择字体选项,在效果一栏中有隐藏选项,选中后即可隐藏。默认情况下隐藏文字是不会被打印出来的。

    破解:如果想知道是否有隐藏文本,可在文件选项中单击文件→选项→显示文件→选项→显示,在始终在屏幕上显示这些格式标记标签下选择隐藏文字复选框,即可查看,打印选项标签勾选打印隐藏文字即可打印。或者在保存文件后选择文件→检查→检查文件文件→检查→检查文件,查看是否有隐藏文字。

  2. **白色背景下的白字无法被识别出有隐藏的文字 **。

    破解:

  1. word中隐藏图片:word中插入的图片分为嵌入式和非嵌入式,区别在嵌入式会跟着文本的位置产生移动,即有回车后,图片下移。但非嵌入的不会跟着文本走,即有回车后,图片保持原位置不动。

    word改后缀名为zip然后解压

(六)PYC隐写

参考:pyc文件 - CTF Wiki (ctf-wiki.org)

原理是在 python 的字节码文件中,利用冗余空间,将完整的 payload 代码分散隐藏到这些零零碎碎的空间中。

例如,从 Python 3.6开始,有一个较大的改变,就是不管 opcode 有没有参数,每一条指令的长度都两个字节,opcode 占一个字节,如果这个 opcode 是有参数的,那么另外一个字节就表示参数;如果这个 opcode 没有参数,那么另外一个字节就会被忽略掉,一般都为00。

Stegosaurus 是一款隐写工具,它允许我们在 Python 字节码文件 (pyc 或 pyo) 中嵌入任意 Payload。由于编码密度较低,因此我们嵌入 Payload 的过程既不会改变源代码的运行行为,也不会改变源文件的文件大小。Payload 代码会被分散嵌入到字节码之中,所以类似 strings 这样的代码工具无法查找到实际的 Payload。Python 的 dis 模块会返回源文件的字节码,然后我们就可以使用 Stegosaurus 来嵌入 Payload 了。

(七)音频隐写

DeepSound隐写

DeepSound 是一种隐写术工具和音频转换器,可将秘密数据隐藏到音频文件中。该应用程序还使您能够直接从音频文件或音频 CD 曲目中提取秘密文件。DeepSound 可用作 wave、flac、wma、ape 和音频 CD 的版权标记软件。DeepSound 还支持使用 AES-256(高级加密标准)加密机密文件以提高数据保护。该应用程序还包含一个易于使用的音频转换器模块,可以将多种音频格式(FLAC、MP3、WMA、WAV、APE)编码为其他格式(FLAC、MP3、WAV、APE)。

DeepSound 2.0 Free Download (soft112.com)

MP3stego隐写

MP3stego是命令行工具(也有图形界面的)

decode -X -P <your password> <your encoded filename>
SilentEye隐写

https://sourceforge.net/projects/silenteye/

(八)文件合成与分离

binwalk:可快速分辨文件是否由多个文件合并而成,并将文件进行分离。如果分离成功会在目标文件的目录。

分析文件:binwalk filename

分离文件:binwalk -e filename

formost命令:formost filename -o 输出的目录名

dd:当文件自动分离出错或者因为其他原因无法自动分离时使用

(九)BMP/PDF隐写

提取工具:wbStego Steganography Tool (bailer.at)

针对.bmp/.pdf隐写,得到的_is文件用notepad++打开

【附】检测工具

stegdetect

stegdetect 用来检测jpg类型的图片是否隐藏着其他文件或内容。它可以检测到通过JSteg、JPHide、OutGuess、Invisible Secrets、F5、appendX和Camouflage等这些隐写工具隐藏的信息。

安装:

推荐在linux环境下,下载stegdetect 源码包之后进入其目录,执行下面指令

linux32 ./configure linux32 make

使用stegdetect时会有一些参数,下面简单罗列一下:

常用指令

stegdetect.exe -tjopi -s 10.0 hide.jpg

网络安全学习路线&学习资源

网络安全的知识多而杂,怎么科学合理安排?

下面给大家总结了一套适用于网安零基础的学习路线,应届生和转行人员都适用,学完保底6k!就算你底子差,如果能趁着网安良好的发展势头不断学习,日后跳槽大厂、拿到百万年薪也不是不可能!

初级网工

1、网络安全理论知识(2天)

①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)

2、渗透测试基础(一周)

①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等

3、操作系统基础(一周)

①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)

4、计算机网络基础(一周)

①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现

5、数据库基础操作(2天)

①数据库基础
②SQL语言基础
③数据库安全加固

6、Web渗透(1周)

①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)

恭喜你,如果学到这里,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web 渗透、安全服务、安全分析等岗位;如果等保模块学的好,还可以从事等保工程师。薪资区间6k-15k

到此为止,大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗?

【“脚本小子”成长进阶资源领取】

7、脚本编程(初级/中级/高级)

在网络安全领域。是否具备编程能力是“脚本小子”和真正黑客的本质区别。在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制的脚本工具来实现各种目的,更是需要拥有编程能力.

零基础入门,建议选择脚本语言Python/PHP/Go/Java中的一种,对常用库进行编程学习; 搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP, IDE强烈推荐Sublime; ·Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,不要看完; ·用Python编写漏洞的exp,然后写一个简单的网络爬虫; ·PHP基本语法学习并书写一个简单的博客系统; 熟悉MVC架构,并试着学习一个PHP框架或者Python框架 (可选); ·了解Bootstrap的布局或者CSS。

8、超级网工

这部分内容对零基础的同学来说还比较遥远,就不展开细说了,贴一个大概的路线。感兴趣的童鞋可以研究一下,不懂得地方可以【点这里】加我耗油,跟我学习交流一下。

网络安全工程师企业级学习路线

如图片过大被平台压缩导致看不清的话,可以【点这里】加我耗油发给你,大家也可以一起学习交流一下。

一些我自己买的、其他平台白嫖不到的视频教程:

需要的话可以扫描下方卡片加我耗油发给你(都是无偿分享的),大家也可以一起学习交流一下。

网络安全学习路线&学习资源

结语

网络安全产业就像一个江湖,各色人等聚集。相对于欧美国家基础扎实(懂加密、会防护、能挖洞、擅工程)的众多名门正派,我国的人才更多的属于旁门左道(很多白帽子可能会不服气),因此在未来的人才培养和建设上,需要调整结构,鼓励更多的人去做“正向”的、结合“业务”与“数据”、“自动化”的“体系、建设”,才能解人才之渴,真正的为社会全面互联网化提供安全保障。

特别声明:

此教程为纯技术分享!本书的目的决不是为那些怀有不良动机的人提供及技术支持!也不承担因为技术被滥用所产生的连带责任!本书的目的在于最大限度地唤醒大家对网络安全的重视,并采取相应的安全措施,从而减少由网络安全而带来的经济损失!!!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/11 23:23:51

基于时间片轮转和SJF的进程调度系统的模拟设计2操作系统C++(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

基于时间片轮转和SJF的进程调度系统的模拟设计2操作系统C(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码项目完整源代码详细报告文档exe文件C语言368行代码火]核心功能提供用户输入接口&#xff0c;创建至少5个进程&#xff0…

作者头像 李华
网站建设 2026/4/1 6:06:13

基于matlab的手写数字识别系统(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

基于matlab的手写数字识别系统(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码基于MATLAB的手写数字识别系统 涉及算法:图像采集&#xff0c;灰度化处理&#xff0c;二值化处理&#xff0c;图像归一化&#xff0c;图像去噪和特…

作者头像 李华
网站建设 2026/4/9 20:09:26

零基础也能用!cv_unet_image-matting镜像实测,批量抠图效果惊艳

零基础也能用&#xff01;cv_unet_image-matting镜像实测&#xff0c;批量抠图效果惊艳 1. 引言&#xff1a;为什么你需要一个智能抠图工具&#xff1f; 你有没有遇到过这种情况&#xff1a;手头有一堆产品图或人像照片&#xff0c;背景杂乱&#xff0c;想换底色却不会PS&…

作者头像 李华
网站建设 2026/4/15 14:36:28

Llama3-8B API调用失败?常见错误排查指南

Llama3-8B API调用失败&#xff1f;常见错误排查指南 1. 为什么Llama3-8B的API调用总在关键时刻掉链子&#xff1f; 你刚部署好 Meta-Llama-3-8B-Instruct&#xff0c;vLLM 启动顺利&#xff0c;Open WebUI 界面也打开了&#xff0c;输入“Hello”能回话&#xff0c;一切看起…

作者头像 李华
网站建设 2026/4/15 17:59:41

亲测BSHM人像抠图镜像,效果惊艳,换背景超简单

亲测BSHM人像抠图镜像&#xff0c;效果惊艳&#xff0c;换背景超简单 最近在做图像处理项目时&#xff0c;遇到了一个刚需&#xff1a;快速、精准地把人像从原图中“抠”出来&#xff0c;用于更换背景、制作海报或者视频特效。市面上的工具要么操作复杂&#xff0c;要么边缘处…

作者头像 李华
网站建设 2026/4/11 11:47:46

CMPTA:预训练大模型在多模态情感分析任务中的应用研究

导读&#xff1a; 大语言模型(LLMs)在自然语言处理领域取得了显著进展&#xff0c;但将其有效迁移至多模态情感分析(MSA)任务仍面临巨大挑战。主要难点在于如何弥合异构模态(如视觉、音频)特征与预训练文本大模型语义空间之间的鸿沟。现有方法多依赖复杂的深度融合网络或昂贵的…

作者头像 李华