File理论

text::文件工具


一、其他

1 十六进制

注意十六进制数是否大于 0x7b ,大于的话可能要 % 128。

2 flag别名

flag、f14g、f1ag、fl4g


二、文件

1 文件基础

文件类型与关系:

  • 图片文件:

  • 文本文件:

    • .doc:文档
    • .docx:扩展文档(可插pdf)
    • .pdf:可携带文件格式
  • 压缩包文件(详谈rar,zip,7z不同点以及优缺点):

    • .7z:压缩率最高
    • .rar:安全性高
    • .zip:使用范围广
  • 音视频文件:

    • .wav:波形声音文件
    • .mp3:音频压缩技术
    • .mp4:动态图像专家组
  • 可扩展标识语言:

    • .xml:可扩展标识语言
  • 可执行文件:

    • .exe:可执行文件

文件头(链接):

  • jpg/jpeg

    头:FF D8

    尾:FF D9

  • zip / jar / zipx

    头:50 4B 03 04

  • pyc

    头:03 F3

2 压缩包

2.1 ZIP文件

文件格式 官方文档 压缩原理

压缩源文件信息:

  • 数据区头:50 4B 03 04
  • 目录区头:50 4B 01 02
  • 目录结束标志头:50 4B 05 06

伪加密(伪加密):全局方式位标记的四个数字中只有第二个数字对其有影响,其它的不管为何值,都不影响它的加密属性:

  • 第二个数字为奇数时 –>加密:

    • 数据区的全局方式位标记应当为 09 00
    • 目录区的全局方式位标记应当为 09 00
    • 数据区全局方位:7-8 B,目录区全局方位:9-10 B
  • 第二个数字为偶数时 –>未加密:
    • 数据区的全局方式位标记应当为 00 00
    • 目录区的全局方式位标记应当为 00 00

2.2 RAR文件

2.3 压缩包爆破

伪加密:观察全局方位。

步骤:

  1. 用 010editor 进行编辑
  2. binwalk -e 无视伪加密
  3. 在 macOS 及部分 Linux(kali) 中,可以直接打开伪加密的 zip
  4. 检测伪加密工具 ZipCenOp.jar
  5. 用 WinRAR 修复

ARCHPR:

  • 爆破攻击:攻击类型暴力,选择范围,选择长度,开始暴力。

  • 字典攻击:攻击类型字典,载入字典。

  • 掩码攻击:攻击类型掩码,构造掩码,如(???venus??),? 会被字符代替。

  • 明文攻击:攻击类型明文,选择 CRC32 值一致的明文文件,攻击同 CRC32 值的加密文件。

2 图片

二维码 & 条形码:识别网站

3 Office

doc:

  • Question:

    • 图片被文字遮挡:设置全部行为单倍行距。

    • wingdings字体:img

excel:

ppt:

pdf:


三、隐写

1 常规步骤

  1. binwalk + WinHex:分析文件内部结构和内部数据。
  2. StegSolve:分析LSB隐写。
  3. Stegdetect:特殊隐写。

2 基本概念

2.1 信息隐藏

信息隐藏要求:每当一个性质的能力得到提升,另外两个就会下降,所以要在三者中寻找一个平衡:

  1. 无法被感知。
  2. 隐写容量:足够用。
  3. 鲁棒性:抵御攻击能力。

阈下信道:阈值以下的信息无法被感知。

3 隐写类型

3.1 图片隐写

My::隐写全例

3.1.1 基础隐写

RGB:红绿蓝,三个通道,每个 8 位。值越小越黑,越大越白。(RGB888 / 三通道图 / BGR)

灰度图:单通道图像。(GRAY)

位图:0,1构成,只有黑白。

单通道:一个矩阵,每个位置存一个像素点信息,8b,每位会形成一张图像,越高位越影响图像外形,最终图像是由这8位图像共同组成。所以在低位隐写难以被发现。

LSB隐写指最低有效位隐写,通常只在无损压缩或无压缩的图片上实现LSB隐写。JPG无法LSB隐写。

// 灰度隐写
// 获得低位值。
img.at(i, j) & 1;
// 判断色彩丰富度。(分成黑白两种色用于隐写)
logo.at(i, j) > 128;
// 修改低位值。(异或改掉最低位)
img.at(i, j) ^= 1;
// 明显显示低位值(0->0:黑色,1->255:白色)
res.at(i, j) *= 255;

// 彩色隐写
// 基本同理灰度隐写,:三通道隐写。(数组类型)
// 新定义一张图用来接收隐写后图的最低位值。(CV_8UC1:一个通道)
Mat solve(row, col, CV_8UC1);

// 联合隐写
img.at[ now ];
// now = row_now / ((row / 3) + 1))(+1是防止越界)
// 或 now = row_now % 3
// 或直接改成加密函数

// 可见水印
// 原理:改变透明度 a,让一张图片嵌在另一张图片上(a:double)
Vec3b c = img_c * a + logo_c * (1 - a);
3.1.2 加密隐写

———————Arnold置乱———————
Arnold置乱是一种映射方法。(Mapping)

矩阵运算如下(N是行列值,必须相等):
[ x’ ] = [ 1 a ] [ x ] mod N
[ y’ ] = [ b ab+1 ]
[ y ] mod N

