CTF-MISC总结

admin 2022年11月9日21:59:16CTF-MISC总结已关闭评论604 views字数 67460阅读224分52秒阅读模式


一、编码与加密

在线工具 - Bugku CTF

Misc中各种加密特征 | (guokeya.github.io)

AAEncode

将JavaScript代码转换成颜文字网络表情的编码

题目:

加密解密:

ROT13

ROT13(回转13位)是一种简易的替换式密码算法。它是一种在英文网络论坛用作隐藏八卦、妙句、谜题解答以及某些脏话的工具,目的是逃过版主或管理员的匆匆一瞥。ROT13 也是过去在古罗马开发的凯撒密码的一种变体。ROT13是它自身的逆反,即:要还原成原文只要使用同一算法即可得,故同样的操作可用于加密与解密。该算法并没有提供真正密码学上的保全,故它不应该被用于需要保全的用途上。它常常被当作弱加密示例的典型。

应用ROT13到一段文字上仅仅只需要检查字母顺序并取代它在13位之后的对应字母,有需要超过时则重新绕回26英文字母开头即可。A换成N、B换成O、依此类推到M换成Z,然后串行反转:N换成A、O换成B、最后Z换成M。只有这些出现在英文字母里的字符受影响;数字、符号、空白字符以及所有其他字符都不变。替换后的字母大小写保持不变。

Base家族

python解码脚本编写:base64 --- Base16, Base32, Base64, Base85 数据编码 — Python 3.10.0 文档

统一填充符号是’=’

1. Base16

0123456789ABCDEF

使用16个ASCII可打印字符(数字0-9字母A-F),对任意字节数据进行编码。

8比特数据按照4比特切分刚好是两组,所以Base16不可能用到填充符号“=”

2. Base32

在线Base32编码/解码工具链接:http://www.atoolbox.net/Tool.php?Id=931

ABCDEFGHIJKLMNOPQRSTUVWXYZ234567
Base32编码表
符号 符号 符号 符号
0 A 8 I 16 Q 24 Y
1 B 9 J 17 R 25 Z
2 C 10 K 18 S 26 2
3 D 11 L 19 T 27 3
4 E 12 M 20 U 28 4
5 F 13 N 21 V 29 5
6 G 14 O 22 W 30 6
7 H 15 P 23 X 31 7
填充 =

Base32编码是使用32个可打印字符(字母A-Z数字2-7)对任意字节数据进行编码的方案,编码后的字符串不用区分大小写并排除了容易混淆的字符,可以方便地由人类使用并由计算机处理。

码文最多可以有6个填充符

import base64
s = 'key'                                           # 要加密的字符串
print(base64.b32encode(s.encode('ascii')).decode()) # 加密
m= 'NNSXS==='                                       # 要解密的字符串
print(base64.b32decode(m).decode())                 # 解密

3. base64

原理:略

主要是变异base64解码,解码脚本如下

import base64 
import string 
str1 = "mTyqm7wjODkrNLcWl0eqO8K8gc1BPk1GNLgUpI=="                                 #密文
string1 = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0987654321/+"      #自定义码表
string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"      #原码表
print (base64.b64decode(str1.translate(str.maketrans(string1,string2))))              #明文输出

4. base85

$%()*+,-./0123456789:;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~

Base85 以 5 字符存储 4 字节二进制数据, 因此长度增加 25%。

Base85 可用于在 XML 文件中存储二进制数据, 相比 Base94 不带 !"#&'<=>\ 这 9 个字符, 无需转义。

5. Base91

解码轮子:GitHub - aberaud/base91-python

!"#$%&()*+,./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~

用 91 个可打印字符表示 8 位二进制数据 (含无法显示 打印字符) 的编码方式。

相比 Base94不带 '-\这 3 个字符。

——BaseCrack工具

GitHub - mufeedvh/basecrack: Decode All Bases - Base Scheme Decoder

  • 对来自用户输入的单个Base编码数据进行解码:

    python basecrack.py
    
  • 对通过参数(-b/--base)传递的单个Base编码数据进行解码:

    python basecrack.py -b SGVsbG8gV29ybGQh
    
  • 对通过文件(-f/--file)传递的多个Base编码数据进行解码:

    python basecrack.py -f file.txt
    
  • 对任意模式的多重Base编码数据进行解码(-m/--magic)

    先输入下面的命令

    python basecrack.py --magic
    

    再粘贴密文

  • 使用解码的Base数据生成字典文件并输出(-o/--output):

    python basecrack.py -f file.txt -o output-wordlist.txt
    

ATOM 128

在线加密解密:ATOM-128 / Fast Encryption (Encode or Decode) (persona-shield.com)

汉字编码

题目:BUUCTF-从娃娃抓起

中文电码:标准中文电码(Chinese Commercial Code)查询 | ChaseDream

五笔编码:五笔输入法编码在线查询系统

DTMF拨号音编码

题目:[WUSTCTF2020]girlfriend

工具:DTMF2NUM.exe

就是老式翻盖机9键打字的声音。

社会主义核心价值观编码

GitHub - sym233/core-values-encoder: Translating text to core values and back

在线解码器:CTF在线工具-在线核心价值观编码|核心价值观编码算法

栅栏密码(The rail fence cipher)

题目:BUUCTF-USB

所谓栅栏密码,就是将要加密的明文分为N个一组,再从每组的选出一个字母连起来,形成一段无规律的密文。

栅栏密码并非一种强的加密法,其加密原理限制了密钥的最高数量不可能超过明文字母数,而实际加密时密钥数目更少,因此有些密码分析员甚至能用手直接解出明文。

栅栏密码可以分为两类,第一种是N型栅栏密码,第二种是V型栅栏密码

1. N型栅栏密码

使用密钥8(栅栏的栏数)加密一下明文1234567891234567891234567891234567891

1.......9.......8.......7.......6.......5..............................
.2.......1.......9.......8.......7.......6.............................
..3.......2.......1.......9.......8.......7............................
...4.......3.......2.......1.......9.......8...........................
....5.......4.......3.......2.......1.......9..........................
.....6.......5.......4.......3.......2.......1.........................
......7.......6.......5.......4.......3................................
.......8.......7.......6.......5.......4...............................

首先画出8栏表格,明文由上至下顺序写上,当到达最低部时,再回到第一栏重新开始,一直重复直至整篇明文写完为止。

横向读取表格即为密文:1987652198763219874321985432196543217654387654

2. V型栅栏密码

使用密钥8(栅栏的栏数)加密一下明文Will invade Kentucky on October the eighth# signal is Frozen chicken'#

W.............n.............b.............#.............r.............#
.i...........e.t...........o.e...........h. ...........F.o...........'.
..l.........K...u.........t...r.........t...s.........'...z.........n..
...l....... .....c.......c..... .......h.....i....... .....e.......e...
.... .....e.......k.....O.......t.....g.......g.....s.......n.....k....
.....i...d.........y... .........h...i.........n...i......... ...c.....
......n.a........... .n...........e.e...........a. ...........c.i......
.......v.............o............. .............l.............h.......

在V型栅栏密码中,明文由上至下顺序写上,当到达最低部时,再回头向上,一直重复直至整篇明文写完为止。横向读取表格即为密文:Wnb#r#ietoehFo'lkutrts'znl cc hi ee ekOtggsnkidy hini cna neea civo lh

3. 破解

获取分组和密钥

  • 密文长度短的直接暴力破解
  • 如果知道某些明文,或者可以猜出一些明文,那么将更容易找到密钥。

Brainfuck

Brainfuck是一种极小化的计算机语言,它是由Urban Müller在1993年创建的。由于fuck在英语中是脏话,这种语言有时被称为brainfuck或brainfuck,甚至被简称为BF。

brainfuck语言用> < + - . , [ ]八种符号来替换C语言的各种语法和命令。

Ook.?!

Ook.?!与Brainfuck类似,也是用替换法。

[splitbrain.org]

新约佛论禅

特征:以“新佛曰”开头

新约佛论禅/佛曰加密 - PcMoe!

与佛论禅

与佛论禅 (keyfc.net)

Vbscript.Encode加密(VBS加密)

参考:ASP/VBS加密,解密方法探讨

用于对VBS脚本进行加密。

官方提供的加密工具sce10,算是比较正规的加密方式,用这种方法加密的代码,对于 VBScript,加密后在源文件的第一行会显示:<SCRIPT LANGUAGE="VBScript.Encode">

这种方法加密出来的代码有一个特点,一般以 #@~ 这几个字符开头,并且里面多次出现,并且不对中文字符编码

解密方式目前网络上有提供算法和程序的。有一个比较出名的软件名叫 scrdec18.exe ,只是使用稍有麻烦,是在命令行下使用的。

在线工具:asp在线解密工具|asp解密|VBScript.Encode|JScript.Encode 在线解密 (zhaoyuanma.com)

猪圈密码

是一种以格子为基础的简单替代式密码。即使使用符号,也不会影响密码分析,亦可用在其它替代式的方法。

  • 传统码表

  • 变种1

  • 变种2

tupper公式(塔珀自指公式)

塔珀自指公式(Tupper’s Self-Referential Formula)来自于Jeff Tupper在2001年发表的一篇论文,涉及到一个函数 f( x , y ),一个参数 k,和一个图片 af ( x , y ) a中的每一个点 ( x , y )进行判断,决定该点的颜色是0还是1,因此决定了a的图案。

如果给定不同的 k,就会得到不同的图案。令人感到惊奇的是,有一个特别的k(如下),它会使得所得a竟然是公式本身。

k=960939379918958884971672962127852754715004339660129306651505519271702802395266424689642842174350718121267153782770623355993237280874144307891325963941337723487857735749823926629715517173716995165232890538221612403238855866184013235585136048828693337902491454229288667081096184496091705183454067827731551705405381627380967602565625016981482083418783163849115590225610003652351370343874461848378737238198224849863465033159410054974700593138339226497249461751545728366702369745461014655997933798537483143786841806593422227898388722980000748404719

下面就是塔珀公式

\frac{1}{2}<⌊mod(⌊\frac{y}{17}⌋2^{−17⌊x⌋−mod(⌊y⌋,17)},2)⌋

常数k是将公式的单色位图化成二进制后乘以17得来的。如果将k除以17(并化成二进制),最小一位代表图像左下角的像素;最小的17位构成了最左边的一列像素;第二小的17位构成了左数第二列像素;以此类推。

下面是根据k生成图片的Python脚本

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image

