zl程序教程

您现在的位置是:首页 >  工具

当前栏目

Misc相关笔记(7.23更)

笔记 相关 Misc
2023-06-13 09:18:51 时间

各种文件头

图片文件

jpg文件

  • jpg格式的文件以(16进制中)FFD8 开头,以 FFD9 结尾 (0xffd80xffd9
  • 有关jpg文件的宽度和高度问题

即从FFC0后第三个字节开始,两个字节为高度,两个字节为宽度

上图为例015C为图片高度,01A4为图片宽度

  • 常见隐写方式:
    • f5隐写(需要password)
    • outguess(可需要password)
    • steghide
    • 图片备注藏信息
    • 文件尾后藏信息(可用十六进制编辑器查看)

bmp文件

  • 可优先考虑为LSB隐写,在 kali 中用 zsteg 命令可解
# 假设文件名为 1.bmp
> zsteg 1.bmp
  • zsteg 安装:
> gem install zsteg

png文件

常见隐写方式

  • LSB隐写(有很多种LSB隐写,具体因题而异)
  • 盲水印(一种普通,一种频域盲水印)
  • 修改图片宽高
  • 文件尾后藏信息(十六进制编辑器查看)

png文件的16进制文件头格式为 89 50 4E 47 0D 0A 1A 0A

png文件结构分析:https://www.cnblogs.com/lidabo/p/3701197.html

可优先考虑为LSB隐写,可将图片用 stegsolve 打开后依次查看各个通道,有可能会在特定通道中出现二维码或其他图片

详解png的文件头:(以下图为例)

  • (固定)八个字节 89 50 4E 47 0D 0A 1A 0A 为PNG的文件头
  • (固定)四个字节 00 00 00 0D (即为十进制的13)代表数据块的长度为13
  • (固定)四个字节 49 48 44 52 (即为ASCII码的IHDR)是文件头数据块的标示(IDCH)
  • (可变)13个字节的数据块(IHDR)
    • 前四个字节代表该图片的宽 00 00 00 00
    • 后四个字节代表该图片的高 00 00 02 F8
    • 最后五个字节依次为:Bit depth、ColorType、Compression method、Filter method、Interlace method 08 06 00 00 00
  • (可变)剩余四个字节为该PNG的CRC验证码,由从 IDCH 到 IDHR 的共17位字节进行crc计算得到 93 2F 8A 6B

关于CRC值:将图片拖入kali中打开如果报错 IHDR: CRC error ,则有可能是图片的 宽度或高度不正确,如过高度不正确直接修改即可,如果宽度不正确则需要通过CRC值爆破得到正确的图片宽度,也有可能是 CRC值不正确,错误或正确CRC值隐藏着信息,可用 stegsolveFile Format 选项查看CRC值

附上一个可同时爆破宽高的脚本(python3)

import zlib
import struct
#读文件
file = '1.png' 
fr = open(file,'rb').read()
data = bytearray(fr[12:29])
crc32key = eval(str(fr[29:33]).replace('\\x','').replace("b'",'0x').replace("'",''))
#crc32key = 0xCBD6DF8A #补上0x,copy hex value
#data = bytearray(b'\x49\x48\x44\x52\x00\x00\x01\xF4\x00\x00\x01\xF1\x08\x06\x00\x00\x00')  #hex下copy grep hex 
n = 4095 #理论上0xffffffff,但考虑到屏幕实际,0x0fff就差不多了
for w in range(n):#高和宽一起爆破
    width = bytearray(struct.pack('>i', w))#q为8字节,i为4字节,h为2字节
    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]
            #print(data)
        crc32result = zlib.crc32(data)
        if crc32result == crc32key:
            print(width,height)
            #写文件
            newpic = bytearray(fr)
            for x in range(4):
                newpic[x+16] = width[x]
                newpic[x+20] = height[x]
            fw = open(file+'.png','wb')#保存副本
            fw.write(newpic)
            fw.close
            # return None

例题:[WDCTF-FINALS-2017]

