ctfshow-MISC入门-图片篇(文件结构)24-40

文章讲述了在不同图像格式(如BMP、PNG、GIF)中如何通过修改高度、宽度、CRC校验等信息来隐藏和提取FLAG。涉及到的工具包括010Editor、TweakPNG和Stegsolve,以及利用帧间隔时间进行隐写的方法。
摘要由CSDN通过智能技术生成

misc24

提示,flag在图片上面

一般的图片藏flag都会将flag藏在图片下面,如果图片是png,只需要将高度修改即可,然而此题给的是bmp文件,像素信息直接就是在图片的hex中,所以存在将flag藏在图片上面的可能。

打开图片属性,发现图片大小是900*150,即135000个像素

image-20230526140616608

image-20230526160737106

而图片本身去掉文件头后应该是675000/3=225000个像素,明显多了很多,于是猜测图片高度,发现250*900刚好等于225000个像素,将图片的高度改为250后即可得到flag

image-20230526141115419

第二行2-4位为宽度

即6-9位修改位FA 00 00 00即可
image-20230526142027486

进一步学习:bmp图片格式
bmp的数值在存储上是按“高位放高位、低位放低位”的原则

BMP文件头:占14个字节。
1)0x00-0x01:2个字节。
BM(windows),BA(os/2 bitmap array),CI(os/2 color icon),CP(os/2 color pointer),IC(os/2 icon),PT (os/2 pointer)
本题是:424D(BM)
2)0x02-0x05:4个字节。表示位图文件的大小,即整个图片文件的大小(包括信息头)。
以本题为例,F0 4C 0A 00 =>00 0A 4C F0=>675056b =>659.234375 kb,与实际大小660kb一致。
3)0x06-0x09:2个保留位,各占2个字节,共4个字节,设置为0。
3)0x0A-0x0D:4个字节。文件头开始到实际图像数据之间的偏移量。
以本题为例,36 00 00 00 即54个字节。

misc25

提示flag在下面

因为是png图片,所以放进TweakPNG

image-20230526142203586

image-20230526142356548

修改高度

或者直接hex查看修改十六进制

在png中,第二行前四个为长,后四个为高

image-20230526160824293

image-20230526142318868

misc26

提示:flag还是在图片下面,但到底有多下面?

随便拉长看看

image-20230526142851887

需要得到实际长度的16进制 使用脚本 最后得到实际高度为606 转为16进制是0x25e

import os
import binascii
import struct
crcbp = open("misc26.png", "rb").read()    #打开图片
for i in range(1024):
    for j in range(1024):
        data = crcbp[12:16] + struct.pack('>i', i)+struct.pack('>i', j)+crcbp[24:29]#从IHDR开始17个字节,其中宽和高用i和j代替,并以4个字节存放i和j。
        crc32 = binascii.crc32(data) & 0xffffffff
        if(crc32 == 0xec9ccbc6):   #010Editor第二行倒数3字节,加第三行第一字节。按顺序写就行,不用改。
            print(i, j)
            print('hex:', hex(i), hex(j))
#900 606
#hex: 0x384 0x25e

ctfshow{94aef1 25e 087a7ccf2e28e742efd704c}

misc27

提示:flag在图片下面

jpg里面的像素在这里

image-20230526161139621

也是直接搜索150的hex值的位置就行了

image-20230526161227529

高为0096 宽为0384

image-20230526161445999

misc28

提示:flag在图片下面

image-20230526161902307

image-20230526161908785

8403 9600是长宽

将9600改为FF00

image-20230526170802855

发现030editor有模板,这个实在是好用,像这次不太清楚gif的图片格式,也可以通过其标注的颜色区分,再根据鼠标移动位置提供的提示,找到高度调整的位置。

调整高度后,显示出flag,但是由于gif动图,删的太快,没有看到,用lsp看即可。

image-20230526171057452

我直接用缩略图看哈哈哈笑了

misc29

提示:flag在图片下面。
解答:gif图片,修改高度,方式推荐查看模板结果修改,因为动图太多,这样修改更方便一些,每个图都要修改高度。

image-20230526171401863

然后用Stegsolve分离一下gif动图,在第8帧找到了flag

image-20230526172726988

misc30

提示:正确的宽度是950。

bmp文件用010editor打开

image-20230527093952926

可以看到前面为宽度,后面为长度

image-20230527094016049

得到flag

image-20230527094056034

misc31

提示:高度是正确的,但正确的宽度是多少呢

bmp图片。高度是150,需要计算,宽度,整个图片文件的大小是0x76f58字节(可以通过010查看结尾位置在0x76f47,然后加上1。因为初始位置是0),转成十进制是487256字节大小。

1685152092047

文件头(14+40)

image-20230527095142005

image-20230527095151872

RGB每个像素由3个字节表示

image-20230527095036718

宽度就是:(487256-54)÷3÷150,约等于1082。修改宽度可以得到flag

image-20230527094746869

misc32

misc33

misc34

misc35

misc36

misc37

提示:flag在图片里

是一个gif动图,而且很快

