第一讲 信息隐写
一、stegsolve使用方法
Stegsolve使用方法(是因为ctf题总是遇到并且目前百度没有十分详细的探究说明)
这个没什么好说的,打开文件 ,保存,退出
在分析里面从上到下的依次意思是
File Format:文件格式
Data Extract:数据提取
Steregram Solve:立体试图 可以左右控制偏移
Frame Browser:帧浏览器
Image Combiner:拼图,图片拼接
用法(使用场景)
1.File Format:这里你会看见图片的具体信息有时候有些图片隐写的flag会藏在这里
2.Data Extract:(好多涉及到数据提取的时候,很多博主在wp中都是一带而过,小白们还以为要一个个试。。)
左边一大部分主要是讲了RGBA(Alpha是透明度)的颜色通道
为了方便理解我们分开说
RGB是红绿蓝 但他们的值代表的实际上是亮度
R的数字越大,则代表红色亮度越高;R的数字越小,则代表红色亮度越低。G,B同理
R的亮度各有256个级别,GB同理。即从0到255,合计为256个。从数字0到255的逐渐增高,我们人眼观察到的就是亮度越来越大,红色、绿色或蓝色越来越亮。然而256是2的8次方 所以你会看见上图的7~0 一共8个通道
而Alpha就是透明度 该通道用256级灰度来记录图像中的透明度信息,定义透明、不透明和半透明区域
alpha的值为0就是全透明,alpha 的值为 255 则表示不透明
因此左半部分就理解了
右半部分就是Extra By(额外的)和Bit Order(位顺序)和Bit Plane Order(位平面的顺序)
1).Extra By(额外的):分为row(行)和column(纵)
每个像素用R,G,B三个分量表示,那么一张图片就像一个矩阵,矩阵的每个单位就是(0~255,0~255,0~255)
也就会有是纵排列和行排列了,一般事先访问行再访问列(如果相反会引起ve使用方法)
2).Bit Order(位顺序):MSB是一串数据的最高位,LSB是一串数据的最低位。
3).Bit Plane Order(位平面的顺序)
整个图像分解为8个位平面,从LSB(最低有效位0)到MSB(最高有效位7)随着从位平面0 到位平面7,位平面图像的特征逐渐变得复杂,细节不断增加。(一般我们的图片如果是RGB那么就是24位 3乘8嘛)
4)Bit Plane Order(位平面的顺序):一般图片是24位 也就是3个8 大家可以想像成三明治 比如BGR就是B为三明治第一层 G为第二层 R为第三层。
3.Steregram Solve:立体试图 可以左右控制偏移 可以放张图片试一下就知道这个是什么意思了
4.Frame Browser:帧浏览器 主要是对GIF之类的动图进行分解,把动图一帧帧的放,有时候会是二维码
5.Image Combiner:拼图,图片拼接(意思显而易见)
接下来会带大家实战去深入理解一下Data Extract里面ctf经常用到的LSB隐写
这个我们之前介绍的很详细
而LSB隐写就是修改RGB颜色分量的最低二进制位也就是最低有效位(LSB),而人类的眼睛不会注意到这前后的变化,(人类的眼睛只能识别一部分颜色的变化)
如果我们修改lsb那么颜色依然和没修改的一样,并且修改的话每个像数可以携带3比特的信息。
这个作用是在于把最低位的二进制全部提取出来
这个作用在于对提取出来的最低位使用lsb解码算法
二、PNG文件结构
1、PNG文件简介
中文名 | 便携式网络图形 | 类型 | 无损压缩的位图片形格式 |
---|---|---|---|
英文名 | Portable Network Graphics(PNG) | 设计目的 | 试图替代GIF和TIFF文件格式 |
2、PNG文件结构
PNG图像格式文件由一个8字节的PNG文件署名域和按照特定结构组织的3个以上的*数据块(chunk)*组成。
PNG文件署名域 | PNG数据块 | PNG数据块 | ... | PNG数据块 |
---|---|---|---|---|
1)、PNG文件署名域
PNG文件署名域是用来标识一个文件是否是PNG格式的,共有8个固定字节:
十进制数 | 137 80 78 71 13 10 26 10 |
---|---|
十六进制数 | 89 50 4E 47 0D 0A 1A 0A |
2)、PNG数据块(Chunk)
PNG定义了两种类型的数据块:
- 关键数据块(critical chunk)——这是必需的数据块
- 辅助数据块(ancillary chunks)——这是可选的数据块
每个数据块由4个部分组成:
名称 | 字节数 | 说明 | ||
---|---|---|---|---|
Length (长度) | 4 | 指定数据块中数据域的长度,其长度不超过(2^31-1)字节 | ||
Chunk Type Code (数据块类型码) | 4 | 数据块类型码,由ASC\ | \ | 字母(A~Z)(a~z)组成 |
Chunk Data (数据块数据) | 可变 | 存储按照Chunk Type Code指定的数据 | ||
CRC (循环冗余检测) | 4 | 存储用来检测是否有错误的循环冗余码 |
(1)关键数据块
关键数据块可分为四种类型:
*①文件头数据块IHDR**(header chunk)*
它包含PNG文件存储的图像数据的基本信息,是PNG数据流中的第一个数据块中,一个PNG数据流有且仅有一个IHDR。IHDR数据块的数据块类型码(Chunk type code)为: 0x49 48 44 52(ASCII码“IHDR”),标识该块类型。
它的格式如下:
域的名称 | 字节数 | 说明 |
---|---|---|
width | 4 | 图像宽度,以像素为单位 |
height | 4 | 图像高度,以像素为单位 |
bit depth | 1 | 图像深度:索引彩色图像:1,2,4或8灰度图像:1,2,4,8或16真彩色图像:8或16 |
color type | 1 | 颜色类型:0:灰度图像,1,2,4,8或162:真彩色图像,8或163:索引彩色图像,1,2,4或84:带α通道数据的灰度图像,8或166:带α通道数据的真彩色图像,8或16 |
compression method | 1 | 压缩方法(LZ77派生算法) |
filter method | 1 | 滤波器方法 |
interlace method | 1 | 隔行扫描方法:0:非隔行扫描1:Adam7 |
*②调色板数据块PLTE**(paltte chunk)*
它含有与索引彩色图像(indexed-color image)相关的彩色变换数据,它仅与索引彩色图像有关,使得图像深度较小的图像,可以使用索引号来正确表示颜色,并且它要放在图像数据块IDAT之前。PLTE数据块是定义图像的调色板信息,它可以包含1~256个调色板信息。每一个调色板信息由3个字节组成:
颜色 | 字节 | 意义 |
---|---|---|
Red | 1 | 0:黑 255:红 |
Green | 1 | 0:黑 255:绿 |
Blue | 1 | 0:黑 255:蓝 |
此外,PLTE块还必需满足以下限制条件:
- 调色板的长度应为3的倍数,即PLTE块最大字节数为256 × 3 = 768 B;
- 调色板信息的数量不能超过图像深度可以表示的范围;
- 对于Colour type 3的PNG图像(索引图像),PLTE块是必需的,此时调色板的颜色索引从0开始编号,然后是1,2……;对于Colour type为2和6的图像,PLTE块是可选的,此时调色板将提供一个1—256的建议颜色集,以便软件或屏幕不支持显示真彩色时量化真彩色图像;Colour type为0和4的图像中不能出现PLTE块。
*③图像数据块IDAT**(image data chunk)*
它存储实际的数据,在数据流中可包含多个连续顺序的图像数据快IDAT。IDAT存放图像真正的数据信息。
*④图像结束数据IEND**(image trailer chunk)*
它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。
用固定的12个字节表示: 00 00 00 00 49 45 4E 44 AE 42 60 82
(2)辅助数据块
**①透明信息数据块:tRNS**(Transparency chunk)**
*②图像γ数据块:gAMA**(Image gamma chunk)*
*③基色和白色度数据块:cHRM**(Primary chromaticities chunk)*
*④标准RGB色彩空间数据块:sRGB**(Standard RGB colour space chunk)***
**⑤文本信息数据块:tEXt**(Textual data chunk)**
*⑥压缩文本数据块:zTXt* *(Compressed textual data chunk)*
*⑦背景颜色数据块:bKGD**(Background colour chunk)*
*⑧物理像素尺寸数据块:pHYs**(Physical pixel dimensions chunk)*
*⑨样本有效位数据块:sBIT**(Significant bits chunk)*
*⑩图像直方图数据块:hIST**(Palette histogram chunk)*
*⑩①图像最后修改时间数据块:tIME**(Image last-modification time chunk)***
3、PNG文件实例分析
用FlexHEX打开下图png:
①PNG文件标识
②文件头数据块IHDR
名称 | 数据 | 说明 |
---|---|---|
Length | 00 00 00 0D | 数据域长度为13 |
Chunk Type Code | 49 48 44 52 | 标识IHDR |
width | 00 00 03 93 | 图像宽度为915 |
height | 00 00 02 20 | 图像高度为544 |
bit depth | 08 | 图像深度为8位 |
color type | 06 | 颜色类型为6,属于带α通道数据的真彩色图像 |
compression method | 00 | 无压缩 |
filter method | 00 | 滤波器方法为0 |
interlace method | 00 | 非隔行扫描 |
CRC | 18 C6 3D E6 | CRC检错 |
③图像结束数据IEND
第二讲 如何搭建CTF比赛平台(CTFd)
下载CTFd代码
CTFd的仓库代码下载地址:https://github.com/CTFd/CTFd/releases
写这篇文章的时候最新版本是CTFd-3.4.0版本,因此以该版本为例。
此处我下载的是第一个.zip文件
上传代码至Centos7服务器并解压
如果你下载的是.zip文件请使用命令unzip CTFd-3.4.0.zip进行解压缩
如果提示如下内容,说明没有安装unzip工具,请先执行命令yum install -y unzip安装unzip工具,再进行解压缩
-bash: unzip: 未找到命令
如果你下载的是.tar.gz文件,请使用命令tar -zxvf CTFd-3.4.0.tar.gz进行解压缩
安装运行环境
首先需要检查的是你的python环境,CTFd采用python3编写。
请先尝试执行命令python,如果出现的是Python 2.x.x说明python是python2的环境,执行输入exit()后回车退出。
再尝试执行python3,如果能够出现Python 3.x.x则说明存在python3的环境。后续我们将使用python3进行相关操作。
如果输入python3出现如下信息,则说明没有python3的环境,我们需要先进行python3环境的安装。
-bash: python3: 未找到命令
安装python3
如果python3已经安装,请跳过此步。
python3截至到本文章的编写日期来看,推荐安装CTFd开发所用的python版本,这里我曾用过的版本是python3.7.x,没有出现问题,不推荐使用太高的版本,太高的版本在一些语法上可能会略有不同。
你可以选择从Python的官网中下载python进行安装,也可以直接使用Centos7的yum进行安装。
为了方便,我这里直接使用yum进行安装,其他安装方式请看其他文章。
执行命令yum install -y python3进行python3的安装。(此处yum默认给我安装的是python3.6.8版本)
安装完成后执行python3命令,验证是否能正常使用。yum安装会自动将pip工具进行安装。
执行pip3 -V验证pip3工具的安装情况。
安装CTFd依赖库(模块)
首先进入之前解压的CTFd-3.4.0文件夹(即CTFd项目根目录)
在进行后续步骤之前,建议先使用yum安装以下几个依赖,避免pip3安装过程中出现一些问题。
执行如下个命令:
yum install -y libevent-devel
yum install -y python3-devel
yum install -y gcc
然后执行命令pip3 install -r requirements.txt
等待安装完成。
该命令安装期间通常会出现一些安装失败的情况,一般是有两种类型:
1、网络不通畅导致的安装失败——有一些依赖库,如果你默认使用pip3去安装的话,可能会请求一些国外的源,此时可以尝试先将pip源更换为国内的镜像源,然后再执行命令安装。(如何过呢更换源,自行查阅相关资料,不在本篇文章范围)
2、缺少相关的依赖文件和程序,如常见的gcc编译失败,缺少.c或.h文件等
运行CTFd
进入到之前解压的CTFd-3.4.0文件夹(即CTFd项目根目录)
然后执行python3 serve.py即可默认在本地进行启动了。
默认地址127.0.0.1
默认端口4000
如果你想让别人能访问,通常我们需要将127.0.0.1换成0.0.0.0
我们使用vim打开serve.py文件,找到最下面一行
app.run(debug=True, threaded=True, host="127.0.0.1", port=args.port)
将其改成你需要的即可,对应的参数解释如下。
debug:是否开启debug模式
threaded:是否开启线程模式
host:主机地址(允许其他机器访问改成0.0.0.0)
port:主机端口
将其改成如下:
app.run(debug=False, threaded=True, host="0.0.0.0", port=8080)
然后执行python3 serve.py即可运行CTFd。
浏览器访问地址 http://你服务器地址:8080/ 即可
我的样例:http://192.168.234.136:8080/
至此,成功访问CTFd,并进入到了CTFd的安装界面
CTFd汉化
Github搜索CTFd汉化,找到CTFd_chinese_CN项目(该汉化项目汉化覆盖率高,并且更换优化了官方CDN地址,解决了访问静态资源无法加载或加载过慢问题)
https://github.com/Gu-f/CTFd_chinese_CN
下载对应版本的CTFd汉化,此处我的CTFd是3.4.0版本,因此我下载的是Release中的CTFd-CN_V1.1.1-V3.4.0.zip
下载后将其上传到服务器,然后执行命令unzip CTFd-CN_V1.1.1-V3.4.0.zip进行解压缩
此时我服务器中的文件和文件夹如下:
CTFd-3.4.0: 是我们CTFd原始的代码文件
CTFd-V3.4.0:是我们下载的汉化的代码文件
然后执行命令/bin/cp -rf CTFd-V3.4.0/* CTFd-3.4.0/将汉化的代码文件覆盖到CTFd中。
此时再执行命令python3 serve.py运行CTFd,刷新浏览器,即可看到汉化后的CTFd界面
后续
如果仅仅是少数人,或自己的小团队,去使用CTFd,以上的安装步骤,和python3 serve.py的运行方式已经足够用了。
如果是面向的人数比较众多的。建议使用gunicorn(Python-WSGI)来进行高并发、高性能的优化处理。
gunicorn高并发优化
gunicorn常用参数如下:
-c CONFIG, --config=CONFIG 设定配置文件。
-b BIND, --bind=BIND 绑定的端口,建议使用 HOST:PORT。
-w WORKERS, --workers=WORKERS 设置工作进程数。
-k MODULE 选定异步工作方式使用的模块。
比较关键的是 -w 参数,表示工作进程数,建议的设置是cpu核心数*2+1,可根据实际情况进行调整。
然后,项目根目录下执行以下命令进行启动:
gunicorn -w 3 -b 0.0.0.0:8080 "CTFd:create_app()"
接下来就可以愉快玩耍了。
(ps:个人感觉使用gunicorn后,如果gunicorn不太稳定或服务器性能不太好,并没有明显的质的提升,相反,给人的使用体验并没有直接使用python3 serve.py丝滑流畅)
ctf小技巧
exif图片就是直接查看图片的属性,在kali里面exiftool 1.jpg 这样查看更全面 或者用010工具找到bese64编码
refresh 是F5刷新文件的意思,用win里面的cdm命令 java Extract refresh.jpg -p 123456
123456是密码
binwalk 1.png 查看这个文件 里有多少文件
binwalk -e 1.png 分离这些文件
foremost 1.png 分离这些文件【更好用】
默认放在output文件夹
分离图片
版权属于:戏人看戏博客网
本文链接:https://day.nb.sb/archives/339.html
若无注明均为戏人看戏原创,转载请注明出处,感谢您的支持!