上图可以看到该png的 IHDR 块中代表图片的宽的四个字节都为00,也就是说这道题我们需要通过修改图片的宽度来得到完整的图片,需要注意的是,图片宽度不能任意修改,而是需要根据 IHDR 块的 CRC 值爆破得到宽度,否则图片会显示错误无法打开,下面为爆破脚本: import struct import binascii import os misc = open('misc4.png','rb').read() for i in range(1024): data = misc[12:16] + struct.pack('>i',i) + misc[20:29] #misc[12:16]是IDCH,misc[20:29]是IHDR中除去宽度四个字节的剩余部分 crc32 = binascii.crc32(data) & 0xffffffff if crc32 == 0x932f8a6b: print i 得到 i 的值为709,将宽度改为16进制的709(即 00 00 02 C5)即可恢复图片得到flag

bpg文件

  • 一种图片格式

下载文件得到一张图片,用 010Editor 打开会报错:

可知在文件尾还有其他本不属于原图片的信息,查看可知在 IEND 块后隐藏有 BPG 的文件信息:

查找信息后发现 425047FB 也确实是BPG文件的文件头:

425047FB 以及之后的信息全部提取出来另存为bpg后缀的文件 在线网站查看即可:https://webencoder.libbpg.org/show.html

得到一串字符,base64解码即可得到flag:bsides_delhi{BPG_i5_b3tt3r_7h4n_JPG}

gif文件

gif文件的文件头为 47 49 46 38

gif隐写可用stegsolve分别查看每一帧的内容,隐写方法也可能与时间轴空间轴有关

  • 空间轴:

由于gif的动态特性,由一帧一帧的图片构成,所以每一帧的图片,多帧图片间的结合,都成了隐藏信息的一种载体,对于空间轴隐写,我们可以将gif文件每一帧的图片分离开来,可以在kali中使用convert命令来实现: convert 1.gif out.png 在 1.gif 所在文件夹就会出现一系列 out.png 图片

  • 时间轴:

gif文件的每一帧之间的时间间隔也可以作为信息隐藏的载体,可以用identify命令打印出gif每一帧的时间间隔: identify -format '%s %T \n' 1.gif 一般此种题在打印出时间间隔后,时间间隔会有明显的规律,比如: 0 10 1 20 2 20 3 20 4 10 5 10 6 10 7 10 8 10 9 20 10 20 ... 此种情况即可把时间间隔 20 & 10 转化为 0 & 1 字符串(或 1 & 0)然后转化成 ASCII码 即可,此时建议使用以下命令,更为方便: identify -format '%T' 1.gif 10202020101010101020201010101020102020201010201010202020102010101010202010202020101020202010201010102020102020101010202010101020101020201020102010102020102020101010202010102010

  • 以上两个命令基于 ImageMagick ,安装方法如下:

sudo apt-get install imagemagick 测试是否安装成功: convert -version 如果出现下面的信息,则表示安装成功: Version: ImageMagick 6.9.10-23 Q16 x86_64 20190101 https://imagemagick.org Copyright: © 1999-2019 ImageMagick Studio LLC License: https://imagemagick.org/script/license.php Features: Cipher DPC Modules OpenMP ...

流量包

pcapng文件

个人总结的简单粗暴的做法:

① 导出http(按大小顺序排列找大的)

② 追踪TCP流

③ 查找 flag 相关字符串

USB流量包

音频

wav文件

  • 可优先考虑是否为 LSB隐写,将文件拖入 SilentEye

m4a文件

  • 文件头:00 00 00 20 66 74 79 70 4D 34 41 20 00 00 00 00

mp3文件

  • 常见隐写方式
    • 频谱图信息涂抹(audacity查看)
    • 音频藏Morse码
    • MP3stego

压缩包

rar压缩包

  • rar5的文件头为 52 61 72 21 1A 07 01 00
  • rar4的文件头为 52 61 72 21 1A 07 00 ,文件尾为 C4 3D 7B 00 40 07 00

有关rar伪加密的题很少,几乎没有,但是rar伪加密也是可以实现的,而且与zip伪加密不同的是,rar伪加密无法直接用binwalk进行分离,下面讲一下rar伪加密的实现方式(ctfwiki里也有) 用010editor打开rar文件,在模板中可以看到:

蓝色的那一行指的是rar文件的加密位,如果此rar文件没有被加密,那么这一行中的数字为0,将其修改为1(就是现在这样)即可达到rar伪加密的目的,在打开这个伪加密的文件时会显示文件头损坏,其中的内容也已被加密:

再将1改为0就可以正常打开文件了

