misc24
提示,flag在图片上面
一般的图片藏flag都会将flag藏在图片下面,如果图片是png,只需要将高度修改即可,然而此题给的是bmp文件,像素信息直接就是在图片的hex中,所以存在将flag藏在图片上面的可能。
打开图片属性,发现图片大小是900*150,即135000个像素
而图片本身去掉文件头后应该是675000/3=225000个像素,明显多了很多,于是猜测图片高度,发现250*900刚好等于225000个像素,将图片的高度改为250后即可得到flag
第二行2-4位为宽度
即6-9位修改位FA 00 00 00即可
进一步学习: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
修改高度
或者直接hex查看修改十六进制
在png中,第二行前四个为长,后四个为高
misc26
提示:flag还是在图片下面,但到底有多下面?
随便拉长看看
需要得到实际长度的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里面的像素在这里
也是直接搜索150的hex值的位置就行了
高为0096 宽为0384
misc28
提示:flag在图片下面
8403 9600是长宽
将9600改为FF00
发现030editor有模板,这个实在是好用,像这次不太清楚gif的图片格式,也可以通过其标注的颜色区分,再根据鼠标移动位置提供的提示,找到高度调整的位置。
调整高度后,显示出flag,但是由于gif动图,删的太快,没有看到,用lsp看即可。
我直接用缩略图看哈哈哈笑了
misc29
提示:flag在图片下面。
解答:gif图片,修改高度,方式推荐查看模板结果修改,因为动图太多,这样修改更方便一些,每个图都要修改高度。
然后用Stegsolve分离一下gif动图,在第8帧找到了flag
misc30
提示:正确的宽度是950。
bmp文件用010editor打开
可以看到前面为宽度,后面为长度
得到flag
misc31
提示:高度是正确的,但正确的宽度是多少呢
bmp图片。高度是150,需要计算,宽度,整个图片文件的大小是0x76f58字节(可以通过010查看结尾位置在0x76f47,然后加上1。因为初始位置是0),转成十进制是487256字节大小。
文件头(14+40)
RGB每个像素由3个字节表示
宽度就是:(487256-54)÷3÷150,约等于1082。修改宽度可以得到flag
misc32
misc33
misc34
misc35
misc36
misc37
提示:flag在图片里
是一个gif动图,而且很快
分解一下,可以用stegslove或者网上在线分解https://tu.sioe.cn/gj/fenjie/
ctfshow{2056782c d57b1326 1dcbbe3d 6eecda17}
misc38
提示:flag在图片里
这里使用这个工具:Honeyview
分别在第9、17、36、40
帧中 发现部分flag
最后进行拼接得到完整的flag
ctfshow{48b722b570c6 03ef58cc0b 83bbf7680d}
misc39
提示:flag就像水,忽快忽慢地流
没有遇到过的题型,看了一下wp,是需要取帧,利用不同帧之间的间隔时间来隐写的。
按照这个逻辑再去看题目,忽快忽慢体现就是一个时间,再结合给的gif动图,可以推测是利用不同帧之间的间隔时间来隐写。
用命令identify,可以在ubuntu或kali使用该命令
sudo apt-get install imagemagick
identify -format "%T " misc39.gif > 1.txt #进行提取
内容全部都是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/
处理完后,每一帧图片都会带有一个 txt 文件。
分离出来的图片没有任何flag信息。那么可能就是txt文件中的信息,比如1中229,在后面的信息中极有可能存在flag,提取一下
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块
用tweakpng打开,可以看到idat的长度是flag(将长度进行chr转换)
ctfshow{078cbd0f9c8d3f2158e70529f8913c65}
misc43
提示:错误中隐藏着通往正确答案的道路
png图片,用tweakpng打开,出现很多CRC错误的报错
为了方便查看,这里我输出到txt中
将错误的IDAT
块的crc-code
提取出来,拼接起来转字符串即可得到flag
hex转ascII
misc44
提示:错误中还隐藏着坑
错误数据较多,且如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
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')