menu Ga1@xy's Wor1d
Misc相关笔记(7.23更)
514 浏览 | 2020-03-25 | 阅读时间: 约 6 分钟 | 分类: MISC | 标签: Misc,知识点
请注意,本文编写于 246 天前,最后修改于 68 天前,其中某些信息可能已经过时。

各种文件头

图片文件

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压缩包

有关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

此种文件可以通过删除其依附的文件夹来清除。

内存取证

发表评论

email
web

全部评论 (暂无评论)

info 还没有任何评论,你来说两句呐!