分解一下,可以用stegslove或者网上在线分解https://tu.sioe.cn/gj/fenjie/

image-20230527101952949

image-20230527101835510

image-20230527101934689

image-20230527102024103

image-20230527102041927

ctfshow{2056782c d57b1326 1dcbbe3d 6eecda17}

misc38

提示:flag在图片里

这里使用这个工具:Honeyview 分别在第9、17、36、40帧中 发现部分flag 最后进行拼接得到完整的flag

image-20230527102237827

ctfshow{48b722b570c6 03ef58cc0b 83bbf7680d}

misc39

提示:flag就像水,忽快忽慢地流

没有遇到过的题型,看了一下wp,是需要取帧,利用不同帧之间的间隔时间来隐写的。
按照这个逻辑再去看题目,忽快忽慢体现就是一个时间,再结合给的gif动图,可以推测是利用不同帧之间的间隔时间来隐写。

用命令identify,可以在ubuntu或kali使用该命令

sudo apt-get install imagemagick

identify -format "%T " misc39.gif > 1.txt  #进行提取

image-20230527103356870

内容全部都是36和37,只有两个数据,可能是二进制,那么替换一下,36转0,37转1

s="11000111110100110011011100111101000110111111101111111011011010101100100111000011000101100101100110110011001110010111001011010111001101100010011011111000101100101011001001101100111000110010001110010110110011001111000010111001110010111000101100011110000101100000110100011010101110011111101"
flag=""
for i in range(41): #287//7
    flag += chr(int(s[7*i:7*(i+1)],2))
print(flag)
#ctfshow{52812ff995fb7be268d963a9ebca0459}

misc40

提示:flag就像歌,有长有短仿佛岁月悠悠
解答:都有gif分离器了,怎么能没有apng分离器

https://apngdis.sourceforge.net/

image-20230527104122770

处理完后,每一帧图片都会带有一个 txt 文件。

分离出来的图片没有任何flag信息。那么可能就是txt文件中的信息,比如1中229,在后面的信息中极有可能存在flag,提取一下

image-20230527104204732

flag=""
for i in range(1,69): 
    if(i<10):
        f = open('D:/Downloads/misc40/apngframe0'+str(i)+'.txt')
    else:
        f = open('D:/Downloads/misc40/apngframe'+str(i)+'.txt')
    s = f.read()
    flag += chr(int(s.split("/")[0][6:]))
print(flag)
#前面一堆乱码迷惑数据,后面是flag:ctfshow{95ca0297dff0f6b1bdaca394a6fcb95b}

misc42

提示:flag有多长?2cm……不好意思打错了,41位

用010打开有41个idat块

image-20230527111654720

用tweakpng打开,可以看到idat的长度是flag(将长度进行chr转换)

image-20230527104355488

ctfshow{078cbd0f9c8d3f2158e70529f8913c65}

misc43

提示:错误中隐藏着通往正确答案的道路

png图片,用tweakpng打开,出现很多CRC错误的报错

image-20230527105147452

为了方便查看,这里我输出到txt中

image-20230527110820972

image-20230527110959699

将错误的IDAT块的crc-code提取出来,拼接起来转字符串即可得到flag

hex转ascII

image-20230527111258227

misc44

提示:错误中还隐藏着坑

image-20230527111445723

错误数据较多,且如misc43转换后并未有任何flag信息。那么再看一下信息,正确的和错误的都很多,那么是否涉及二进制01转换。测试一下。

先对txt文件删减一下,只保留其中的IDAT部分。开头删一下,结尾删一下

然后脚本跑一下,获取flag

f=open("D:/Downloads/misc44/44.txt","r").read()
flag=""
for i in f.split():
    if "OK!" == i:
        flag += "1"
    elif "FAILED" ==i:
        flag += "0"
print(flag)
for i in range(len(flag)//8):
    print(chr(int(flag[8*i:8*(i+1)],2)),end="")
#ctfshow{cc1af32bf96308fc1263231be783f69e}

总结:crc隐写转二进制

misc45

提示:有时候也需要换一换思维格式

常规做法没有发现信息,题目提示换个格式,之前我们做的题目里除了png,还有:bmp、jpg、gif。大概率是bmp,因为bmp的数值存储方式和排序和其他的都不太一样

https://cdkm.com/cn/png-to-bmp

image-20230527221754750

image-20230527221730450

misc46

提示:你见过扶乩吗

比较有意思的一个题,用gif每一帧的偏移量作为坐标来画图即可,这里gif的偏移量我是用identify命令直接获取的

identify misc46.gif > 1.txt
from PIL import Image
import matplotlib.pyplot as plt
f=open('1.txt')
pp=[]
while 1:
    c=f.readline()
    if c:
        s=eval(c.split('+')[1]+','+c.split('+')[2][:2])
        pp.append(s)
    else:
        break
img =Image.new('RGB',(400,70),(255,255,255))
for i in pp:
    new = Image.new('RGB',(1,1),(0,0,0))
    img.paste(new,i)
img.save('1.png')

misc47

misc48

misc49

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值