逆矩阵:
[ x ] = [ ab+1 -b ] [ x’ ] mod N
[ y ] = [ -a 1 ]
[ y’ ] mod N

周期性:次数 c <= N ** 2 / 2,否则会重复置换。

联合隐写+ Arnold置乱:抗剪切性好,因为点是打散的。

// 当 a = b = 1 时就是 Cat-mapping,写成行列式 如下:
_x = ( x + y ) mod N;
_y = ( x + 2*y ) mod N;
// 逆变换行列式:
x = ( 2*_x -_y ) mod N;
y = ( -_x + _y ) mod N;
// 注:C语言可能会算出负数,其他语言取模不会
y = (y+N) % N;
3.1.3 混沌序列

混沌系统:是指那些在微小的初始条件下会呈现出长期不可预测的行为的非线性动力学系统。

混沌序列:序列,混乱,不可预测。(自然序列,斐波那契数列也是混沌序列,但混沌度低)

// 随机数置乱
srand(key);
key = for(key.at<uchar>(i,j) = rand() % 256);
// 加密
hide = img ^ key;
// 解密
img = hide ^ key;

// 随机数生成:线性同余法(简单,混沌度高)(主要是 c,c 是大质数时周期就大)
F(n) = ( a * F(n-1) + b ) % c;
//使用时还需要取mod保证范围
F(n) %= mod
3.1.4 序列隐写

字符串隐写:

  • 隐写:字符串可以和网络包一样加包头,隐写在任意位置的杂乱信息中。读取时可以按长度读取,也可以读取过长长度找到该字符串。

  • 特点:隐蔽性和容量大,鲁棒性较差。

载体选择:

  1. 最低有效位。

  2. 选择纹理丰富区域,而非光滑区域。(纹理值计算:计算梯度出现纹理线)

  3. 颜色区域。鲜艳区域少嵌入,阴沉区域多嵌入。

  4. 随机选择载体。(类似分子不规则运动)(序列:隐写的序列为二进制序列,因为要隐写在最低位)

梯度:

  • 梯度:当前点值 - 上一像素点值 > 临界值(例:10),纹理就会出现。

  • 上一值:上下左右皆可。

  • 联合梯度:上一值选为上和左,将计算结果加起来,判断是否大于临界值。

图片分类:

  • 二值图片:((img.at<uchar>(i, j) - img.at<uchar>(i-1, j))>10) *255;

  • 防负图片:(abs(img.at<uchar>(i, j) - img.at<uchar>(i-1,j))) *10;

// StrtoBin
num = ((key[i] & (1 << (7 - j))) > 0);
// BintoStr
temp = temp * 2 + key_bin[i+j];

// Encode
last_bit = last_bit - (last_bit & 1);
last_bit |= vector[p];
// Decode
temp += res.at<uchar>(i, j) & 1;
string += temp;
3.1.5 矩阵编码

改1嵌2

目的:a1,a2,a3,x1,x2。只改一个a嵌入两个x。

通过算期望判断好坏:LSB单隐写 50% 概率改1个,改1嵌2矩阵隐写 75% 改 2 个。因此该隐写优于LSB单隐写。

嵌入:

  1. x1 = a1 ^ a3 , x2 = a2 ^ a3 ; a 不变。
  2. x1 != a1 ^ a3 , x2 = a2 ^ a3 ; a1反。
  3. x1 = a1 ^ a3 , x2 != a2 ^ a3 ; a2反。
  4. x1 != a1 ^ a3 , x2 != a2 ^ a3 ; a3反。

提取:

  • x1 = a1 ^ a3 , x2 = a2 ^ a3 ;

改1嵌n

目的:a1-a7,x1,x2,x3。只改1个a嵌入三个x。

案例:假设你是一名科研人员,有64瓶无色无味的溶液,其中1瓶有毒,已知小白鼠喝下溶液后第二天会死,现在需要你分析出哪瓶为有毒溶液。小白鼠可以同时喝下多瓶溶液,问:至少需要多少只小白鼠。

答案:6只,二进制序列。

汉明纠错码:4bit数据3bit冗余。

分组奇偶:对应上面矩阵异或值为0

1:1357列异或。

2:2367列异或。

4:4567列异或。

1 2 3 4 5 6 7
3 2 data 1 data data data

数学原理如下:

异或双方分别是原数据和新数据分别与左边矩阵乘算的结果,然后再进行异或后发现需要进行改正的数据,从而完成隐写。

公式表达如下:

// 改正数据完成一个单位数据的隐写
int EnMatrixCode(vector<int> a, vector<int> x)
{
int n = a.size(), m = x.size();

assert(n == (1 << m) - 1); // n == 2 ^ m - 1

int fa = 0;
for (int i = 1; i <= n; i++)
fa ^= (a[i - 1] * i);
int xx = 0;
for (int i = 0; i < m; i++)
xx += x[i] * (1 << i);
return fa ^ xx;
}
// 逆改正
vector<int> DeMatrix(vector<int> a)
{
int n = a.size();
int m = log2(n + 1);

vector<int> x;
int fa = 0;
for (int i = 1; i <= n; i++)
fa ^= (a[i - 1] * i);
for (int i = 1; i <= m; i++)
{
x.push_back(fa % 2);
fa /= 2;
}
return x;
}

3.2 音频隐写