def Tupper_self_referential_formula(k): 
    aa = np.zeros((17,106))
    def f(x, y):
        y += k
        a1 = 2**-(-17*x - y%17)
        a2 = (y // 17) // a1
        return 1 if a2 % 2 > 0.5 else 0
    for y in range(17):
        for x in range(106):
            aa[y, x] = f(x, y) 
    return aa[:,::-1]

k = 960939379918958884971672962127852754715004339660129306651505519271702802395266424689642842174350718121267153782770623355993237280874144307891325963941337723487857735749823926629715517173716995165232890538221612403238855866184013235585136048828693337902491454229288667081096184496091705183454067827731551705405381627380967602565625016981482083418783163849115590225610003652351370343874461848378737238198224849863465033159410054974700593138339226497249461751545728366702369745461014655997933798537483143786841806593422227898388722980000748404719  #输入你要提取的k
aa = Tupper_self_referential_formula(k)
plt.figure(figsize=(15,10))
plt.imshow(aa,origin='lower')
plt.savefig("tupper.png")
img = Image.open('tupper.png')
#翻转
dst1 = img.transpose(Image.FLIP_LEFT_RIGHT).rotate(180)   
plt.imshow(dst1)
plt.show()

对称加密算法

加盐加密后的密文通常以U2F开头,在线加密/解密,对称加密/非对称加密 (sojson.com)

培根密码

明文 密文 明文 密文 明文 密文 明文 密文
A/a aaaaa H/h aabbb O/o abbba V/v babab
B/b aaaab I/i abaaa P/p abbbb W/w babba
C/c aaaba J/j abaab Q/q baaaa X/x babbb
D/d aaabb K/k ababa R/r baaab Y/y bbaaa
E/e aabaa L/l ababb S/s baaba Z/z bbaab
F/f aabab M/m abbaa T/t baabb
G/g aabba N/n abbab U/u babaa

一些变形

首先将所有的内容分成五个一组,然后当有两种形式呈现的时候,如大小写字母:就把小写换成b 大写换成a,就可以组成一条,培根加密内容,在根据培根密码一一对应,就能够得出相关的flag

棋盘密码/敲击密码

棋盘密码是利用波利比奥斯方阵(Polybius Square)进行加密的密码方式。

判断是否是用棋盘密码破解的方式页很简单,只要出现数字是成双出现的数组串,而且有出现最大数字大于26的,那是棋盘密码的可能性就很大。


波利比奥斯方阵


摩斯密码

摩斯电码转换_摩斯密码翻译器-在线工具 (all-tool.cn)

Quoted-printable编码

Quoted-printable编码即为“可打印字符引用编码”、“使用可打印字符的编码”,我们收邮件,查看信件原始信息,经常会看到这种类型的编码。

在所有邮件处理的各式各样的编码中,很多编码的目的都是通过编码的手段使得七位字符的邮件协议体系可以传送八位的二进制文件、双字节语言等等。Quoted-Printable也是这样一些编码中的一个,它的目的同样是帮助非ASCII编码的信件传输通过SMTP。Quoted-Printable编码是字符对应的编码,每个末编码的二进制字符被编码成三个字符,即一个等号和一个十六进制的数字,如‘=AB’。 编码里面,有几个特定限定,一些可打印字符不用编码,当然如果你按照规范编码后,也一样可以显示的。

说白了就是一个等号加上某个字符的ASCII码形式即为此字符的Quoted-printable编码

在线解码:

Codemoji

题目:

是Mozilla推出的一款游戏,其中结合了表情符号的方法,旨在普及加密技术。关于Codemoji的官方介绍请参考https://codemoji.org/

区分另一种表情包编码:

PDU编码

在线解码:

二、隐写术Steganography

CTF | 那些比较好玩的stego(正传) - 知乎 (zhihu.com)

隐写术(二)--传统数字图像隐写算法 - 简书 (jianshu.com)

(一)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(c)\times 6==len(m)\times 8,即len(c)\times 3==len(m)\times 4,那么必须码文字符串的长度必须为4的倍数,明文字符串的长度必须为3的倍数。

  2. 对于明文字符串长度不足3的倍数的情况用每一个二进制位用0\ 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格式的图片进行宽高的修改进而隐藏图片关键信息

  • 原理:png图片的宽和高信息在png的IHDR数据块内,通过修改图片的宽和高数据使图片仅显示一部分,另一部分不显示

  • 特征:010 Editor中打开后会出现CRC校验值错误的报错提示

  • 破解:可以通过CRC值来暴破获取正确的宽值或者高值

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文件隐写——不负责任的总结

  • LSB-Steganography工具实现的不加密隐写可以用Stegsolve查看,这种算法的特点就是LSB位前面很多0

  • [cloacked-pixel](https://github.com/livz/cloacked-pixel#:~:text=cloacked-pixel. Platform independent Python tool to implement LSB,Hide files within least significant bits of images.)工具实现的加密隐写(带密钥)可以用Stegsolve查看,这种算法的特点是开头有个数字,根据观察,这个数字应该是有用的数据的长度,然后才是很多个0,接着是相应长度的数据。

    cloacked-pixel使用方法:

    lsb.py hide <img_file> <payload_file> <password>  #隐写
    lsb.py extract <stego_file> <out_file> <password> #提取
    lsb.py analyse <stego_file>                       #分析检测
    

提取工具

outguess隐写(.jpeg)

题目:[WUSTCTF2020]alison_likes_jojo

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

  • 加密

    outguess -k "my secret key" -d hidden.txt in.jpg out.jpg
    

    加密之后,in.jpg会覆盖out.jpg,hidden.txt中的内容是要隐藏的东西

  • 解密

    outguess -k "my secret key" -r out.jpg hidden.txt
    

    解密之后,解密内容放在hidden.txt中

  • 检测:使用stegdetect工具可以检测

F5隐写

盲水印

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

  • 提取
    • ImageIN:GUI交互(建议只得到一张图的情况下使用)
    • BlindWaterMark:命令行python脚本(CTF题中可能会给两张一样的图,这个时候用此工具更好)

JPHide(.jpeg)

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

  • 提取JPHS

    JPHS内置JPHIDE和JPSEEK

    • JPHide程序主要是实现将信息文件加密隐藏到JPEG图像功能,
    • JPSeek程序主要实现从用JPHide程序加密隐藏得到的JPEG图像探测提取信息文件

SilentEye(.jpeg)

(四)零宽字符隐写

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

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

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

shadow

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

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

零宽字符在浏览器中对应的转义字符

零宽空格    --- &#8203;  
零宽不连字  --- &#8204;
零宽连字    --- &#8205;

零宽字符在Unicode中的编码为

\u200B \u200C \u200D

(五)word隐写

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

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

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

    破解:

    • 全选改字体颜色为别的颜色
    • 搜索字符串,例如flag等
  3. 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 了。

  • 提示:Stegosaurus 仅支持 Python3.6 及其以下版本
  • 快速入门:-p 要隐藏的文本,-r 显示最大隐藏字节,-x可以解密

(七)音频隐写

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类型的图片是否隐藏着其他文件或内容。它可以检测到通过JStegJPHideOutGuessInvisible SecretsF5appendXCamouflage等这些隐写工具隐藏的信息。

安装:

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

linux32 ./configure
linux32 make

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

  • q ——仅显示可能包含隐藏内容的图像

  • n ——启用检查JPEG文件头功能,以降低误报率。如果启用,所有带有批注区域的文件将被视为没有被嵌入信息。如果JPEG文件的JFIF标识符中的版本号不是1.1,则禁用OutGuess检测。

  • s ——修改检测算法的敏感度,该值的默认值为1。检测结果的匹配度与检测算法的敏感度成正比,算法敏感度的值越大,检测出的可疑文件包含敏感信息的可能性越大。

  • d ——打印带行号的调试信息。

  • t ——设置要检测哪些隐写工具(默认检测jopi),可设置的选项如下:

  • j ——检测图像中的信息是否是用jsteg嵌入的。

  • o ——检测图像中的信息是否是用outguess嵌入的。

  • p ——检测图像中的信息是否是用jphide嵌入的。

  • i ——检测图像中的信息是否是用invisible secrets嵌入的。

常用指令

stegdetect.exe -tjopi -s 10.0 hide.jpg

三、压缩文件

(一)ZIP文件

ZIP是一种相当简单的分别压缩每个文件的存档格式。分别压缩文件允许不必读取另外的数据而检索独立的文件;理论上,这种格式允许对不同的文件使用不同的算法,ZIP文件是一种压缩文件,可进行加密,也可不加密。

一个 ZIP 文件由三个部分组成:

压缩源文件数据区+压缩源文件目录区+压缩源文件目录结束标志

1. ZIP文件结构

参考:一个zip文件由这样三个部分组成_一只独孤的程序猿-CSDN博客

(1)压缩源文件数据区

在这个数据区中每一个压缩的源文件/目录都是一条记录,记录的格式如下:

[文件头+ 文件数据 + 数据描述符]

——文件头结构
组成 长度
文件头标记 4 bytes(0x04034b50)
解压文件所需pkware版本 2 bytes
全局方式位标记(第二位表示有无加密) 2 bytes
压缩方式 2 bytes
最后修改文件时间 2 bytes
最后修改文件日期 2 bytes
CRC-32校验 4 bytes
压缩后尺寸 4 bytes
未压缩尺寸 4 bytes
文件名长度 2 bytes
扩展记录长度 2 bytes
文件名 (不定长度)
扩展字段 (不定长度)

##### ——文件数据

——数据描述符

这个数据描述符只在全局方式位标记的第3位设为1时才存在(见后详解),紧接在压缩数据的最后一个字节后。这个数据描述符只用在不能对输出的 ZIP 文件进行检索时使用。例如:在一个不能检索的驱动器(如:磁带机上)上的 ZIP 文件中。如果是磁盘上的ZIP文件一般没有这个数据描述符。

组成 长度
CRC-32校验 4 bytes
压缩后尺寸 4 bytes
未压缩尺寸 4 bytes

(2)压缩源文件目录区

在这个数据区中每一条记录对应在压缩源文件数据区中的一条数据

组成 长度
目录中文件文件头标记 4 bytes(0x02014b50)
压缩使用的pkware 版本 2 bytes
解压文件所需 pkware 版本 2 bytes
全局方式位标记(第二位表示有无加密,伪加密的关键) 2 bytes
压缩方式 2 bytes
最后修改文件时间 2 bytes
最后修改文件日期 2 bytes
CRC-32校验 4 bytes
压缩后尺寸 4 bytes
未压缩尺寸 4 bytes
文件名长度 2 bytes
扩展字段长度 2 bytes
文件注释长度 2 bytes
磁盘开始号 2 bytes
内部文件属性 2 bytes
外部文件属性 4 bytes
局部头部偏移量 4 bytes
文件名 (不定长度)
扩展字段 (不定长度)
文件注释 (不定长度)

(3)压缩源文件目录结束标志

组成 长度
目录结束标记 4 bytes(0x02014b50)
当前磁盘编号 2 bytes
目录区开始磁盘编号 2 bytes
本磁盘上纪录总数 2 bytes
目录区中纪录总数 2 bytes
目录区尺寸大小 4 bytes
目录区对第一张磁盘的偏移量 4 bytes
ZIP文件注释长度 2 bytes
ZIP 文件注释 (不定长度)

### 3. 攻击加密的压缩文件

(1)暴破

  • Ziperello在不知道密码位数的情况下暴力破解1~6位(超出6位消耗事件更长),但只可以暴破zip文件

  • ARCHPR更适用于在知道密码格式的情况下的掩码暴破,适用于ZIP和RAR。

下面是几种破解类型

  1. 暴破:顾名思义,逐个尝试选定集合中可以组成的所有密码,知道遇到正确密码
  2. 字典:字典攻击的效率比爆破稍高,因为字典中存储了常用的密码,因此就避免了爆破时把时间浪费在脸滚键盘类的密码上
  3. 掩码攻击:如果已知密码的某几位,如已知6位密码的第3位是a,那么可以构造 ??a??? 进行掩码攻击,掩码攻击的原理相当于构造了第3位为a的字典,因此掩码攻击的效率也比爆破高出不少

(2)CRC爆破(CRC碰撞)

Misc中的有一类题目是我们知道加密后的压缩文件中的内容,但是压缩文件的密码我们不知道,直接爆破密码也不是很现实,但是当文件的大小比较小,或者字符数量较少,这个时候就可以构造一个和源文件等长的字符串,然后再对其进行CRC校验,比较校验码是否相同以此来爆破出压缩文件内部文件的内容。

题目:

下面这个脚本仅适用于字符小于等于4的情况

#这个脚本仅适用于字符小于等于4的情况
import zipfile
import string
import binascii

def CrackCrc(crc):     #CRC爆破
    with open('flag.txt','a') as f:
        dic = string.ascii_letters + string.digits + '+/='
        #dic = string.printable             #根据情况自行设置字符表
        for i in dic:                       #根据内部文件的大小设置不同的循环次数,大小为4就设置4层嵌套循环
            for j in dic:
                for k in dic:
                    for h in dic:
                        s = i + j + k + h
                        if crc == (binascii.crc32(s.encode())):
                            f.write(s)
                            return

def CrackZip():       #获取压缩文件的CRC校验码
        for i in range(0,68):
            path = 'E:\\CTF_project\\BUUCTF\\MISC\\zip\\'+'out'+str(i)+'.zip'   
            crc = zipfile.ZipFile(path,'r').getinfo('data.txt').CRC    #获取压缩包内data.txt文件的CRC字段值
            CrackCrc(crc)

if __name__=='__main__':
    CrackZip()
    print("CRC32碰撞完成")

另外有一个脚本可以破解更多位,源自GitHub - theonlypwner/crc32: CRC32 tools: reverse, undo/rewind, and calculate hashes,使用方法如下:

python crc32.py reverse <你的crc32密文,加上0x>

(3)已知明文攻击

原理:我们为zip压缩文件所设定的密码,首先被转换成3个32bit的key,所以可能的key的组合是2^{96},这是个天文数字,如果用暴力穷举的方式是不太可能的,除非你的密码比较短或者有个厉害的字典。压缩软件用这3个key加密所有包中的文件,也就是说,所有文件的key是一样的,如果我们能够找到这个key,就能解开所有的文件。如果我们找到加密压缩包中的任意一个文件,这个文件和压缩包里的文件是一样的,我们把这个文件用同样的压缩软件同样的压缩方式进行无密码的压缩(每个压缩软件都压缩一遍,比较两者的CRC32来判断用的哪个压缩软件),得到的文件就是我们的已知明文。用这个无密码的压缩包和有密码的压缩包进行比较,分析两个包中相同的那个文件,抽取出两个文件的不同点,就是那3个key了,如此就能得到key。两个相同文件在压缩包中的字节数应该相差12个byte,就是那3个key了。虽然我们还是无法通过这个key还原出密码,但是我们已经可以用这个key解开所有的文件,所以已经满足我们的要求了,毕竟对我们而言,得到解压后的文件比得到密码本身更重要。

工具:ARCHPR和pkcrack

关于ARCHPR如何进行明文攻击如图所示

image-20211119161146741

pkcrack安装与使用

参考:压缩包密码破解-PkCrack(明文攻击)

个人建议在linux下编译,然后在windows下运行

具体细节如下:

git clone https://github.com/keyunluo/pkcrack
mkdir pkcrack/build
cd pkcrack/build
cmake ..
make

安装完之后发现在bin目录下不只是生成了elf文件,还生成了exe文件。

使用如下:

pkcrack --help 查看手册
用法:pkcrack -c <crypted_file> -p <plaintext_file> [other_options]
-c:压缩包中需要破解的文件
-C:包含需要破解文件的压缩包
-P:包含已知文件的压缩包
-p:压缩包中的已知文件
-d:结果输出的文件

用法:pkcrack -c "answer/key.txt" -p readme.txt -C Desktop.zip -P readme.zip

注意,使用pkcrack时,要先将已知的文件压缩为zip文件,其作为-P的参数

举个🌰:有加密压缩包Desktop.zip,含有readme.txt和flag.txt,其中的readme.txt已知。
首先我们要将readme.txt压缩为readme.zip,然后输入命令

pkcrack -c "flag.txt" -C Desktop.zip -p readme.txt  -P readme.zip

(4)ZIP伪加密

伪加密是在未加密的zip文件基础上修改了它的压缩源文件目录区里的全局方式位标记的比特值,使得压缩软件打开它的时候识别为加密文件,提示输入密码, 而在这个时候,不管你用什么软件对其进行密码破解,都无法打开它!这就是它存在的意义!

破解方法

  1. 使用ZipCenOp.jar(需要java环境)

    在cmd中使用 java -jar ZipCenOp.jar r xxx.zip 成功后压缩包可以直接打开

  2. 使用winRAR

    进入工具,压缩修复文件,修复完后压缩包就可以打开了

上述两种方法很多情况都可以用,但是有时不行,第三种方法可以应对各种zip伪加密

  1. 修改文件头的加密标志位

    加密标志位所在全局方式位字段在上述zip文件结构阐述中已经标识出来,它的四个数字中只有第二个数字对其有影响,其它的不管为何值,都不影响它的加密属性!

    • 第二个数字为奇数时\rightarrow 加密
    • 第二个数字为偶数时\rightarrow 未加密

(二)RAR文件

1. 文件结构

RAR是有四个文件块组成的,分别是分别是标记块归档头部块文件块结束块,这些块之间没有固定地先后顺序,但要求第一个块必须是标志块并且其后紧跟一个归档头部块。

每个块都包含了下面的内容

名称 大小 描述
HEAD_CRC 2 整个块或者对块某个部分的CRC
HEAD_TYPE 1 当前块的类型
HEAD_FLAGS 2 快标志
HEAD_SIZE 2 当前块的大小
ADD_SIZE 4 添加块的大小(可选)

(1)标志块(签名)

这个块的内容基本是固定的,RAR 5.0签名和RAR4.x的签名不一样。

  • RAR 5.0签名由8个字节组成:

    0000h: 52 61 72 21 1A 07 01 00  Rar!....
    
  • RAR 4.x 签名由7字节组成:

    0000h: 52 61 72 21 1A 07 00  Rar!...
    

对于RAR4.x签名的几个字段即对应的值如下

字段
HEAD_CRC 0x6152
HEAD_TYPE 0x72
HEAD_FLAGS 0x1A21
HEAD_SIZE 0x0007

(2)归档头部块

字段
HEAD_CRC 从HEAD_TYPE到RESERVED2的CRC
HEAD_TYPE 0x73
HEAD_FLAGS (位标志)
HEAD_SIZE 归档头部块大小(包括归档注释)

(3)文件块

CTF中可能把RAR的文件块的HEAD_TYPE字段的值改成别的,进而造成CRC校验错误。BUUCTF-USB

字段
HEAD_CRC 从HEAD_TYPE到FILEATTR的CRC
HEAD_TYPE 0x74
HEAD_FLAGS 位标志(这部分常用作伪加密
HEAD_SIZE 文件块大小(文件名的内容)

(4)结束块

字段
HEAD_CRC 0x3DC4
HEAD_TYPE 0x7b
HEAD_FLAGS 0x4000
HEAD_SIZE 0x0007

2. HEAD_TYPE参照表

不同的块对应不同的HEAD_TYPE,归纳如下

HEAD_TYPE值
标记块 0x72
压缩文件头 0x73
文件头 0x74
注释头 0x75
旧风格的用户身份信息 0x76
子块 0x77
恢复纪录 0x78
用户身份信息 0x79
subblock 0x7a

3. 加密RAR文件的破解

ARCHPR工具支持多种破解RAR文件密码的方式。

Q:RAR文件导入ARCHPR后提示非档案文件,但确实是RAR文件没错

A:ARCHPR只能破解RAR-4.x的,RAR-5.0的会显示不是档案文件

(三)GZIP文件

GZIP最早由Jean-loup Gailly和Mark Adler创建,用于UNIX系统的文件压缩。我们在Linux中经常会用到后缀为.gz的文件,它们就是GZIP格式的。现今已经成为Internet 上使用非常普遍的一种数据压缩格式,或者说一种文件格式。——百度百科

(四)BR文件

BR文件是使用Brotli(一种开源数据压缩算法)压缩的文件。 它包含网页资产,例如 .CSS,XML文件, .SVG和 .JS 文件,以Brotli压缩数据格式压缩。 Web浏览器(例如Chrome和Firefox)使用BR文件来提高页面加载速度。

四、swf游戏

(一).swf文件

swf(shock wave flash)是Macromedia(现已被ADOBE公司收购)公司的动画设计软件Flash的专用格式,被广泛应用于网页设计、动画制作等领域,swf文件通常也被称为Flash文件。swf普及程度很高,现在超过99%的网络使用者都可以读取swf档案。这个档案格式由FutureWave创建,后来伴随着一个主要的目标受到Macromedia支援:创作小档案以播放动画。计划理念是可以在任何操作系统和浏览器中进行,并让网络较慢的人也能顺利浏览。swf 可以用Adobe Flash Player打开,浏览器必须安装[Adobe Flash Player](https://baike.baidu.com/item/Adobe Flash Player)插件

五、取证分析

关于取证:

  • 活取证:抓取文件的metadata、创建是时间线、命令历史、分析日志文件、哈希摘要、转存内存信息,使用未受感染的干净程序进行取证,U盘、网络、存储设备收集到的数据。

    在活取证中,可以使用内存dump工具,将被入侵的机器的内存保存下来,

    • Windows环境下常用的工具是Dumpit。DumpIt 是一款绿色免安装的 windows 内存镜像取证工具。利用它我们可以轻松地将一个系统的完整内存镜像下来,并用于后续的调查取证工作,下载之后放到虚拟机中,双击之后输入y即可获取当前的状态的内存文件,
    • Linux环境下常用的工具是lime(Linux Mem Extractor),从intel硬件或虚拟机上抓取内存,
  • 死取证:系统关机后制作硬盘镜像、分析镜像。

(一)Windows取证基础

1. .evtx日志取证

windows 日志取证主要包括三方面:Windorw 系统日志(由 windows 系统记录的日志),应用程序独自维护的日志防火墙或入侵检测系统维护的日志。其中 Windows 操作系统维护三个相互独立的日志文件分别为:系统日志应用程序日志安全日志。日志文件位置:C:\Windows\System32\winevt\Logs\ 。登陆事件、策略更改、账户登陆、系统事件的成功失败,还有任何成功的入侵都将在安全日志中留下痕迹。

通过对Windows事件日志的取证分析,取证人员可以对操纵系统、应用程序、服务、设备等操作行为记录,通过关键的时间点进行回溯。

下表为Vista/Win7/Win8/Win10/Server2008/Server 2012及之后的版本

类型 事件类型 描述 文件名
Windows日志 系统 包含系统进程,设备磁盘活动等。事件记录了设备驱动无法正常启动或停止,硬件失败,重复IP地址,系统进程的启动,停止及暂停等行为。 System.evtx
安全 包含安全性相关的事件,如用户权限变更,登录及注销,文件及文件夹访问,打印等信息。 Security.evtx
应用程序 包含操作系统安装的应用程序软件相关的事件。事件包括了错误、警告及任何应用程序需要报告的信息,应用程序开发人员可以决定记录哪些信息。 Application.evtx
应用程序及服务日志 Microsoft Microsoft文件夹下包含了200多个微软内置的事件日志分类,只有部分类型默认启用记录功能,如远程桌面客户端连接、无线网络、有线网路、设备安装等相关日志。 详见日志存储目录对应文件
Microsoft Office Alerts 微软Office应用程序(包括Word/Excel/PowerPoint等)的各种警告信息,其中包含用户对文档操作过程中出现的各种行为,记录有文件名、路径等信息。 OAerts.evtx
Windows PowerShell Windows自带的PowerShell应用的日志信息。 Windows PowerShell.evtx
Internet Explorer IE浏览器应用程序的日志信息,默认未启用,需要通过组策略进行配置。 Internet Explorer.evtx

evtx文件是微软从 Windows NT 6.0(Windows Vista 和 Server 2008) 开始采用的一种全新的日志文件格式。在此之前的格式是 evtevtxWindows事件查看器创建,包含Windows记录的事件列表,以专有的二进制XML格式保存。

.evtx文件可以在Windows事件查看器中打开,通过点击、筛选、查找等多种方式查看事件日志。

image-20211123184216869

【注意】:

  • Windows操作系统默认没有提供删除特定日志记录的功能,仅提供了删除所有日志的操作功能。也就意味着日志记录ID(EventRecordID)应该是连续的,默认的排序方式应该是从大到小往下排列。

  • 默认情况下,当一个evtx文件的记录满了,日志服务会覆盖最开始的记录,从头开始写入新的记录。

5 种事件类型(级别)分为:

  1. 信息(Information):信息事件指应用程序、驱动程序或服务的成功操作的事件。
  2. 警告(Warning):警告事件指不是直接的、主要的,但是会导致将来问题发生的问题。例如,当磁盘空间不足或未找到打印机时,都会记录一个“警告”事件。
  3. 错误(Error):错误事件指用户应该知道的重要的问题。错误事件通常指功能和数据的丢失。例如,如果一个服务不能作为系统引导被加载,那么它会产生一个错误事件。
  4. 成功审核(Success audit):成功的审核安全访问尝试,主要是指安全性日志,这里记录着用户登录/注销、对象访问、特权使用、账户管理、策略更改、详细跟踪、目录服务访问、账户登录等事件,例如所有的成功登录系统都会被记录为“ 成功审核”事件。
  5. 失败审核(Failure audit):失败的审核安全登录尝试,例如用户试图访问网络驱动器失败,则该尝试会被作为失败审核事件记录下来。

Windows 用 Event ID来标识事件的不同含义,以Security.evtx为例,一些常见的Event ID 如下

事件ID 描述
4608 Windows 启动
4609 Windows 关机
4616 系统时间发生更改
4624 用户成功登录到计算机
4625 登录失败。使用未知用户名或密码错误的已知用户名尝试登录。
4634 用户注销完成
4647 用户启动了注销过程
4648 用户在以其他用户身份登录时,使用显式凭据成功登录到计算机
4703 令牌权限调整
4704 分配了用户权限
4720 已创建用户账户
4725 账户被禁用
4768 请求Kerberos身份验证票证(TGT)
4769 请求Kerberos服务票证
4770 已续订Kerberos服务票证
4779 用户在未注销的情况下断开了终端服务器会话

(1)evtx文件结构

\textcolor{red}{.evtx}=1 * \textcolor{red}{file header} (1个文件头)\\+ n * \textcolor{red}{chunks} (n个数据块)\\+ \textcolor{red}{trailing empty values} (尾部填充空值)

——file header

File Header(文件头)文件头长度为4KB(4096bytes),一个evtx只有一个文件头,其结构如下:

偏移 长度(Bytes) 描述
0x00 8 "ElfFile\x00" 标志位/签名
0x08 8 第一个区块编号(存在时间最久的区块编号)
0x10 8 当前区块编号(块的编号从0开始)
0x18 8 下一条事件记录的ID
0x20 4 128 文件头有效部分的大小
0x24 2 1 次要版本
0x26 2 3 主要版本
0x28 2 4096 文件头的大小
0x2A 2 区块的数量
0x2C 76 未知 (空值)
0x78 4 文件标志
0x7C 4 文件头前 120 bytes 的CRC32校验和
0x80 3968 未知 (空值)
——Chunk

每个块的大小是 65536 bytes(64KB),可以有多个块,主要由三部分组成:

  • chunk header 块头
  • array of event records 事件记录组
  • unused space 未使用的空间

chunk头长度为512bytes,其结构如下:

偏移 长度(Bytes) 描述
0x00 8 "ElfChnk\x00" 标志位/签名
0x08 8 基于日志编号的第一条日志记录的ID
0x10 8 基于日志编号的最后一条日志记录的ID
0x18 8 基于文件编号的第一条日志记录的ID
0x20 8 基于文件编号的最后一条日志记录的ID
0x28 4 128 chunk头大小
0x2C 4 最后一条日志记录的偏移量(相对于块头的起始偏移量)
0x30 4 下一条日志记录的偏移量(相对于块头的起始偏移量)
0x34 4 事件记录数据的 CRC32 校验和
0x38 64 Unknown (空值)
0x78 4 Unknown (flags?)
0x7C 4 块头CRC32校验和(块头前120个字节和128至512字节的数据的CRC32校验和)

(2).evtx日志隐藏

参考:闲聊Windows系统日志_Make-CSDN博客_windows系统日志

2. 注册表取证

注册表有5个根键(HKEY):

  • HKEY_CLASSES_ROOT:启动应用程序所需的全部信息,如扩展名,应用程序与文档之间的关系,驱动程序名,DDE和OLE信息,类ID编号和应用程序与文档的图标等。
  • HKEY_CURRENT_USER:当前登录用户的配置信息,如环境变量,个人程序以及桌面设置等。
  • HKEY_LOCAL_MACHINE:本地计算机的系统信息,如硬件和操作系统信息,安全数据和计算机专用的各类软件设置信息。
  • HKEY_USERS:计算机的所有用户使用的配置数据,这些数据只有在用户登录系统时才能访问。
  • HKEY_CURRENT_CONFIG:当前硬件的配置信息,其中的信息是从HKEY_LOCAL_MACHINE中映射出来的。

(1)关于启动项

HKLM\SOFTWARE\Microsoft\Windows\CurrentVevsion\Run

HKLM\SOFTWARE\Microsoft\Windows\CurrentVevsion\RunOnce

HKLM\SOFTWARE\Microsoft\Windows\CurrentVevsion\RunOnceEx

HKLM\SOFTWARE\Microsoft\Windows\CurrentVevsion\RunServices

HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVevsion\Winlogon\Userinit

HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVevsion\Winlogon\Shell

Userinit.exe 运行登录脚本、建立网络连接和启动shell。很多木马程序和流氓软件选择它作为启动项

Autoruns工具:查看系统启动项的工具

(2)关于用户与系统信息项

HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVevsion\RegisteredOwner

HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVevsion\Registeredorganizaion

HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVevsion\ProductID

HKLM\SAM\SAM\Domains\Account\Users\Names

HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVevsion\Winlogon

HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVevsion\ProfileList

3. 系统进程

此类进程在系统中都会有固定的存放位置,假如在此存放位置之外发现此类程序,则有可能是病毒。据百度百科记载大多数此类文件都会存放在 C:\Windows\System32 不过根据自己亲自实验发现,在win 10 中每个此类文件的存放位置都会有四个,win 中自带有数字签名,此时只需要查看数字签名是否正常。而且据网上流传通过右键查看程序的版本信息是否存在也可以判断程序是否正常。并且大部分程序都会有自己固定的注册表信息,如果发现此时某程序对应的注册表信息不正确也极有可能是中毒情况。

(1)与其他应用程序相关进程

  1. iexplore.exe
      描述: IE 浏览器进程,这不是纯粹的系统程序,但是如果终止它,可能会导致不可知的问题。
                                        中毒: 浏览器被劫持,任务管理器中多出进程:IEXPL0RE.EXE,注意,这里是数字“0”,不是字母“O”,或任务管理器查看有多个 iexplore.exe。

  2. wmplayer.exe
      描述: Windows Media Player播放器的一部分,用于播放音频、视频文件。

  3. spoolsv.exe
      描述: 是Print Spooler的进程,管理所有本地和网络打印队列及控制所有打印工作。如果此服务被停用,本地计算机上的打印将不可用。
                                        中毒: 多个相似名称进程,CPU 占用率高,文件位置不正确。

  4. ctfmon.exe
      描述: 是有关输入法的一个可执行程序。它可以选择用户文字输入程序,和微软Office 语言条。这不是纯粹的系统程序,但是如果终止它,可能会导致不可知的问题。它监视活动窗口,并为语音识别、书写识别、键盘、翻译和其他中文可选用户输入方法技术提供文本输入服务支持。
                                        中毒: 此进程占用资源太多

  5. internat.exe
      描述: 多语言输入程序。
                                        中毒: 出现提示缺少 exe 文件问题的大部分原因是因该文件被木马病毒破坏导致系统程序找不到此文件,出现错误提示框,或程序无法运行,解决此问题只需找到专业的 exe 文件下载网站,下载该文件后,找到适合程序的文件版本,复制到相应目录。

  6. conime.exe
      描述: 输入法编辑器相关程序。允许用户使用标准键盘就能输入复杂的字符与符号。

  7. wuauclt.exe
      描述: 是Windows自动升级管理程序。该进程会不断在线检测更新。删除该进程将使计算机无法得到最新更新信息。
                                        中毒: 该病毒自动修改原先的 wuauclt.exe 为 wuauclt1.exe ,并建立新的 wuauclt.exe 。建议关闭 wuauclt.exe 进程,删除 wuauclt.exe 进程,然后把 wuauclt1.exe 更改为 wuauclt.exe 。

  8. alg.exe
      描述: 它用于处理微软 Windows 网络连接共享和网络连接防火墙。
                                        中毒: 系统文件 ALG.EXE 出错,极有可能是盗号木马、流氓软件等恶意程序所导致,其感染相关文件并加载起来,一旦杀毒软件删除被感染的文件,就会导致相关组件缺失,游戏等常用软件运行不起来,通常会伴随下几种情况:
      - 桌面图标无法删除
      - 网络游戏打不开
      - 电脑无故蓝屏
      - 电脑没声音
      - 桌面无法显示
      - 主页被修改为网址导航

(2)图形化相关进程

  1. csrss.exe
      描述: 是微软客户端、服务端运行时子系统,windows 的核心进程之一。管理 Windows 图形相关任务,对系统的正常运行非常重要。csrss是Client/Server Runtime Server Subsystem 的简称,即客户/服务器运行子系统,用以控制Windows图形相关子系统,必须一直运行。

  2. explorer.exe
      描述: 是 Windows 文件资源管理器,它用于管理 Windows 图形界面,包括桌面和文件管理,删除该程序会导致 Windows 图形界面无法使用。
                                        中毒: 查看文件位置是否正常,查看版本信息和数字签名值。

  3. dwm.exe
      描述: 桌面窗口管理器,跟桌面相关。 它建立在WPF核心图形层组件基础之上。 它的出现几乎改变了 Vista 中应用程序的屏幕象素显示方式。启用 DWM 后,提供的视觉效果有毛玻璃框架、3D窗口变换动画、窗口翻转和高分辨率支持 。其中最明显的特征有:任务栏窗口的实时缩略图;Alt+TabWin+Tab 组合键所看到的效果。

(3)登陆相关进程

  1. smss.exe
      描述: 这是一个会话管理子系统,负责启动用户会话。这个进程是通过系统进程初始化的并且对许多活动的,包括已经正在运行的 Windows 登录程序 (winlogon.exe) ,Win32子系统(csrss.exe)线程和设定的系统变量作出反映。
                                        中毒: 查看文件位置是否正常,查看版本信息和数字签名值。
  2. winlogon.exe
      描述: Windows 用户登陆程序,用于管理用户登录和退出。
                                        中毒: 正常的winlogon系统进程,其用户名为 “SYSTEM” 程序名为小写 winlogon.exe 。而伪装成该进程的木马程序其用户名为当前系统用户名,且程序名为大写的 WINLOGON.exe。
  3. lsass.exe
      描述: 它用于本地安全和登陆策略,随着系统启动而自动启动。它提供本地的安全授权服务,并且它会为使用 winlogon 服务的授权用户生成一个进程。这个进程是通过使用授权的包,如果授权是成功的,lsass 就会产生用户的进入令牌,令牌被使用启动初始的 shell 。其他的由用户初始化的进程会继承这个令牌的。
                                        中毒: 如果你的启动菜单(开始-运行-输入“msconfig”)里有个lsass.exe启动项,那就说明你中了LSASS.EXE木马病毒,中毒后,在进程里可以见到有两个相同的进程,分别是lsass.exe和LSASS.EXE,同时在windows下生成LSASS.EXE和exert.exe两个可执行文件,且在后台运行,LSASS.EXE管理exe类执行文件,exert.exe管理程序退出,还会在D盘根目录下产生和 autorun.inf两个文件,同时侵入注册表破坏系统文件关联。
——Windows 登录过程

SMSS.exe 会话管理进程是内核创建的第一个用户态进程,它启动后会创建 Windows 子系统服务进程 CSRSSWinLogon 进程。WinLogon 会创建登录桌面以及服务系统管理进程 Servises ,在用户登录前,系统使用特殊帐户(NT AUTHORITY\SYSTEM (帐户域\帐户权限))先行登录处理 Servises。然后它会创建数个 svchost.exe子进程,而每个svchost.exe进程都会启动并运行一些基本的windows服务 。因为 CSRSSWinLogon 对系统来说缺一不可,因此 SMSS 创建这两个进程遇到问题时便采取紧急措施,不会正常启动。

Explorer 进程是由 UserInit 创建的,UserInit 是由 WinLogon 进程创建的,在 Windows 去启动过程中,用户输入用户名和密码后,负责登陆的系统进程 WinLogon 将用户名和密码发送给负责安全认证的另一个系统进程 LsassLsass 调用验证模块对用户名和密码进行验证,如果通过,则创建一个访问令牌对象。 WinLogon 去启动 HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVevsion\Winlogon 的 Userinit 表键下指定的程序(默认为 userinit.exe) 。UseInit 进程执行登陆和初始化脚本,然后启动 Shell 表键中定义的 Shell 程序(默认即 Explorer.exe)。

所有这些过程都会被记录进系统内置的"安全"类型日志,可以通过事件查看器浏览。

(4)其他重要进程

  1. svchost.exe
      描述: Windows 服务主进程,是通过动态链接库 (DLL) 运行的服务的通用进程名。许多服务通过注入到该程序中启动,所以会有多个该文件的进程。svchost 进程只作为服务宿主,它本身并不能实现任何功能,即它只能提供条件让其他服务在这里被启动。svchost通过系统服务在注册表中设置的参数找到某个服务的动态链接库。
                                        中毒: 查看文件位置是否正常,查看版本信息和数字签名值。

  2. rundll32.exe
      描述: 用于在内存中运行DLL文件,它们会在应用程序中被使用。这个程序对你系统的正常运行是非常重要的。
                                        中毒: 查看文件位置是否正常,查看版本信息和数字签名值。

  3. taskmgr.exe
      描述: 任务管理器。它显示系统中正在运行的进程。这不是纯粹的系统程序,但是如果终止它,可能会导致不可知的问题。
                                        中毒: 多个相似名称进程,CPU 占用率高,文件位置不正确。

  4. services.exe
      描述: 用于管理启动和停止服务。该进程也会处理在计算机启动和关机时运行的服务。
                                        中毒: 多个相似名称进程,CPU 占用率高,文件位置不正确。

  5. conhost.exe
      描述: 即命令行程序的宿主进程。win7 之前的宿主程序是由 csrss.exe 来完成的,所有命令行进程都使用 session 唯一的 csrss.exe 进程。而到了 win7 则改成每个命令行进程都有一个独立的 conhost 作为宿主了。

  6. mdm.exe
      描述: Windows进程除错程序。用于使用可视化脚本工具对Internet Explorer除错。

中毒:木马病毒程序的惯用伎俩:伪装成与原进程相似的文件名;将原进程名改为其他进程,然后将病毒程序改为原进程进程名;而且中病毒时一般 cpu 的占用率会升高。

(二)内存取证

计算机的操作系统和应用使用主内存(RAM)来执行不同的任务。这种易失性内存包含大量关于运行应用、网络连接、内核模块、打开的文件以及几乎所有其他的内容信息,但这些信息每次计算机重启的时候都会被清除。

内存取证(Memory forensics)是一种从内存中找到和抽取这些有价值的信息的方式。

1.基础知识了解

.vmem文件表示虚拟内存文件,与pagefile.sys相同

.raw文件是内存取证工具Dumpit提取内存生成的内存转储文件

profile是特定操作系统版本以及硬件体系结构(x86,x64,ARM)中VTypes,共用体,对象类型的集合。除了这些组件以外,profile还包括元数据(操作系统的名称),内核版本以及编译号,系统调用信息,索引以及系统调用的名称,常量值(全局变量),在某些操作系统中能够在硬编码的地址处找到的全局变量 系统映射(关键全局变量和函数的地址,仅限Linux和Mac)

每个profile都有个一个唯一的名称,通常是由操作系统的名称,版本,服务包,系统结构等信息组成。

例如Win7SP1x64是64位的Windows 7 SP1系统配置文件的名称

2. Volatility环境配置

Volatility:是一款开源的,基于Python开发的内存取证工具集,能够对导出的内存镜像进行分析,通过获取内核数据结构,使用插件获取内存的详细情况以及系统的运行状态。Volatility支持对32位或64位Wnidows、Linux、Mac、Android操作系统的RAM数据进行提取与分析。

linux下运行 Volatility 命令的主要入口点是 vol.py 脚本,windows下是一个exe文件。

  • windows中可以直接下载已经编译好的可执行文件,放入环境变量中命令行使用

  • linux下也有对应的可执行文件,同时也可以下载源码自己手动配置。(如果需要用到一些插件,建议手动配置)

下面介绍如何在linux下源码配置并关联扩展插件。(Volatility 已经用 Python 3 重写了,但是本教程使用的是用 Python 2 写的原始的 Volatility 包)

  1. 下载源码并安装

    git clone https://github.com/volatilityfoundation/volatility.git
    python setup.py build   
    python setup.py install
    
  2. python2环境下配置第三方库

    在进行安装时,部分模块可能会报错,这就需要到https://pypi.org/project/搜索相应版本的模块的源码,进行手动安装。

    每次安装完一个库就在python2环境里import测试一下是否安装成功

  3. 测试是否安装成功

    python vol.py --info
    
  4. 配置mimikatz扩展插件(如果只用本体的功能可以忽略这一步)

    下载插件

    wget https://github.com/volatilityfoundation/community/raw/master/FrancescoPicasso/mimikatz.py
    cp mimikatz.py ./volatility-master/volatility/plugins/
    

    安装construct模块

    sudo pip2 uninstall construct
    sudo pip2 install construct==2.5.5-reupload
    

    单独执行一下mimikatz.py文件检查有没有报错

    python mimikatz.py 
    

3. Volatility使用

其实使用volatility主要是使用它的内置插件来获取种种信息。

Volatility命令的通用格式如下

#linux
python2 vol.py -f <memory-dump-file-taken-by-Lime> --profile=<name-of-our-custom-profile> <plugin-name>
#windows
volatility -f <memory-dump-file-taken-by-Lime> --profile=<name-of-our-custom-profile> <plugin-name>
#<plugin-name>可以放在profile的前面

使用下面的命令可以看volatility所支持的所有插件,不带前缀的是windows的插件,带linux前缀的是linux的插件,带mac前缀的是mac的插件

python vol.py --info
# 查看那些针对Linux设计的插件
python vol.py --info | grep -i linux_

一般在使用前看看目标内存转储文件的架构

#windows
volatility -f 内存转储文件 imageinfo
#linux
python vol.py -f 内存转储文件 imageinfo

Windows内存转储文件取证分析

参考:内存取证 | Yu'Blog (gitee.io)

对于Windows内存转储文件,插件使用及对应的说明如下。

插件名称 功能
amcache 查看AmCache应用程序痕迹信息
apihooks 检测内核及进程的内存空间中的API hook
atoms 列出会话及窗口站atom表
atomscan Atom表的池扫描(Pool scanner)
auditpol 列出注册表HKLMSECURITYPolicyPolAdtEv的审计策略信息
bigpools 使用BigPagePoolScanner转储大分页池(big page pools)
bioskbd 从实时模式内存中读取键盘缓冲数据(早期电脑可以读取出BIOS开机密码)
cachedump 获取内存中缓存的域帐号的密码哈希
callbacks 打印全系统通知例程
clipboard 提取Windows剪贴板中的内容
cmdline 显示进程命令行参数
cmdscan 提取执行的命令行历史记录(扫描_COMMAND_HISTORY信息)
connections 打印系统打开的网络连接(仅支持Windows XP 和2003)
connscan 打印TCP连接信息
consoles 提取执行的命令行历史记录(扫描_CONSOLE_INFORMATION信息)
crashinfo 提取崩溃转储信息
deskscan tagDESKTOP池扫描(Poolscaner)
devicetree 显示设备树信息
dlldump 从进程地址空间转储动态链接库
dlllist 打印每个进程加载的动态链接库列表
driverirp IRP hook驱动检测
drivermodule 关联驱动对象至内核模块
driverscan 驱动对象池扫描
dumpcerts 提取RAS私钥及SSL公钥
dumpfiles 提取内存中映射或缓存的文件
dumpregistry 转储内存中注册表信息至磁盘
editbox 查看Edit编辑控件信息 (Listbox正在实验中)
envars 显示进程的环境变量
eventhooks 打印Windows事件hook详细信息
evtlogs 提取Windows事件日志(仅支持XP/2003)
filescan 提取文件对象(file objects)池信息
gahti 转储用户句柄(handle)类型信息
gditimers 打印已安装的GDI计时器(timers)及回调(callbacks)
gdt 显示全局描述符表(Global Deor Table)
getservicesids 获取注册表中的服务名称并返回SID信息
getsids 打印每个进程的SID信息
handles 打印每个进程打开的句柄的列表
hashdump 转储内存中的Windows帐户密码哈希(LM/NTLM)
hibinfo 转储休眠文件信息
hivedump 打印注册表配置单元信息
hivelist 打印注册表配置单元列表
hivescan 注册表配置单元池扫描
hpakextract 从HPAK文件(Fast Dump格式)提取物理内存数据
hpakinfo 查看HPAK文件属性及相关信息
idt 显示中断描述符表(Interrupt Deor Table)
iehistory 重建IE缓存及访问历史记录
imagecopy 将物理地址空间导出原生DD镜像文件
imageinfo 查看/识别镜像信息
impscan 扫描对导入函数的调用
joblinks 打印进程任务链接信息
kdbgscan 搜索和转储潜在KDBG值
kpcrscan 搜索和转储潜在KPCR值
ldrmodules 检测未链接的动态链接DLL
lsadump 从注册表中提取LSA密钥信息(已解密)
machoinfo 转储Mach-O 文件格式信息
malfind 查找隐藏的和插入的代码
mbrparser 扫描并解析潜在的主引导记录(MBR)
memdump 转储进程的可寻址内存
memmap 打印内存映射
messagehooks 桌面和窗口消息钩子的线程列表
mftparser 扫描并解析潜在的MFT条目
moddump 转储内核驱动程序到可执行文件的示例
modscan 内核模块池扫描
modules 打印加载模块的列表
multiscan 批量扫描各种对象
mutantscan 对互斥对象池扫描
notepad 查看记事本当前显示的文本
objtypescan 扫描窗口对象类型对象
patcher 基于页面扫描的补丁程序内存
poolpeek 可配置的池扫描器插件
printkey 打印注册表项及其子项和值
privs 显示进程权限
procdump 进程转储到一个可执行文件示例
pslist 按照EPROCESS列表打印所有正在运行的进程
psscan 进程对象池扫描
pstree 以树型方式打印进程列表
psxview 查找带有隐藏进程的所有进程列表
qemuinfo 转储Qemu 信息
raw2dmp 将物理内存原生数据转换为windbg崩溃转储格式
screenshot 基于GDI Windows的虚拟屏幕截图保存
servicediff Windows服务列表(ala Plugx)
sessions _MM_SESSION_SPACE的详细信息列表(用户登录会话)
shellbags 打印Shellbags信息
shimcache 解析应用程序兼容性Shim缓存注册表项
shutdowntime 从内存中的注册表信息获取机器关机时间
sockets 打印已打开套接字列表
sockscan TCP套接字对象池扫描
ssdt 显示SSDT条目
strings 物理到虚拟地址的偏移匹配(需要一些时间,带详细信息)
svcscan Windows服务列表扫描
symlinkscan 符号链接对象池扫描
thrdscan 线程对象池扫描
threads 调查_ETHREAD 和_KTHREADs
timeliner 创建内存中的各种痕迹信息的时间线
timers 打印内核计时器及关联模块的DPC
truecryptmaster 恢复TrueCrypt 7.1a主密钥
truecryptpassphrase 查找并提取TrueCrypt密码
truecryptsummary TrueCrypt摘要信息
unloadedmodules 打印卸载的模块信息列表
userassist 打印注册表中UserAssist相关信息
userhandles 转储用户句柄表
vaddump 转储VAD数据为文件
vadinfo 转储VAD信息
vadtree 以树形方式显示VAD树信息
vadwalk 显示遍历VAD树
vboxinfo 转储Virtualbox信息(虚拟机)
verinfo 打印PE镜像中的版本信息
vmwareinfo 转储VMware VMSS/VMSN 信息
volshell 内存镜像中的shell
windows 打印桌面窗口(详细信息)
wintree Z顺序打印桌面窗口树
wndscan 池扫描窗口站
yarascan 以Yara签名扫描进程或内核内存
功能 命令行及参数
查看进程列表 Vol.exe -f Win7_SP1_x86.vmem –profile=Win7SP1x86 pslist
查看进程列表(树形) Vol.exe -f Win7_SP1_x86.vmem –profile=Win7SP1x86 pstree
查看进程列表(psx视图) Vol.exe -f Win7_SP1_x86.vmem –profile=Win7SP1x86 psxview
查看网络通讯连接 Vol.exe -f Win7_SP1_x86.vmem –profile=Win7SP1x86 netscan
查看加载的动态链接库 Vol.exe -f Win7_SP1_x86.vmem –profile=Win7SP1x86 dlllist
查看SSDT表 Vol.exe -f Win7_SP1_x86.vmem –profile=Win7SP1x86 ssdt
查看UserAssist痕迹 Vol.exe -f Win7_SP1_x86.vmem –profile=Win7SP1x86 userassist
查看ShimCache痕迹 Vol.exe -f Win7_SP1_x86.vmem –profile=Win7SP1x86 shimcache
查看ShellBags Vol.exe -f Win7_SP1_x86.vmem –profile=Win7SP1x86 shellbags
查看服务列表 Vol.exe -f Win7_SP1_x86.vmem –profile=Win7SP1x86 svcscan
查看Windows帐户hash Vol.exe -f Win7_SP1_x86.vmem –profile=Win7SP1x86 hashdump
查看最后关机时间 Vol.exe -f Win7_SP1_x86.vmem –profile=Win7SP1x86 shutdowntime
查看IE历史记录 Vol.exe -f Win7_SP1_x86.vmem –profile=Win7SP1x86 iehistory
提取注册表数据 Vol.exe -f Win7_SP1_x86.vmem –profile=Win7SP1x86 dumpregistry
解析MFT记录 Vol.exe -f Win7_SP1_x86.vmem –profile=Win7SP1x86 mftparser
导出MFT记录,恢复文件 Vol.exe -f Win7_SP1_x86.vmem –profile=Win7SP1x86 mftparser –output-file=mftverbose.txt -D mftoutput
获取TrueCrypt密钥信息 Vol.exe -f Win7_SP1_x86.vmem –profile=Win7SP1x86 truecryptmaster
获取TrueCrypt密码信息 Vol.exe -f Win7_SP1_x86.vmem –profile=Win7SP1x86 truecryptpassphras

Linux内存转储文件取证分析

直接参考

CTF常用命令总结

内存取证(volatility) - 云+社区 - 腾讯云 (tencent.com)

使用imageinfo插件来猜测dump文件的profile值

volatility -f xxx imageinfo

指定profile值,使用pslist去列举系统进程

volatility -f xxx --profile=xxx pslist

查看控制台输入的历史命令

volatility cmdscan -f xxx --profile=xxx

查看IE历史信息

volatility iehistory -f xxx --profile=xxx

查看截图

volatility -f xxx --profile=xxx screenshot --dump-dir=./

配合管道指令和搜索指令扫描特定类型的文件

volatility -f xxx --profile=xxx filescan | grep 'flag|ctf'
volatility -f xxx --profile=xxx filescan | grep "doc|docx|rtf|txt"
volatility -f xxx --profile=xxx filescan | grep "jpg|jpeg|png|tif|gif|bmp"
#查看桌面文件
volatility -f Cookie.raw --profile=xxx filescan | grep "Desktop"

导出某个进程的内存数据

volatility -f xxx --profile=xxx memdump -p [PID] -D [输出目录]

获取系统密码(2种方法)

  1. 使用 hashdump 将hash值提取打印出来

    volatility -f xxx  --profile=xxx hashdump
    

    打印出的字符串含义满足如下关系(最后末尾的项是NT-HASH,是我们要破解的HASH值)

    用户名:RID:LM-HASH:NT-HASH

    把要破解的用户名所在行复制粘贴作为Single Hash,load到ophcrack然后crack

  2. 用mimikatz扩展插件直接获取明文密码

    python vol.py -f xxx --profile=xxx mimikatz
    

查看缓存在内存的注册表

PS:注册表是Microsoft Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息。

volatility -f xxx --profile=xxx hivelist

恢复被删除的文件,mftoutput.txt 里面包含内存里面的文件(文件路径,文件内容)

volatility -f xxx --profile=xxx mftparser>mftoutput.txt

导出注册表资源

volatility -f xxx --profile=xxx dumpregistry --dump-dir=C:\Users\18267\Desktop\2

提取filescan的文件

volatility -f xxx  --profile=xxx dumpfiles -Q 0x...... --dump-dir=./  
//-Q指定了文件物理位置的开始,另一个参数制定了保存的位置。
命令 功能
cmdscan 列出历史cmd命令
filescan 扫描文件,可配合grep使用
pslist/psscan 列出进程列表
svcscan 扫描windows服务列表
memdump 从内存dump进程的内存
dumpfiles 从内存dump文件

4. Magnet AXIOM环境配置与使用

国外的一款图形化取证工具,功能类似于取证大师,内置volatility

参考:CTF必备取证神器 - 知乎 (zhihu.com)

下载链接:https://www.aliyundrive.com/s/EpRbevKEUi5

使用:打开Magnet AXIOM Process;点击新建案件;在证据来源标签页下选择源计算机加载或获取证据源,然后加载要分析的转储文件。切换到分析证据,选中要分析的源然后点击分析证据

分析过程中CPU占用比较大,时间也比较久

5. ophcrack配置与使用

参考:ophcrack的简单用法

Ophcrack是一款利用彩虹表来破解 Windows密码的工具。其次是两篇有关Ophcrack的技术文章:杜莉翻译的“安全高手的利器认识彩虹哈希表破解工具”

  1. 下载便携版免安装ophcrack download | SourceForge.net
  2. 下载彩虹表Ophcrack (sourceforge.io)(只能下XP free small、XP free small、Vista free)
  3. 建立一个tables文件夹,把下载的彩虹表解压到该文件夹下,在ophcrack中点击Table,选中你下载的彩虹表对应的table,然后点击install,弹出文件夹选择框后选择解压出的彩虹表文件夹,可以看到标识变成绿色。

点开load

  • Single Hash主要用于对单个Hash的破解,
  • PWDUMP file是对获取的Pwdump文件进行破解,
  • Encrypted SAM是对加密的sam文件进行破解

(三)磁盘取证

文件系统是一种用于向用户提供底层数据访问的机制。它将设备中的空间划分为特定大小的块(或者称为),一般每块512字节。数据存储在这些块中,大小被修正为占用整数个块。由文件系统软件来负责将这些块组织为文件和目录,并记录哪些块被分配给了哪个文件,以及哪些块没有被使用。不过,文件系统并不一定只在特定存储设备上出现。它是数据的组织者和提供者,至于它的底层,可以是磁盘,也可以是其它动态生成数据的设备(比如网络设备)。——维基百科

DOS / Microsoft Windows对几类文件系统(FAT12/FAT16 、FAT32/VFAT、FAT64/exFAT、NTFS)的支持情况如下

Windows FAT12/FAT16 FAT32/VFAT FAT64/exFAT NTFS
Windows 3.x或更早 (MS-DOS 6.22) (PC-DOS 7.0) 可读/可写 不支持 不支持 不支持
Windows 95 可读/可写 不支持 不支持 不支持
Windows 95(OSR2以后) Windows 98(含SE) ME 可读/可写 可读/可写 不支持 不支持
Windows NT 4.0 及以前 可读/可写 不支持 不支持 可读/可写
2000 Windows XP Windows Vista Server 2003 Server 2008 (R2) Windows 7 Windows 8 Server 2012 (R2) Windows 8.1Windows 10 可读/可写 可读/可写 可读/可写 可读/可写
Windows CE 可读/可写 可读/可写 可读/可写 不支持

1. NTFS磁盘文件系统取证

磁盘文件系统是一种设计用来利用数据存储设备来保存计算机文件的文件系统,最常用的数据存储设备是磁盘驱动器,可以直接或者间接地连接到计算机上。例如:FATexFATNTFSHFSHFS+ext2ext3ext4ODS-5btrfsXFSUFSZFS。——维基百科

题目:【2021强网杯】EzTime

NTFS 包含若干用于定义和组织文件系统的文件(内含对磁盘的管理数据)。

区段编号 元文件名 作用
0 $MFT 描述卷上的所有文件,包括文件名、时间戳、流名称和数据流所在的簇的编号列表、索引、安全标识符,以及文件属性(如“只读”、“压缩”、“加密”等)。
1 $MFTMirr(MFT镜像) | $MFT 的最开始的几个关键项的副本,通常是 4 项(4KB)
2 $LogFile(日志文件) 包含文件系统更改的事务日志,以保护元数据的稳定性。
3 $Volume(卷文件) | 包含卷的相关信息,如卷对象标识符、卷标、文件系统版本,以及卷标志(加载、需要扫描、需要调整 LogFile 大小、在 NT4 上加载、正在更新卷串行号、需要升级结构)。卷串行号储存在 Boot 文件中。
4 $AttrDef(属性定义表) 使用的 NTFS 属性的表,包含名称、编号和描述。
5 $Root(根目录) 根目录。
6 $Bitmap(位图文件) 一个位图,用于指示卷上的指定簇正在被使用或空闲。
7 $Boot(引导文件) | 卷引导记录,该文件位于卷的第一个簇,其中包含引导代码(用于定位并启动 NTLDR/BOOTMGR)、一个 BIOS 参数区块(其中包含卷串行号),以及 MFT 和 MFTMirr 所在的簇编号。
8 $BadClus(坏簇文件) 包含所有标记为“有坏扇区”的簇的一个文件。该文件用于为 chksdk(磁盘扫描)工具简化簇的管理,用于放置新发现的坏扇区,以及标识未被引用的簇。
9 $Secure(安全文件) 访问控制列表(ACL)数据库,统一将 ACL 存储于该数据库中而非每个文件存储各自的 ACL 以减少总体代价。包含两个索引:SII——可能是安全ID索引,以及 SDH——安全描述符哈希,用于索引包含实际 ACL 列表的称为 SDS 的流的位置。
10 $UpCase(大写文件) 一个 Unicode 大写字母表,用于确保在 Win32 和 DOS 命名空间下大小写不敏感。
11 $Extend(扩展元数据文件) | 一个文件系统目录,包含若干不定的可选扩展,如 Quota、ObjIdReparse、UsnJrnl 等。
12 ... 23 保留。
通常是 24 $Extend\$Quota(配额管理文件) 包含关于磁盘限额的信息。
通常是 25 $Extend\$ObjId(对象ID文件) 包含用于分布链接跟踪的信息。
通常是 26 $Extend\$Reparse 包含对卷上所有重解析点(如符号链接)的反引用。
27 ... *file.ext* 常规文件项的开始位置。

(1)$MFT文件

参考:NTFS文件系统文件记录分析 | 数据恢复迷 (dgxue.com)

MFT以文件记录来实现对文件的管理,每个文件记录都对应着不同的文件,大小固定为1KB,也就是占用两个扇区,而不管簇的大小是多少。如果一个文件有很多属性或是分散成很多碎片,就很可能需要多个文件记录。这时,存放其文件记录位置的第一个记录就称作“基本文件记录”。

文件记录在MFT中物理上是连续的,从0开始依次按顺序编号。

前16个文件记录总是元文件的记录,并且这16个文件记录的顺序是固定的(按照上表中的顺序)

$MFT=n\times文件记录 \\文件记录=文件记录头+属性列表

$MFT可以看作是一个结构体数组,结构体元素(即文件记录)的结构组成如下

struct 文件记录{
文件记录头;
属性1;
属性2;
属性3;
……
}
——文件记录头

文件记录头是固定长度的

字节偏移 字段长度(字节) 字段名和含义
0x00 4 MFT标志,一定为字符串“FILE”
0x04 2 更新序列号(Update Sequence Number)的偏移
0x06 2 更新序列号的大小与数组,包括第一个字节
0x08 8 日志文件序列号($LogFile Sequence Number,LSN),每次记录被修改都将导致其被修改
0x10 2 序列号(Sequence Number),记录主文件表记录被重复使用的次数。
0x12 2 硬连接数(Hard Link Count),即有多少目录指向该文件。只出现在基本文件记录中
0x14 2 第一个属性的偏移地址
0x16 2 标志(Flag),00H表示文件被删除,01H表示文件正在使用,02H表示目录被删除,03H表示目录正在使用
0x18 4 文件记录的实际长度也即文件记录在磁盘上实际占用的字节空间。
0x1C 4 给文件记录的分配长度,一般为“00 04 00 00”,也就是1KB的长度
0x20 8 基本文件记录中的文件索引号,基本文件记录在此的值总为0。如果不为0,则是一个主文件表的文件索引号,指向所属的基本文件记录中的文件记录号。在基本文件记录中包含有扩展文件记录的信息,存储在“属性列表ATTRIBUTE_LIST”属性中。
0x28 2 下一属性ID,当增加新的属性时,将该值分配给新属性,然后该值增加,如果MFT记录重新使用,则将它置0,第一个实例总是0
0x2A 2 边界,Windows XP中为偏移0x30处
0x2C 4 文件记录参考号(从0开始编号),Windows XP中使用,Windows 2000中无此参数
0x30 2 更新序列号,这两个字节同时会出现在该文件记录第一个扇区最后两个字节处及该文件记录第二个扇区最后两个字节处,
0x32 4 更新数组
——属性列表

对于属性列表中的每个属性而言

属性=属性头+属性体

每个文件记录中都有多个属性,它们相对独立,有各自的类型和名称。属性头前4个字节区分属性的种类,主要有以下几种属性

属性类型(Little-Endian) 属性类型名 属性描述
10 00 00 00 $STANDARD_INFORMATION  标准信息:包括一些基本文件属性,如只读、系统、存档;时间属性,如文件的创建时间和最后修改时间;有多少目录指向该文件(即其硬连接数(hard link count))
20 00 00 00 $ATTRIBUTE_LIST  属性列表:当一个文件需要多个文件记录时,用来描述文件的属性列表
30 00 00 00 $FILE_NAME  文件名:用Unicode字符表示的文件名,由于MS-DOS不能识别长文件名,所以NTFS系统会自动生成一个8.3文件名
40 00 00 00 $VOLUME_VERSION  在早期的NTFS v1.2中为卷版本
40 00 00 00 $OBJECT_ID  对象ID:一个具有64字节的标识符,其中最低的16字节对卷来说是唯一的(链接跟踪服务为外壳快捷方式,即OLE链接源文件赋予对象ID;NTFS提供的API是直接通过这些对象的ID而不是文件名来打开文件的)
50 00 00 00 $SECURITY_DESCRIPTOR  安全描述符:这是为向后兼容而保留的,主要用于保护文件以防止没有授权的访问,但Windows 2000/XP中已将安全描述符存放在$Secure元数据中,以便于共享(早期的NTFS将其与文件目录一起存放,不便于共享)
60 00 00 00 $VOLUME_NAME  卷名(卷标识):该属性仅存在于$Volume元文件中
70 00 00 00 $VOLUME_INFORMATION  卷信息:该属性仅存在于$Volume元文件中
80 00 00 00 $DATA  文件数据:该属性为文件的数据内容
90 00 00 00 $INDEX_ROOT  索引根
A0 00 00 00 $INDEX_ALLOCATION  索引分配
B0 00 00 00 $BITMAP  位图
C0 00 00 00 $SYMBOLIC_LINK  在早期的NTFS v1.2中为符号链接
C0 00 00 00 $REPARSE_POINT  重解析点
D0 00 00 00 $EA_INFORMATION  扩充属性信息
E0 00 00 00 $EA  扩充属性
F0 00 00 00 $PROPERTY_SET  早期的NTFS v1.2中才有
00 10 00 00 $LOGGED_UTILITY_STREAM  EFS加密属性:该属性主要用于存储实现EFS加密的有关加密信息,如合法用户列表、解码密钥等

(2)工具

  • NTFS Log Tracker(导出为可视化的csv或者db文件)
  • X-Ways Forensics(强大的综合性计算机取证工具)

2. 磁盘加密

BitLocker加密解密

题目:

在CTF中需要找BitLocker 恢复密钥来进行BitLocker解密,进而提取出磁盘里面的内容

Bitlocker可以对存储设备做硬件加密,防止设备丢失时,导致文件内容被别人破解查看

Bitlocker的解锁方式主要有三种:TPM、PIN、恢复密钥

  • TPM是在主板上的硬件芯片,可以存储各种证书密钥,不是所有电脑都有。
  • PIN就是自己设置的一个解锁密码。
  • 恢复密钥是一个最短48位的数字,可以被制作成密钥文件存储于U盘作为解密工具。

恢复密钥的获取方式(来自在 Windows 中查找 BitLocker 恢复密钥 (microsoft.com)):

  1. 在 Microsoft 帐户中: 在另一台设备上登录到 Microsoft 帐户以查找恢复密钥。 如果你有一台支持自动设备加密的现代设备,则恢复密钥最有可能在你的 Microsoft 帐户中。 有关详细信息,请参阅 Windows 中的设备加密

    或者直接登录此处就可以获取

  2. 在打印输出上: 在激活 BitLocker 时,可能打印了恢复密钥。 在存放与你的计算机相关的重要文件的位置查找。

  3. 在 U 盘上: 将 U 盘插入锁定的电脑,然后按照说明进行操作。 如果你已在 U 盘上将密钥另存为文本文件,则使用另一台计算机阅读此文本文件。

  4. 在 Azure Active Directory 帐户中: 如果设备曾使用工作或学校电子邮件帐户登录到组织,则恢复密钥可能存储在与Azure AD关联的组织帐户。 你或许可以直接访问它,也可能需要联系系统管理员来访问恢复密钥。

  5. 由系统管理员持有: 如果设备已连接到域, (工作或学校设备) ,请向系统管理员请求恢复密钥。

这种类型的题目通常结合内存取证,从内存中dump出恢复密钥,解密磁盘,挂载并取出加密磁盘中的flag

——如何解密磁盘文件:

3. 磁盘挂载

参考:【电子取证:FTK Imager 篇】DD、E01系统镜像动态仿真__ftk挂载镜像

【方法一】FTK Imager挂载

FTK Imager工具 “可写”模式下挂载系统镜像为本地驱动器

image-20211125112342895

【方法二】Linux的mount指令

Linux 系统中“一切皆文件”,所有文件都放置在以根目录为树根的树形目录结构中。在 linux 看来,任何硬件设备也都是文件,它们各有自己的一套文件系统(文件目录结构)。Linux中的根目录以外的文件要想被访问,需要将其“关联”到根目录下的某个目录来实现,这种关联操作就是“挂载”,这个目录就是”挂载点”,解除次关联关系的过程称之为“卸载”。不是根目录下任何一个目录都可以作为挂载点,由于挂载操作会使得原有目录中文件被隐藏,因此根目录以及系统原有目录都不要作为挂载点,会造成系统异常甚至崩溃,挂载点最好是新建的空目录

mount\ \ [-f\ \ nrsvw]\ \ [-t\ \ 系统类型]\ \ [-o\ \ options]\ \ [其它选项]\ \ device\ \ dir

  1. device:指明要挂载的设备;

    • 设备文件:例如/dev/sda5

    • 卷标-L ‘LABEL’, 例如 -L 'MYDATA'

    • UUID-U ‘UUID’,例如 -U '0c50523c-43f1-45e7-85c0-a126711d406e'

    • 伪文件系统名称:proc, sysfs, devtmpfs, configfs

  2. dir:挂载点,事先存在;建议使用空目录,进程正在使用中的设备无法被卸载;

  3. 系统类型:指定欲挂载的文件系统类型。Linux 常见的支持类型有 EXT2、EXT3、EXT4、iso9660(光盘格式)、vfat、reiserfs 等。如果不指定具体类型,挂载时 Linux 会自动检测。

  4. options

    options 描述
    rw/ro 是否对挂载的文件系统拥有读写权限,rw 为默认值,表示拥有读写权限;ro 表示只读权限。
    async/sync 此文件系统是否使用同步写入(sync)或异步(async)的内存机制,默认为异步 async。
    dev/nodev 是否允许从该文件系统的 block 文件中提取数据,为了保证数据安装,默认是 nodev。
    auto/noauto 是否允许此文件系统被以 mount -a 的方式进行自动挂载,默认是 auto。
    suid/nosuidsuid/nosuid 设定文件系统是否拥有 SetUID 和 SetGID 权限,默认是拥有。
    exec/noexec 设定在文件系统中是否允许执行可执行文件,默认是允许。
    user/nouser 设定此文件系统是否允许让普通用户使用 mount 执行实现挂载,默认是不允许(nouser),仅有 root 可以。
    defaults 定义默认值,相当于 rw、suid、dev、exec、auto、nouser、async 这 7 个选项。
    remount 重新挂载已挂载的文件系统,一般用于指定修改特殊权限。
  5. 其它选项

    选项 描述
    -r readonly,只读挂载;
    -w read and write, 读写挂载;
    -n 不更新/etc/mtab;
    -a 自动挂载所有支持自动挂载的设备;(定义在了/etc/fstab文件中,且挂载选项中有“自动挂载”功能)
    -B, --bind 绑定目录到另一个目录上;

【方法三】OSFMount / DiskGenius

(四)ISO镜像光盘取证

1. ISO 9960文件结构

先理清一下ISO文件的结构(n和m是数目)

ISO=(1)\textcolor{red}{System Area}+(n)\textcolor{red}{Volume Descriptors}+\textcolor{red}{Path Table}+(m)\textcolor{red}{Directories}

参考:

ISO文件有很多数据类型,关于ISO文件的数据类型表可以参照附录部分

(1)系统区域(System Area)

前32 KB(0 \sim 7FFFH)是ISO 9660 文件的系统区域,可用于任意数据。通常用于存储启动信息,以防 ISO 9660 文件系统不是存储在光学介质上,而是存储在类似硬盘的设备上,例如在 U 盘上。因此需要在该位置查找主启动记录(MBR,用于 BIOS)、GUID 分区表(GPT,用于 EFI)或 Apple 分区图 (APM)。

(2)卷描述符(Volume Descriptors)

先总结一下特点:

  • 每个卷描述符都是2KB(800H个字节)大小
  • 卷描述符以一个卷描述符类型码起始,类型码不同,作用也不同。
  • 符合 ISO 9660 标准的光盘必须至少包含一个描述文件系统的主卷描述符和一个卷描述符集终止符,该终止符是标记描述符集末尾的卷描述符。

准备挂载 CD 时,您的第一个操作将是读取卷描述符(具体来说,您将查找主卷描述符)。

卷描述符有很多种,基本格式如下:

偏移 长度(字节) 字段名称 数据类型 描述
0 1 类型 int8 卷描述符类型代码(见下文)。
1 5 标识符 strA 始终为"CD001"。
6 1 版本 int8 卷描述符版本(0x01)。
7 2041 数据 - 取决于卷描述符类型。

可以看出每个卷描述符因此是一个扇区(2 KB)长。

卷描述符类型码不同数值所代表的含义如下

数值 描述
0 引导记录
1 主卷描述符
2 补充卷描述符
3 卷分区描述符
4-254 (保留)
255 卷描述符集终结符

下面一 一介绍几种几种常见的卷描述符。

引导记录卷描述符(The Boot Record)

第一种类型的卷描述符是"引导记录"。

描述符格式如下:

偏移 长度(字节) 字段名称 数据类型 描述
0 1 类型 int8 0表示启动记录。
1 5 标识符 strA 始终为"CD001"。
6 1 版本 int8 卷描述符版本(0x01)。
7 32 引导系统标识符 strA 可以作用于系统并从引导记录引导系统的系统的 ID。
39 32 启动标识符 strA 标识在此描述符的其余部分中定义的引导系统。
71 1977 引导系统使用 - 自定义 - 由引导系统使用。

最常见的引导系统使用规范是El Torito。它将字节 71 到 74 记录为 El Torito Boot Catalog 的块地址的小端 32 位数字。此目录列出了可用的启动映像,这些映像用作启动系统的起点。

主卷描述符(The Primary Volume Descriptor)

这是一个冗长的描述符,但它包含一些非常有用的信息。

偏移 长度(字节) 字段名称 数据类型 描述
0 1 Type Code(类型代码) int8 始终为主卷描述符0x01。
1 5 Standard Identifier(标准标识符) strA 始终为"CD001"。
6 1 Version(版本) int8 总是0x01。
7 1 Unused(闲置字段) - 总是0x00。
8 32 System Identifier(系统标识符) strA 可以作用于扇区0x00\sim 0x0F的系统的名称。
40 32 Volume Identifier(卷标识符) strD 标识此卷。
72 8 Unused Field(未使用的字段) - 都是零。
80 8 Volume Space Size(卷空间大小) int32_LSB-MSB 记录卷的逻辑块数。
88 32 Unused Field(未使用的字段) - 都是零。
120 4 Volume Set Size(卷集大小) int16_LSB-MSB 此逻辑卷中集的大小(磁盘数)。
124 4 Volume Sequence Number(卷序列号) int16_LSB-MSB 卷集中此磁盘的编号。
128 4 Logical Block Size int16_LSB-MSB 逻辑块的大小(以字节为单位)。注意:这意味着 CD 上的逻辑块可能不是 2 KB!
132 8 Path Table Size int32_LSB-MSB 路径表的大小(以字节为单位)。
140 4 Location of Type-L Path Table int32_LSB 路径表的 LBA 位置。指向的路径表仅包含小端值。
144 4 Location of the Optional Type-L Path Table int32_LSB 可选路径表的 LBA 位置。指向的路径表仅包含小端值。零表示不存在可选路径表。
148 4 Location of Type-M Path Table int32_MSB 路径表的 LBA 位置。指向的路径表仅包含大端值。
152 4 Location of Optional Type-M Path Table int32_MSB 可选路径表的 LBA 位置。指向的路径表仅包含大端值。零表示不存在可选路径表。
156 34 Directory entry for the root directory(根目录的目录条目) - 请注意,这不是 LBA 地址,而是实际的目录记录,其中包含单字节目录标识符(0x00),因此固定的 34 字节大小。
190 128 Volume Set Identifier(卷集标识符) strD 此卷所属的卷集的标识符。
318 128 Publisher Identifier(发布者标识符) strA 卷发布者。对于扩展的发布者信息,第一个字节应0x5F,后跟根目录中文件的文件名。如果未指定,则应0x20所有字节。
446 128 Data Preparer Identifier(数据准备器标识符) strA 为此卷准备数据的人员的标识符。对于扩展的准备信息,第一个字节应0x5F,后跟根目录中文件的文件名。如果未指定,则应0x20所有字节。
574 128 Application Identifier(应用程序标识符) strA 标识数据如何记录在此卷上。对于扩展信息,第一个字节应0x5F,后跟根目录中文件的文件名。如果未指定,则应0x20所有字节。
702 37 Copyright File Identifier(版权文件标识符) strD 根目录中包含此卷集版权信息的文件的文件名。如果未指定,则应0x20所有字节。
739 37 Abstract File Identifier(抽象文件标识符) strD 根目录中包含此卷集抽象信息的文件的文件名。如果未指定,则应0x20所有字节。
776 37 Bibliographic File Identifier(书目文件标识符) strD 根目录中包含此卷集的书目信息的文件的文件名。如果未指定,则应0x20所有字节。
813 17 Volume Creation Date and Time(卷创建日期和时间) dec-datetime 创建卷的日期和时间。
830 17 Volume Modification Date and Time(卷修改日期和时间) dec-datetime 修改卷的日期和时间。
847 17 Volume Expiration Date and Time(卷到期日期和时间) dec-datetime 在此日期和时间之后,此卷被视为已过时。如果未指定,则该卷永远不会被视为已过时。
864 17 Volume Effective Date and Time(批量生效日期和时间) dec-datetime 在该字段指定的日期之后可以使用该卷。如果未指定,则可以立即使用该卷。
881 1 File Structure Version(文件结构版本) int8 目录记录和路径表版本(始终0x01)。
882 1 Unused(闲置字段) - 总是0x00。
883 512 Application Used - ISO 9660 未定义的内容。
1395 653 Reserved(保留字段) - 由 ISO 保留。
卷描述符集终结符(Volume Descriptor Set Terminator)

卷描述符集终结符当前未定义其卷描述符的7\sim 2047字节内容 。这意味着其只有类型代码 (255)、标准标识符 ('CD001') 和描述符版本 号(0x01)。

偏移 长度(字节) 字段名称 数据类型 描述
0 1 类型 int8 255 表示卷描述符集终止符。
1 5 标识符 strA 始终为"CD001"。
6 1 版本 int8 卷描述符版本(0x01)。

(3)路径表(The Path Table)

路径表汇总了相关目录层次结构的目录结构。对于映像中的每个目录,路径表提供目录标识符、记录目录的范围的位置、与目录关联的任何扩展属性的长度以及其父目录路径表条目的索引。

路径表的位置可以在主卷描述符中找到。有两种表类型 - L 路径表(与 x86 相关)和 M 路径表。这两个表之间的唯一区别是 L 表中的多字节值是 LSB 优先的,而 M 表中的值是 MSB 优先的。

路径表条目的结构如下:

偏移 大小 描述
0 1 目录标识符的长度
1 1 扩展属性记录长度
2 4 范围位置 (LBA)。这是不同的格式,具体取决于这是L表还是M表(请参阅上面的说明)。
6 2 父目录的目录编号(路径表中的索引)。这是将表限制为 65536 条记录的字段。
8 (可变) 以 d 类字符表示的目录标识符(名称)。
(可变) 1 填充字段 - 如果"目录标识符的长度"字段为奇数,则包含零,否则不存在。这意味着每个表条目将始终以偶数字节号开头。

路径表按目录级别的升序排列,并在每个目录级别中按字母顺序排序。

(4)目录表(Directories)

在从 ISO 9660 CD 读取时的某个时刻,您将需要一个目录记录来查找文件,即使您最初通常使用路径表来查找目录也是如此。与路径表不同,每个目录表只有一个版本,多字节码采用双字节序格式。每个目录都将以 2 个特殊条目开头:一个空字符串,描述 "." 条目,字符串 "\1" 描述".."条目。目录记录的布局如下:

偏移 大小 描述
0 1 目录记录的长度。
1 1 扩展属性记录长度。
2 8 双端格式的范围位置 (LBA)。
10 8 双端格式的数据长度(范围大小)。
18 7 日期和时间(见下文)。
25 1 文件标识(见下文)。
26 1 以交错模式记录的文件的文件大小,否则为零。
27 1 以交错模式记录的文件的交错间隙大小,否则为零。
28 4 卷序列号 - 记录此扩展数据的卷,采用 16 位双端格式。
32 1 文件标识符(文件名)的长度。这将以";"字符结尾,后跟 ASCII 编码的小数("1")中的文件 ID 号。
33 (变量) 文件标识符。
(变量) 1 填充字段 - 如果文件标识符的长度为偶数,则为零,否则,此字段不存在。这意味着目录条目将始终从偶数字节号开始。
(变量) (变量) 系统使用 - 最大记录大小为 255 的剩余字节可用于 ISO 9660 的扩展。最常见的是系统使用共享协议(SUSP)及其应用程序Rock Ridge交换协议(RRIP)。

即使目录跨越多个扇区,也不允许目录条目跨越扇区边界(与路径表不同)。如果没有足够的空间来记录扇区末尾的整个目录条目,则该扇区将进行零填充,并使用下一个连续扇区。

上述一些字段需要解释。

日期/时间字段(Date/Time)

目录表的日期/时间格式与主卷描述符中使用的格式不同。目录表的日期/时间格式为:

偏移 大小(字节) 描述
0 1 自1900年以来的年数
1 1
2 1
3 1 时(0 \sim 23
4 1 分( 0 \sim 59
5 1 秒( 0 \sim 59
6 1 从 GMT 偏移 15 分钟,从 -48(西)到 +52(东)。

这与包含 ASCII 编码十进制值的 PVD 形成鲜明对比,但这种格式可能为了节省大量条目的磁盘空间。

文件标识字段(File Flags)

另一个需要解释的字段是"文件标志"字段。这由一个位标志表示,如下所示:

描述
0 如果设置,则不需要让用户知道此文件的存在,即"隐藏"标志。
1 如果已设置,则此记录描述一个目录(换句话说,它是一个子目录范围)。
2 如果设置,则此文件是"关联文件"。
3 如果设置,扩展属性记录将包含有关此文件格式的信息。
4 如果已设置,则在扩展属性记录中设置所有者和组权限。
5 & 6 (保留)
7 如果设置,则这不是此文件的最终目录记录(对于跨越多个扩展数据块的文件,例如长度超过 4GB 的文件。

六、图片文件

常见的图片存储格式有bmp,jpg,png,tif,gif,pcx,tga,exif,fpx, svg,psd,cdr,pcd,dxf,ufo,eps,ai,raw,WMF,webp,avif,apng 等。

各种图片编码格式详解_格物穷理-CSDN博客_图像编码的编码方式

有的出题人会将图片以base64编码的形式呈现

(一).gif

1. 分帧工具

gif在线分帧Split GIF image in frames (ezgif.com)

linux下的convert命令可以实现分帧。(墙推)

convert cipher.gif flag.png

windows下可以试试GifSplitter ,但帧数多时会很慢。

2. 题型

有时候会将一个含有flag的图片的像素点信息放到每一帧图片中,[2021CISCN线上赛]running_pixel

(二).png

参考:

根据图像的颜色类型划分,PNG 总计支持五类图像。

PNG image type Colour type
灰度 0
真彩色 2
索引颜色 3
有透明通道的灰度 4
有透明通道的真彩色 6

针对这五种类型,其实都支持透明度配置,只是各有区分罢了。灰度(0)、真彩色(2)、索引颜色(3) 通过 tRNS 数据块来维护透明度设置。其中灰度(0)、真彩色(2)支持由配置一个统一的透明度(2字节),无法为每个像素单独配置透明度;索引颜色(3)支持为每个索引颜色设置透明度,但每个索引颜色的透明度设置最大只有 8 bits 的选择空间。对于有透明通道的真彩色(6)、灰度(4),它们不能拥有 tRNS 数据块,因为它们本身的就有透明通道来记录每个像素点的透明度。

PNG图像格式文件由文件署名(89 50 4E 47 0D 0A 1A 0A)和数据块(chunk)组成,下面重点讲数据块

数据块分两个大类,一种是称为关键数据块(critical chunk),就是必须要有的块;另一种叫做辅助数据块(ancillary chunks)。每一个数据块都分为下面4个字段

名称 字节数 说明
Length(长度) 4字节 指定数据块中数据域的长度,其长度不超过(231−1)(231−1)字节
Chunk Type Code(数据块类型码) 4字节 数据块类型码由ASCII字母(A-Z和a-z)组成
Chunk Data(数据块实际内容 可变长度 存储按照Chunk Type Code指定的数据
CRC(循环冗余检测) 4字节 对Chunk Type Code域和Chunk Data域中的数据进行计算并存储值,用来检测是否有错误的循环冗余码

1. 关键数据块

有4个数据块属于关键数据块

  • 文件头数据块IHDR(header chunk):它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。下面给出IHDR的Chunk Data部分组成结构

    Chunk Data内的域名称 字节数 说明
    Width 4 bytes 图像宽度,以像素为单位
    Height 4 bytes 图像高度,以像素为单位
    Bit depth 1 byte 图像深度:索引彩色图像:1,2,4或8 ;灰度图像:1,2,4,8或16 ;真彩色图像:8或16
    ColorType 1 byte 颜色类型:0:灰度图像, 1,2,4,8或16;2:真彩色图像,8或16;3:索引彩色图像,1,2,4或84:带α通道数据的灰度图像,8或16;6:带α通道数据的真彩色图像,8或16
    Compression method 1 byte 压缩方法(LZ77派生算法)
    Filter method 1 byte 滤波器方法
    Interlace method 1 byte 隔行扫描方法:0。
    非隔行扫描:1。此时数据是按照行(ScanLine)来存储的,为了区分第一行,PNG规定在每一行的前面加上0以示区分
  • 调色板数据块PLTE(palette chunk):它包含有与索引彩色图像(indexed-color image)相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块(image data chunk)之前。真彩色的PNG数据流也可以有调色板数据块,目的是便于非真彩色显示程序用它来量化图像数据,从而显示该图像。

    颜色

    字节

    意义

    Red

    1 byte

    0 = 黑色, 255 = 红

    Green

    1 byte

    0 = 黑色, 255 = 绿色

    Blue

    1 byte

    0 = 黑色, 255 = 蓝色

  • 图像数据块IDAT(image data chunk):它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。IDAT存放着图像真正的数据信息,因此,如果能够了解IDAT的结构,我们就可以很方便的生成PNG图像。

    因此,调色板的长度应该是3的倍数,否则,这将是一个非法的调色板。

    对于索引图像,调色板信息是必须的,调色板的颜色索引从0开始编号,然后是1、2……,调色板的颜色数不能超过色深(即IHDR中的Bit depth)中规定的颜色数,如图像色深为4的时候,调色板中的颜色数不可以超过2^4=16,否则,这将导致PNG图像不合法。

    真彩色图像和带\alpha通道数据的真彩色图像也可以有调色板数据块,目的是便于非真彩色显示程序用它来量化图像数据,从而显示该图像。

  • 图像结束数据IEND(image trailer chunk):它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部

    如果我们仔细观察PNG文件,我们会发现,文件的结尾12个字符看起来总应该是这样的:

    00 00 00 00 49 45 4E 44 AE 42 60 82
    

    不难明白,由于数据块结构的定义,IEND数据块的长度总是0(00 00 00 00,除非人为加入信息),数据标识总是IEND(49 45 4E 44),因此,CRC码也总是AE 42 60 82同时在IEND块后面添加任何的字符都对文件的打开造成不了影响,那我们就可以在这里藏一些数据(除了ios系统会直接提示),一些入门MISC题经常会把一些信息隐写在后面。

    最后,除了表示数据块开始的IHDR必须放在最前面, 表示PNG文件结束的IEND数据块放在最后面之外,其他数据块的存放顺序没有限制。

2. 辅助数据块

PNG文件格式规范制定的10个辅助数据块是:

  1. 背景颜色数据块bKGD(background color)。
  2. 基色和白色度数据块cHRM(primary chromaticities and white point)。所谓白色度是指当R=G=B=最大值时在显示器上产生的白色度。
  3. 图像γ数据块gAMA(image gamma)。
  4. 图像直方图数据块hIST(image histogram)。
  5. 物理像素尺寸数据块pHYs(physical pixel dimensions)。
  6. 样本有效位数据块sBIT(significant bits)。
  7. 文本信息数据块tEXt(textual data)。
  8. 图像最后修改时间数据块tIME (image last-modification time)。
  9. 图像透明数据块tRNS (transparency)。
  10. 压缩文本数据块zTXt (compressed textual data)。

总结

关键数据块、辅助数据块和专用公共数据块(special-purpose public chunks)综合下表中:

数据块符号 数据块名称 多数据块 可选否 位置限制
IHDR 文件头数据块 第一块
cHRM 基色和白色点数据块 在PLTE和IDAT之前
gAMA 图像γ数据块 在PLTE和IDAT之前
sBIT 样本有效位数据块 在PLTE和IDAT之前
PLTE 调色板数据块 在IDAT之前
bKGD 背景颜色数据块 在PLTE之后IDAT之前
hIST 图像直方图数据块 在PLTE之后IDAT之前
tRNS 图像透明数据块 在PLTE之后IDAT之前
oFFs (专用公共数据块) 在IDAT之前
pHYs 物理像素尺寸数据块 在IDAT之前
sCAL (专用公共数据块) 在IDAT之前
IDAT 图像数据块 与其他IDAT连续
tIME 图像最后修改时间数据块 无限制
tEXt 文本信息数据块 无限制
zTXt 压缩文本数据块 无限制
fRAc (专用公共数据块) 无限制
gIFg (专用公共数据块) 无限制
gIFt (专用公共数据块) 无限制
gIFx (专用公共数据块) 无限制
IEND 图像结束数据 最后一个数据块

tEXt和zTXt数据块中的标准关键字:

关键字 说明
Title 图像名称或者标题
Author 图像作者名
Description 图像说明
Copyright 版权声明
CreationTime 原图创作时间
Software 创作图像使用的软件
Disclaimer 弃权
Warning 图像内容警告
Source 创作图像使用的设备
Comment 各种注释

(三).jpg/.jpeg

参考:jpeg图片格式详解_yun_hen的博客-CSDN博客_jpeg格式

JPEG的文件格式一般有两种文件扩展名:.jpg.jpeg,这两种扩展名的实质是相同的,我们可以把.jpg的文件改名为.jpeg,而对文件本身不会有任何影响。严格来讲,JPEG的文件扩展名应该为.jpeg,由于DOS时代的8.3文件名命名原则,就使用了.jpg的扩展名,这种情况类似于.htm和.html的区别。

JPEG格式可以分为标准JPEG渐进式JPEGJPEG2000三种格式。

JPEG文件分为多个段,段的通用结构满足下面的公式

段=段标识(0xFF)+段类型+段长度(不包括段标识和段类型)+其它

它们的出现顺序以及对应的标识如下

段类型 段标识 描述
SOI ff d8 文件开始
APP0 ff e0 定义交换格式和图像识别信息
DQT ff db 定义量化表
SOF0 ff c0 帧开始
DHT ff c4 霍夫曼(Huffman)表
SOS ff da 扫描行开始
EOI ff d9 文件结束

SOI & APP0——jpeg文件的固定头

jpeg文件的固定头

0000h: FF D8 FF E0 00 10 4A 46 49 46  ÿØÿà..JFIF

其中

  • SOI:FFD8

  • APP0

    ----------------------------------------------------------------------
    名称      字节数     值                   说明
    ----------------------------------------------------------------------
    段标识       1         FF
    段类型       1         E0
    段长度       2         0010               如果有RGB缩略图就=16+3n
      (以下为段内容)
    交换格式      5         4A46494600         “JFIF”的ASCII码
    主版本号      1
    次版本号      1  
    密度单位      1         0=无单位;1=点数/英寸;2=点数/厘米
    X像素密度     2                             水平方向的密度   
    Y像素密度     2                             垂直方向的密度
    缩略图X像素  1                           缩略图水平像素数目  
    缩略图Y像素  1                           缩略图垂直像素数目
    (如果“缩略图X像素”和“缩略图Y像素”的值均>0,那么才有下面的数据)
    RGB缩略图  3×n         n=缩略图像素总数=缩略图X像素×缩略图Y像素
    

SOF0

--------------------------------------------------------------------------
名称  字节数 值       说明
--------------------------------------------------------------------------
段标识   1     FF
段类型   1     C0
段长度   2             其值=8+组件数量×3
  (以下为段内容)
样本精度 1      8       每个样本位数(大多数软件不支持12和16)
图片高度 2
图片宽度 2
组件数量 1      3       1=灰度图,3=YCbCr/YIQ 彩色图,4=CMYK 彩色图
  (以下每个组件占用3字节)
组件 ID     1             1=Y, 2=Cb, 3=Cr, 4=I, 5=Q
采样系数 1              0-3位:垂直采样系数
                        4-7位:水平采样系数
量化表号 1
---------------------------------------------------------------------------

DHT

--------------------------------------------------------------------------
名称   字节数  值       说明
--------------------------------------------------------------------------
段标识   1     FF
段类型   1     C4
段长度   2             其值=19+n(当只有一个HT表时)
  (以下为段内容)
HT信息  1             0-3位:HT号
                                4位:   HT类型, 0=DC表,1=AC表
            5-7位:必须=0
HT位表  16            这16个数的和应该≤256
HT值表  n             n=表头16个数的和
--------------------------------------------------------------------------

(四).bmp

参考:

BMP是Window操作系统中的标准图像文件格式,图像相同的条件下,位图图像文件通常比使用其它压缩算法的图像文件大很多。存储结构的格式可以在WINGDI.h文件中找到定义。结构组成如下:

\textcolor{red}{.bmp}=\textcolor{red}{BitmapFileHeader}+\textcolor{red}{BitmapInformationHeader}[+ColorTable]+\textcolor{red}{BitmapData}

组成结构 含义
位图文件头(bitmap-file header) 包含BMP图像文件的类型、显示内容等信息
位图信息头(bitmap-information header) 包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息;
彩色表/调色板(color table) 这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24位的BMP)就不需要调色板;
位图数据(bitmap-data) 这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其他的小于24位的使用调色板中颜色索引值。

1. 位图文件头(bitmap-file header)

typedef struct tagBITMAPFILEHEADER { 
WORD    bfType;      //图像类型,根据不同的操作系统而不同,在Windows中,此字段的值总为‘BM’
DWORD   bfSize;      //图像文件的大小
WORD    bfReserved1; //保留字段,始终为0 
WORD    bfReserved2; //保留字段,始终为0
DWORD   bfOffBits;   //BMP图像数据的地址
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
偏移量 大小 用途
0000h 2字节 用于标识BMP和DIB文件的魔数,一般为0x42 0x4D,即ASCII的BM。
0002h 4字节 BMP文件的大小(单位为字节)
0006h 2字节 保留(实际值因创建程序而异)
0008h 2字节 保留(实际值因创建程序而异)
000Ah 4字节 位图数据(像素数组)的地址偏移,也就是起始地址。

2. 位图信息头(bitmap-information header)

typedef struct tagBITMAPINFOHEADER{ 
DWORD     biSize;         //本结构的大小,根据不同的操作系统而不同,在Windows中,此字段的值总为28h字节=40字节
LONG      biWidth;        //BMP图像的宽度,单位像素
LONG      biHeight;       //BMP图像的高度
WORD      biPlanes;       //色彩平面数
WORD      biBitCount;     //BMP图像的色深,即一个像素用多少位表示,常见有1、4、8、16、24和32,分别对应单色、16色、256色、16位高彩色、24位真彩色和32位增强型真彩色
DWORD     biCompression;  //压缩方式,0表示不压缩,1表示RLE8压缩,2表示RLE4压缩,3表示每个像素值由指定的掩码决定
DWORD     biSizeImage;    //BMP图像数据大小,必须是4的倍数,图像数据大小不是4的倍数时用0填充补足
LONG      biXPelsPerMeter;//水平分辨率,单位像素/m
LONG      biYPelsPerMeter;//垂直分辨率,单位像素/m
DWORD     biClrUsed;      //BMP图像使用的颜色,0表示使用全部颜色,对于256色位图来说,此值为100h=256
DWORD     biClrImportant; //重要的颜色数,此值为0时所有颜色都重要,对于使用调色板的BMP图像来说,当显卡不能够显示所有颜色时,此值将辅助驱动程序显示颜色
} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;

通过修改biBitCount字段可以实现给图片升维降维

偏移量 大小(字节) 用途
0Eh 4 该头结构的大小(40字节)
12h 4 位图宽度,单位为像素(有符号整数,以像素为单位)
16h 4 位图高度,单位为像素(有符号整数,以像素为单位)。这个值还有一个用处,指明图像是正向的位图还是倒向的位图,该值是正数说明图像是倒向的即图像存储是由下到上;该值是负数说明图像是倒向的即图像存储是由上到下。大多数BMP位图是倒向的位图,所以此值是正值。
1Ah 2 色彩平面数;只有1为有效值
1Ch 2 每个像素所占位数,即图像的色深。典型值为1、4、8、16、24和32
1Eh 4 所使用的压缩方法,可取值见下表。
22h 4 图像大小。指原始位图数据的大小(详见后文),与文件大小不是同一个概念。
26h 4 图像的横向分辨率,单位为像素每米(有符号整数)
2Ah 4 图像的纵向分辨率,单位为像素每米(有符号整数)
2Eh 4 调色板的颜色数,为0时表示颜色数为默认的2^{色深}
32h 4 重要颜色数,为0时表示所有颜色都是重要的;通常不使用本项

其中biCompression字段的取值如下

标识 压缩方法 备注
0 BI_RGB 最常见
1 BI_RLE8 RLE 8位/像素 只能用于格式为8位/像素的位图
2 BI_RLE4 RLE 4位/像素 只能用于格式为4位/像素的位图
3 BI_BITFIELDS 位字段或者霍夫曼1D压缩(BITMAPCOREHEADER2) 像素格式由位掩码指定,或位图经过霍夫曼1D压缩(BITMAPCOREHEADER2)
4 BI_JPEG JPEG或RLE-24压缩(BITMAPCOREHEADER2) 位图包含JPEG图像或经过RLE-24压缩(BITMAPCOREHEADER2)
5 BI_PNG PNG 位图包含PNG图像
6 BI_ALPHABITFIELDS 位字段 针对Windows CE .NET 4.0及之后版本

3. 彩色表/调色板(color table)

这部分定义了图像中所用的颜色。如上所述,位图图像一个像素接着一个像素储存,每个像素使用一个或者多个字节的值表示,所以调色板的目的就是要告诉应用程序这些值所对应的实际颜色。

典型的位图文件使用RGB彩色模型。在这种模型中,每种颜色都是由不同强度(从0到最大强度)的红色(R)、绿色(G)和蓝色(B)组成的,也就是说,每种颜色都可以使用红色、绿色和蓝色的值所定义。

在位图文件的实现中,调色板可以包含很多条目,条目个数就是图像中所使用的颜色的个数。每个条目都是如下的结构,而调色板是该结构的结构体数组。

typedef struct tagRGBQUAD {
    BYTE rgbBlue;       //1B。蓝色值
    BYTE rgbGreen;      //1B。绿色值
    BYTE rgbRed;        //1B。红色值
    BYTE rgbReserved;   //1B。保留,总为0
}RGBQUAD;

每个条目用来描述一种颜色,包含4个字节,其中三个表示蓝色、绿色和红色,第四个字节没有使用(大多数应用程序将它设为0);对于每个字节,数值0表示该颜色分量在当前的颜色中没有使用,而数值255表示这种颜色分量使用最大的强度。

4. 位图数据(bitmap-data)

位图中像素的比特是以为单位对齐存储的,每一行的大小都向上取整为4字节(32位DWORD)的倍数。

存储一行像素所需的字节数可以按下面公式计算

{\mbox{RowSize}}=\left\lfloor {\frac {{\mbox{BitsPerPixel}}\cdot {\mbox{ImageWidth}}+31}{32}}\right\rfloor \cdot 4(ImageWidth以像素为单位)

如果图像的高度大于1,多个经过填充实现对齐的行就形成了像素数组

image-20211125164744859

位图数据有以下几种呈现形式

  1. 如果图像是单色、16色和256色,则紧跟着调色板的是位图数据,位图数据是指向调色板的索引序号。此时位图数据可以根据需要选择压缩与不压缩,如果选择压缩,则根据BMP图像是16色或256色,采用RLE4或RLE8压缩算法压缩。

  2. 如果位图是16位、24位和32位色,则图像文件中不保留调色板,即不存在调色板,图像的颜色直接在位图数据中给出

    • 16位图像使用2字节保存颜色值,常见有两种格式:5位红5位绿5位蓝和5位红6位绿5位蓝,即555格式和565格式。555格式只使用了15 位,最后一位保留,设为0。

    • 24位图像使用3字节保存颜色值,每一个字节代表一种颜色,按红、绿、蓝排列。

    • 32位图像使用4字节保存颜色值,每一个字节代表一种颜色,除了原来的红、绿、蓝,还有Alpha通道,即透明色。如果放到

——RLE压缩

游程编码(run-length encoding,缩写RLE),又称行程长度编码变动长度编码法,是一种与资料性质无关的无损数据压缩技术,基于“使用变动长度的码来取代连续重复出现的原始资料”来实现压缩。

RLE4压缩规则如下:

  1. 第1个字节\ne0,第一个字节代表后面一个字节的颜色索引的重复次数
  2. 第1个字节=0,第二个字节代表后面有几个有效颜色索引
  3. 一个颜色索引占4\ bit(一个字节2个颜色索引)

RLE8的压缩规则可以参考上面的RLE4,惟一的区别是RLE8使用1个字节存放颜色索引,而RLE4使用4位存放颜色索引。

下面举个栗子:

假设有如下16色位图数据,共20字节,数据使用了RLE4压缩

05 00 04 05 00 08 09 05 04 00 04 05 08 09 04 08 07 01 00 00

解压过程如下:

  • 首先读取05,因为05不等于0,05表示后面数据重复的次数,接着读取00,00表示有两个颜色索引,每个索引占4位,第一个像素在高4位,第二个像素在低4位,即在一个字节中低像素在高位,高像素在低位。05 00解压后等于00 00 0。(5个索引)

  • 读取04,按照上面的操作解析,04是后面数据重复的次数,05是两个颜色索引,第3个颜色索引为5,第4个颜色索引为0。04 05解压后等于05 05。(4个索引)

  • 读取00,再读取08,08表示后面有效的颜色索引数。00 08解压后等于09 05 04 00。

  • 读取04,按照上面的操作解析,04是后面数据重复的次数,05是两个颜色索引。04 05解压后等于05 05。

  • 读取08,按照上面的操作解析,08是后面数据重复的次数,09是两个颜色索引。08 09解压后等于09 09 09 09。

  • 读取04,按照上面的操作解析,04是后面数据重复的次数,08是两个颜色索引。04 08解压后等于08 08。

  • 读取07,按照上面的操作解析,07是后面数据重复的次数,01是两个颜色索引。07 01解压后等于01 01 01 0。

  • 读取00,再读取下一个字节00,00表示后面有效的颜色索引数,0表示无,即解压完一行数据。

综合上面的操作,解压后的数据为:

00 00 00 50 50 90 50 40 00 50 50 90 90 90 90 80 80 10 10 10

当数据比较多而且重复的时候,使用RLE压缩效果相对比较理想。

【附】图片操作工具

montage

linux下的工具,实现图形的拼接

七、视频文件

(一).mp4

题目:

DASCTF-不可以色色

详细参考:

MP4文件由一系列的box对象组成,所有的数据都包含在这些box中,除此以外,文件中再无其它数据。此外。

所有的Mp4文件中,首先有且仅有一个File Type 类型的Box。Box由包含了size(Box大小)和type(Box 类型)的Box Header开始。Header允许紧凑或扩展的size(32位或64位)和紧凑和扩展的type(32位或者完整的通用唯一标识符,即UUID)。

大多数标准的Box使用的都是32位size和32位type,只有包含了媒体数据的Box需要使用64位size。这里的size,指的是包括Header在内的整个Box占用的大小。在size指定的空间中,除了Box header占用的空间外,其它空间由真实的数据(BoxData)数据占据。这些数据,可能包括其它子Box、也可能是媒体数据。

我们可以利用该信息对MP4文件进行分析。需要注意的是,数据存储使用大端字节序

下表中列出了所有必选或可选的Box类型,代表Box必选。

ftyp

file type and compatibility

pdin

progressive download information

moov

container for all the metadata

mvhd

movie header, overall declarations

trak

container for an individual track or stream

tkhd

track header, overall information about the track

tref

track reference container

edts

edit list container

elst

an edit list

mdia

container for the media information in a track

mdhd

media header, overall information about the media

hdlr

handler, declares the media (handler) type

minf

media information container

vmhd

video media header, overall information (video track only)

smhd

sound media header, overall information (sound track only)

hmhd

hint media header, overall information (hint track only)

nmhd

Null media header, overall information (some tracks only)

dinf

data information box, container

dref

data reference box, declares source(s) of media data in track

stbl

sample table box, container for the time/space map

stsd

sample descriptions (codec types, initialization etc.)

stts

(decoding) time-to-sample

ctts

(composition) time to sample

stsc

sample-to-chunk, partial data-offset

information

stsz

sample sizes (framing)

stz2

compact sample sizes (framing)

stco

chunk offset, partial data-offset information

co64

64-bit chunk offset

stss

sync sample table (random access points)

stsh

shadow sync sample table

padb

sample padding bits

stdp

sample degradation priority

sdtp

independent and disposable samples

sbgp

sample-to-group

sgpd

sample group description

subs

sub-sample information

mvex

movie extends box

mehd

movie extends header box

trex

track extends defaults

ipmc

IPMP Control Box

moof

movie fragment

mfhd

movie fragment header

traf

track fragment

tfhd

track fragment header

trun

track fragment run

sdtp

independent and disposable samples

sbgp

sample-to-group

subs

sub-sample information

mfra

movie fragment random access

tfra

track fragment random access

mfro

movie fragment random access offset

mdat

media data container

free

free space

skip

free space

udta

user-data

cprt

copyright etc.

meta

metadata

hdlr

handler, declares the metadata (handler) type

dinf

data information box, container

dref

data reference box, declares source(s) of metadata items

ipmc

IPMP Control Box

iloc

item location

ipro

item protection

sinf

protection scheme information box

frma

original format box

imif

IPMP Information box

schm

scheme type box

schi

scheme information box

iinf

item information

xml

XML container

bxml

binary XML container

pitm

primary item reference

fiin

file delivery item information

paen

partition entry

fpar

file partition

fecr

FEC reservoir

segr

file delivery session group

gitn

group id to name

tsel

track selection

meco

additional metadata container

mere

metabox relation

  1. ftyp box:作为最常见的Box,其出现在文件的开始位置,描述的文件的版本、兼容协议等,ISO_IEC_14496-12_2015版本规范规定,Mp4格式文件中必须有且只有一个’ftyp’类型的Box。为了与早期没有ftype类型的版本兼容。当文件中,包含FTYP类型的Box,且该Box包含Major_brand='mp41', minor_version=0,以及单独指定兼容性compatible_brands=‘mp41’,则该文件需要按照有FTYP Box的方式读取。
    ftyp box的语法定义如下:

    class FileTypeBox extends Box('ftyp') {
        unsigned int(32) major_brand; // 一个品牌的标志符
        unsigned int(32) minor_version; // 是主要品牌的次要版本的信息,为一个整数
        unsigned int(32) compatible_brands[]; // 兼容的品牌列表
     }
    

    一个典型的FileTypeBox的结构数据如下

    00 00 00 20代表box长度为32个字节(包括自己在内)

    ftyp代表是File Type Box;

    isom代表是品牌标识符,不同的mp4文件可能不一样,此视频文件的品牌标识符是isom;

    isom后面的00 00 02 00是商标版本号

    isomiso2avc1mp41都是一些其兼容版本的列表

    0000h: 00 00 00 20 66 74 79 70 69 73 6F 6D 00 00 02 00  ... ftypisom.... 
    0010h: 69 73 6F 6D 69 73 6F 32 61 76 63 31 6D 70 34 31  isomiso2avc1mp41 
    
  2. moov box:这个box在MP4文件中必须有但是只存在一个,里面不包含具体媒体数据,但包含本文件中所有媒体数据的宏观描述信息,该 Box 一般在文件的头部或尾部,方便定位。moov box下有mvhd和trak box。

    • mvhd:记录了创建时间、修改时间、时间度量标尺、可播放时长等信息。
    • trak:里面一系列子box描述了每个媒体轨道的具体信息。
  3. moof box:这个box是视频分片的描述信息。并不是MP4文件必须的部分,但在我们常见的可在线播放的MP4格式文件中(例如Silverlight Smooth Streaming中的ismv文件)确是重中之重。

  4. mdat box:实际媒体数据。我们最终解码播放的数据都在这里面。

  5. mfra box:一般在文件末尾,媒体的索引文件,可通过查询直接定位所需时间点的媒体数据。

八、音频文件

  1. wav隐写,用DeepSound工具提取

九、流量分析

(一)网络协议包流量

导出文件,ubuntu下用grep搜索字符串[SUCTF2018]followme

Grep 是一个可以从文件或流中查找字符串的一个命令行工具。 它可以通过使用正则表达式来更灵活的查找一个字符串。

如果导出的是压缩包和图片请移步。

(二)USB流量包分析

USB流量的捕获可以使用wireshark自带的工具usbpcap来进行,安装wirshark时勾选上安装usbpcap即可。

USB协议的数据部分在Leftover Capture Data域之中,在Linux下可以用tshark工具可以将 leftover capture data单独提取出来,命令如下:

tshark -r 7777.pcapng -T fields -e usb.capdata > usbdata.txt
#从7777.pcapng中提取出数据段放入usbdata.txt

1. 鼠标流量

工具:GitHub - WangYihang/UsbMiceDataHacker: USB鼠标流量包取证工具 , 主要用于绘制鼠标移动以及拖动轨迹

鼠标流量包的数据长度为四个字节。

  • 第一个字节代表按键。当取0x00时,代表没有按键;当为0x01时,代表按左键;当为0x02时,代表当前按键为右键。

  • 第二个字节可以看成是一个signed byte类型,其最高位为符号位,当这个值为正时,代表鼠标水平右移多少像素,为负时,代表水平左移多少像素。

  • 第三个字节与第二字节类似,代表垂直上下移动的偏移。

2. 键盘流量

题目:BUUCTF-USB

工具:GitHub - WangYihang/UsbKeyboardDataHacker: USB键盘流量包取证工具 , 用于恢复用户的击键信息

键盘数据包的数据长度为8个字节,击键信息集中在第3个字节

BYTE1 --
       |--bit0:   Left Control是否按下,按下为1 
       |--bit1:   Left Shift  是否按下,按下为1 
       |--bit2:   Left Alt    是否按下,按下为1 
       |--bit3:   Left GUI    是否按下,按下为1 
       |--bit4:   Right Control是否按下,按下为1  
       |--bit5:   Right Shift 是否按下,按下为1 
       |--bit6:   Right Alt   是否按下,按下为1 
       |--bit7:   Right GUI   是否按下,按下为1 
BYTE2 -- 暂不清楚,有的地方说是保留位
BYTE3--BYTE8 -- 这六个为普通按键

例如:键盘发送 02 00 0e 00 00 00 00 00,表示同时按下了Left Shift + ‘k’,即大写K。具体键位对应参见Hut1_12v2.pdf第53页。

十、Microsoft Word

word doxc文件本质:docx格式的文件本质上是一个ZIP文件:docx 格式文件的主要内容是保存为XML格式的,但文件并非直接保存于磁盘。它是保存在一个ZIP文件中,然后取扩展名为docx。

doxc文件的结构

  • _rels 表示资源;
  • docProps 表示文档资源
  • theme 表示主题、格式
  • Content_types 表示内容类型

十一、注册表

十二、其它

(一)从lsass里抓本地登录密码

题目:[[安洵杯 2019]Attack](https://buuoj.cn/challenges#[安洵杯 2019]Attack)

参考:

lsass包含所有安全服务提供者或SSP,它们是管理不同类型身份验证的数据包。出于实际原因,用户输入的凭据通常保存在这些SSP中,这样用户就不必在几秒或几分钟后再次输入它们。

这就是为什么mimikatz模块提取位于这些不同ssp中的信息,就是因为试图找到一些身份验证机密,并将它们显示给攻击者。因此,如果一个权限帐户连接到其中一台受感染的主机,则Mimikatz模块允许你快速提取它的凭证,从而利用这个帐户的权限来攻击更多的目标。

但是今天,大多数杀毒软件已经可以检测到Mimikatz的存在或执行,并能阻止它

(二)二维码提取

普通二维码:CQR工具

PDF417码:在线工具Read Barcode Online (aspose.app)

(三)文件类型识别

  • 对于无法根据文件头辨识的就用用file命令

  • 根据文件头(魔法字节)去识别一个文件的文件类型

下面是参照表

# 十四、与Misc相关的Linux工具

更多linux命令:Linux命令大全(手册)_Linux常用命令行实例详解_Linux命令学习手册 (linuxde.net)

(一)grep

参考:Grep - Ubuntu中文

[root@www ~]# grep [-acinv] [--color=auto] '要搜寻的字符串' filename
选项 功能
-r 递归搜索目标字符串
-b 在每一行前面加上其所在的块号,根据上下文定位磁盘块时可能会用到
-c 显示匹配到的行的数目,而不是显示行的内容
-h 不显示文件名
-i 比较字符时忽略大小写的区别
-l(小写的字母L) 只列出匹配行所在文件的文件名(每个文件名只列一次),文件名之间用换行符分隔
-n 在每一行前面加上它在文件中的相对行号
-s 无声操作,即只显示报错信息,用于检查退出状态
-v 反向查找,只显示不匹配的行
-w 把表达式作为词来查找,就好像它被<和>夹着那样。只适用于grep(并非所有版本的grep都支持这一功能,譬如,SCO UNIX就不支持)

常用指令:

  1. 查找当前文件夹下所有文件是否有flag字符串,忽略大小写(-i),递归搜索(-r),每一行前面加行号(-n

     grep -rni "flag" *
    

(二)strings

strings 命令在对象文件或二进制文件中查找可打印的字符串。字符串是 4 个或更多可打印字符的任意序列,以换行符或空字符结束。 strings 命令对识别随机对象文件很有用。

十五、搜索引擎语法

https://blog.csdn.net/u014565127/article/details/53868443

https://blog.csdn.net/u014565127/article/details/53842885

【附】

ISO数据类型参照表

基本数据类型

数据类型 描述
int8 无符号 8 位整数。
sint8 有符号 8 位整数。
int16_LSB 小端编码的无符号 16 位整数。
int16_MSB 大端编码无符号 16 位整数。
int16_LSB-MSB 小端后跟大端编码无符号 16 位整数。
sint16_LSB 小端编码的有符号 16 位整数。
sint16_MSB 大端编码的有符号 16 位整数。
sint16_LSB-MSB 小端后跟大端编码的有符号 16 位整数。
int32_LSB 小端编码的无符号 32 位整数。
int32_MSB 大端编码无符号 32 位整数。
int32_LSB-MSB 小端后跟大端编码无符号 32 位整数。
sint32_LSB 小端编码的有符号 32 位整数。
sint32_MSB 大端编码有符号 32 位整数。
sint32_LSB-MSB 小端后跟大端编码的有符号 32 位整数。

字符串使用 ASCII 编码进行编码。文件结构规范不纳入所有字符。它定义了两组字符:a类 字符集d 类字符集

  • a-characters:

     A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 _ ! " % & ' ( ) * + , - . / : ; < = > ?
    
  • d-characters:

    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 _
    
数据类型 描述
strA 仅包含 ASCII a 字符的字符串,向右填充空格。
strD 仅包含 ASCII d 字符的字符串,向右填充空格。

请注意,并非所有 CD 都严格遵守 ISO 9660 中指定的字符集。

待办

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年11月9日21:59:16
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   CTF-MISC总结https://cn-sec.com/archives/1391657.html