zip压缩包

  • 文件头:50 4B 03 04
  • 常见考点
    • 爆破password
    • 伪加密(可直接尝试binwalk分离)
    • 已知明文攻击
    • crc爆破

crc32爆破

crc32爆破通常用于爆破一些较小的加密文件(比如6字节以内),通过他们爆破字符计算crc值从而达到不用解压密码便可知道加密内容的目的

爆破脚本:https://github.com/theonlypwner/crc32

python crc32.py reverse [crc校验值]  # 例:0xcc86365b

例题:[攻防世界] crc

下载得到压缩包,其中含有四个加密文档,前三个都是特别小的文档,可以推测为crc爆破

用脚本爆破crc值:

得到解压密码:forum_91ctf_com_66 打开convert.txt,将其中的01序列转为字符串: import libnum f=open('convert.txt','r') a=f.read() print libnum.b2s(a) 得到base64编码的图片,在线网站还原得到二维码,扫描得到flag:flag{owid0-o91hf-9iahg}

其他

linux光盘文件

  • 可将文件拖入kali中文件夹,在终端打开用 strings 命令查找 flag 有关字符(不分大小写)
# 假设文件名为 2333
> strings 2333 | grep -i flag

63 255 127 191

如果一个文档中只有这四个数字,那么这种类型的题通常都是一个解法

首先我们先看这四个数字的共同点,将这四个数字转换成8位二进制后发现,只有最高两位二进制不同,所以我们可以写一个脚本将其提取出来并且4个一组转换为ASCII,脚本如下:

fp = open('t.txt','r')
a = fp.readlines()
p = []
for i in a:
 p.append(int(i))

s = ''
for i in p:
 if i == 63:
     a = '00'
 elif i == 127:
     a = '01'
 elif i == 191:
     a = '10'
 elif i == 255:
     a = '11'
 s += a

import binascii

flag = ''
for i in range(0,len(s),8):
 flag += chr(int(s[i:i+8],2))

flag = binascii.unhexlify(flag)
wp = open('ans','wb')
wp.write(flag)
wp.close()

将得到的 ans 文件扔进winhex观察它的格式再确定它是什么类型的文件即可

NTFS数据流隐写

NTFS交换数据流(Alternate DataStreams,简称ADS)是NTFS磁盘格式的一个特性,在NTFS文件系统下,每个文件都可以存在多个数据流。通俗的理解,就是其它文件可以“寄宿”在某个文件身上。

在NTFS分区创建ADS数据流文件有两种形式:一是指定宿主文件;二是创建单独的ADS文件。

常用的创建命令有两个: echo 和 type ,echo 用于输入常规字符,type 则用于将文件寄生到目标文件

  • type使用方法
    • 指定宿主文件

type 456.txt >> 123.txt:456.txt 查看txt文件时和echo相同: notepad 123.txt:456.txt 图片文件也可以利用type命令寄生到其他文件上 type flag.png >> 123.txt:flag.png 当查看寄生的文件为图片时,可用系统自带的mspaint查看: mspaint 123.txt:flag.png

  • 单独的ADS数据流文件 寄生文档文件时:

type 456.txt >> :456.txt 此时 456.txt 文件寄生到其所在的文件夹,需要返回上层目录进行查看: cd ../ notepad test:456.txt 寄生图片文件时: type flag.jpg >> :flag.jpg 查看: cd ../ #切换到上级目录 mspaint test:flag.jpg

  • echo使用方法
    • 指定宿主文件

这类情况可以使用一下命令来创建目标文件: echo 2333 > 1.txt:flag.txt 正常情况下无法查看到该文件,可以使用一下命令查看:(ctf常用) dir /r 文件内容则可以使用命令:(ctf常用) notepad 1.txt:flag.txt 进行查看和编辑:

此类文件可以通过直接删除宿主文件清除。 单独的ADS数据流文件 此类文件可以通过以下命令进行创建:

  1. 2333 > :misc.txt

创建之后再目录下无文件,也没有依赖的宿主文件,并且此类文件在当前目录的命令行下是无法查看的,因为它是依赖于文件夹的ADS数据流文件:

因此需要退到上级目录进行查看: cd ../ notepad test:misc.txt 此种文件可以通过删除其依附的文件夹来清除。

内存取证