ctfshow misc入门wp
ctfshow misc入门wp,是关于图片类型隐写的题目
目录
图片篇(基础操作)
misc1
压缩包解压之后得到一张图片,里面就是flag
misc2
将txt拖到winhex中查看,发现文件头为89 50 4E 47,说明是png格式,直接修改后缀为.png,得到flag
misc3
发现为.bpg格式文件,使用bpgview.exe打开,在命令行输入bpgview.exe misc3.bpg,即可得到flag
misc4
将解压得到的6个txt全部改为图片后缀即可,如.jpg .png等。将他们拖进winhex查看,发现1.txt的文件头是89 50 4E 47,为png格式;2.txt的文件头是FF D8 FF,为jpg格式;3.txt的文件头是42 4D,为bmp格式;4.txt的文件头是47 49 46 38,为gif格式;5.txt的文件头是49 49 2A 00,为tif格式;6.txt的文件头是52 49 46 46,可修改为webp格式。
图片篇(信息附加)
misc5
将图片拖进winhex,搜索ctfshow,发现在结尾处有flag
misc6
与上一题一样,用winehx打开搜索ctfshow,发现flag
misc7
与上一题一样
misc8
打开winhex查看,发现中间有很多00字段,猜测可能包含了另一个文件
打开kali使用binwalk命令分析,发现存在另一个文件,用foremost分离得到另一张图片,打开就是flag
binwalk misc8.png
foremost misc8.png
misc9
winhex打开搜索ctfshow,得到flag
misc10
在kali中使用binwalk -e命令分离出隐藏文件,得到flag
binwalk misc10.png
binwalk -e misc10.png
misc11
用tweakpng.exe打开发现有两个数据块,根据提示删除第一个数据,再另存为图片,得到flag
misc12
也是用tweakpng.exe打开删除前8个数据块即可
misc13
根据提示,用winhex打开,拉到结尾处找到一段像flag的值,隔位取值,得到flag
misc14
用winhex打开,发现有大量00数据
打开kali,用binwalk命令分析一下,发现在2103处还有数据为jpg图片,使用dd命令分离出该图片
binwalk -e misc14.jpg
dd if=misc14.jpg of=flag.jpg skip=2103 bs=1
misc15
winhex打开搜索ctfshow
misc16
用binwalk命令分离出隐藏文件,得到flag
binwalk -e misc16.png
misc17
在kali中使用zsteg命令,再用binwalk对1.txt进行分离,得到flag
zsteg -E "extradata:0" misc17.png > 1.txt
binwalk -e 1.txt
misc18
根据提示,右击属性,找到详细信息
misc19
在kali中利用exiftool查看图片,将文档名和主机拼起来就是flag
exiftool misc19.tif
也可以打开在线网站https://exif.tuchong.com/进行查看
misc20
与上题一样也是exif,将内容转成字母,得到flag
ctfshow{c97964b1aecf06e1d79c21ddad593e42}
misc21
也是exif,查看信息,得到序列号为686578285826597329,提交发现错误,尝试转成十六进制形式,发现得到提示,按顺序将xy转化成十六进制
转换脚本:
n = [3902939465, 2371618619, 1082452817, 2980145261]
flag=''
for i in n:
a=str(hex(i))
flag+=a[2:]
print(flag)
misc22
在kali中使用exiftool命令查看图片,可以看到存在缩略图,再以二进制形式提取缩略图信息,并写入flag.jpg中
exiftool misc22.jpg
exiftool -ThumbnailImage -b misc22.jpg > flag.jpg
或者使用MagiExif软件打开,可以直接看到缩略图
misc23
kali中使用exiftool命令查看到有四个时间
exiftool misc23.psd
使用在线工具https://tool.lu/timestamp/,将四个时间转化为时间戳
最终得到874865822,2699237688,2156662245,460377706,用21题的脚本跑一下,即可得到flag
misc41
在010Edito中搜索F0 01,使其高亮,就可以看到flag了
图片篇(文件结构)
misc24
右击属性可以看到目前像素是900 x 153=137700,而文件头占了53字节,文件结尾在675053字节处。又因为每个像素点由三个字节表示,每个字节控制一种颜色,分别为红、绿、蓝三种颜色。所以文件真实像素大小为(675053-53)/3=225000。根据提示本题的宽度是没问题的,所以只需要修改高度即可。高度=225000/900=250
修改高度为FA,右键另存为图片,得到flag
misc25
这题是crc校验问题,关于png图片结构和crc校验的问题可以看我之前的文章:png图片的结构和crc校验_红烧大鸡块的博客-CSDN博客
这里直接上爆破宽高的脚本:
import binascii
import struct
crcbp = open("misc25.png", "rb").read() #打开图片
crc32frombp = int(crcbp[29:33].hex(),16) #读取图片中的CRC校验值
print(crc32frombp)
for i in range(4000): #宽度1-4000进行枚举
for j in range(4000): #高度1-4000进行枚举
data = crcbp[12:16] + \
struct.pack('>i', i)+struct.pack('>i', j)+crcbp[24:29]
crc32 = binascii.crc32(data) & 0xffffffff
# print(crc32)
if(crc32 == crc32frombp): #计算当图片大小为i:j时的CRC校验值,与图片中的CRC比较,当相同,则图片大小已经确定
print(i, j)
print('hex:', hex(i), hex(j))
exit(0)
得到正确的宽高,在winhex中修改高度,另存为新的图片,这样就可以看到flag了
misc26
与上一题一样,用脚本跑出正确的宽高,修改之后得到flag
misc27
修改图片高度为FF,得到flag
misc28
修改高度96 00 为FF 00,另存为新的图片,因为是gif格式不方便查看,打开StegSolve查看图片,即可得到flag
misc29
使用winhex搜索中的替换功能,将96 00全部替换为FF 00,即可得到flag
misc30
将图片宽度修改为950的16进制值03 B6,因为大多数的BMP文件都是倒向的位图,所以这里要倒着写。另存为图片,得到flag
misc31
和misc24一样,计算图片的宽高,像素是900 x 153=137700,真实像素大小为(487251-54)/3=162399。又因为高度正确,所以宽度=162399/150=1082.66。修改宽度为1082的16进制值04 3A即可。
misc32
也是crc校验问题,用misc25的脚本爆破出正确宽高,修改即可
misc33
与上题一样
misc34
由于crc校验也被改了,根据题目提示宽度不对,所以修改一下脚本,遍历宽度生成图片,找到正常的图片,最终发现正确宽度为1123
import struct
filename = "misc34.png"
with open(filename, 'rb') as f:
data = f.read()
for i in range(901,1200):
name = str(i) + ".png"
f1 = open(name,"wb")
new = data[:16]+struct.pack('>i',i)+data[20:]
f1.write(new)
f1.close()
misc35
这题需要先修改图片的高度,这里我改到600,之后再遍历宽度得到正确的图片,宽度在993~1000范围内的图片都是正常的
脚本:
import struct
filename = "misc35.jpg"
with open(filename, 'rb') as f:
data = f.read()
for i in range(901,1000):
name = str(i) + ".jpg"
f1 = open(name,"wb")
new = data[:159]+struct.pack('>h',i)+data[161:]
f1.write(new)
f1.close()
misc36
先修改图片高度为300,再利用脚本遍历,得到正确宽度为941
脚本:
import struct
filename = "misc36.gif"
with open(filename, 'rb') as f:
data = f.read()
for i in range(920,951):
name = str(i) + ".gif"
f1 = open(name,"wb")
new = data[:38]+struct.pack('>h',i)[::-1]+data[40:]
f1.write(new)
f1.close()
misc37
将图片后缀改为png,使用APNG Disassembler对其进行分离或者打开在线网站https://tu.sioe.cn/gj/fenjie/,分离gif帧,可以看到在第9,14,21,31,34帧有flag,拼起来提交即可。
misc38
用APNG Disassembler或 Honeyview打开图片,一帧一帧查看就可以得到flag
misc39
这里是利用不同帧之间的间隔时间来隐写的。打开kali利用identify命令提取出来
identify -format "%T " misc39.gif > 1.txt
得到的一串36和37,考虑把37换成1、36换成0,就得到长度为287的二进制字符串,考虑每7位转一个字符(正常是8位一组),得到flag。
脚本:
s="11000111110100110011011100111101000110111111101111111011011010101100100111000011000101100101100110110011001110010111001011010111001101100010011011111000101100101011001001101100111000110010001110010110110011001111000010111001110010111000101100011110000101100000110100011010101110011111101"
flag=""
for i in range(41): #287//7
flag += chr(int(s[7*i:7*(i+1)],2))
print(flag)
misc40
用APNG Disassembler打开,分离出各个帧。可以看到除了分离出图片外,每个图片还有个txt文档,里面有我们要的内容。写脚本提取出来.
脚本:
flag=""
for i in range(28,69): #flag内容从28位开始
f = open('apngframe'+str(i)+'.txt')
s = f.read()
flag += chr(int(s.split("/")[0][6:]))
print(flag)
misc42
用tweakpng打开,发现这几个数转字符串就是ctfshow,将剩下的全部转成字符得到flag。
ctfshow{078cbd0f9c8d3f2158e70529f8913c65}
misc43
用tweakpng打开 发现报错,用pngdebugger打开进行分析,发现很多错误的crc值,根据提示提取出来转成字符串得到flag
misc44
根据提示应该还是crc错误,用PNGDebugger将信息提取到1.txt中
PNGDebugger.exe misc44.png > 1.txt
将文本前10行和最后4行没用的删掉。然后写脚本,把CRC OK的替换成1,CRC FAILED替换成0
脚本:
f=open("1.txt","r")
s=f.read()
f.close()
flag=""
for i in s.split():
if "OK!" == i:
flag += "1"
elif "FAILED" ==i:
flag += "0"
print(flag)
#11111111111111110110001101110100011001100111001101101000011011110111011101111011011000110110001100110001011000010110011000110011001100100110001001100110001110010011011000110011001100000011100001100110011000110011000100110010001101100011001100110010001100110011000101100010011001010011011100111000001100110110011000110110001110010110010101111101
print(len(flag)) #344
for i in range(43):
print(chr(int(flag[8*i:8*(i+1)],2)),end="")
misc45
exif,binwalk都没有什么有效的信息,按照提示可能是换一种文件格式。去在线网站:https://cdkm.com/cn/png-to-bmp,将图片转换成bmp格式。然后在kali中使用binwalk命令进行分析,发现存在flag.png,提取出来得到flag
binwalk misc45.bmp
misc46
kali中使用identify命令提取出信息存到1.txt中
identify misc46.gif > 1.txt
然后就用gif每一帧的偏移量作为坐标来画图
脚本:
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)
print(s)
# print(c)
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)
plt.imshow(img)
plt.show()
misc47
给了一个png,打开发现没内容,用浏览器打开,确认是apng。对于apng格式每一个IDAT块前面都会有一个fcTL块,它其中就包含水平垂直偏移量。
脚本:
import struct
from PIL import Image
import matplotlib.pyplot as plt
f = open('misc47.png','rb')
c = f.read()
c = c[c.index(bytes.fromhex('6663544C00000001')):]
pp = []
for i in range(1,1124,2):
start = c.index(bytes.fromhex('6663544C0000')+struct.pack('>h',i))
# start = c.index(bytes.fromhex('6663544C000000'+hex(i)[2:]))
# print(start)
fc = c[start:start+30]
print(fc[18:20],fc[22:24])
print(struct.unpack('>h',fc[18:20])+struct.unpack('>h',fc[22:24]))
pp.append(struct.unpack('>h',fc[18:20])+struct.unpack('>h',fc[22:24]))
# print(fc.index(b'\xb6'),fc.index(b'\x34'))
# print(c[:100])
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)
plt.imshow(img)
plt.show()
misc48
用winhex打开图片,发现右侧有提示:1、统计FF的数量再减一;2、ctfshow{}中包含32个字符。
因为flag长度为32位,所以只统计前32个FF的数量,得到
0 12 11 0 7 10 13 13 9 0 9 13 0 13 6 0 10 9 2 1 0 1 10 8 11 5 12 7 2 2 3 10
转为16进制得到,ctfshow{0cb07add909d0d60a92101a8b5c7223a}
misc49
脑洞题,winhex打开图片,发现能看到很多字符串,而且这些字符串前面都出现过FFE,将FFE后的那个字符提取出来就是flag了
最终得到ctfshow{0c618671a153f5da3948fdb2a2238e44}
图片篇(颜色通道)
misc50
考察StegSolve的使用,直接StegSolve打开,拼起来得到flag
misc51
统计一下每种颜色像素点的个数,发现绝大多数颜色只出现过1-3次,而(64, 96, 128)出现过282次,(128, 96, 64)出现过279次
脚本:
from PIL import Image
im=Image.open('misc51.png')
im = im.convert('RGB')
img = Image.new("RGB",(900,150))
dic = {}
for h in range(900):
for w in range(150):
s = im.getpixel((h,w))
dic[s] = dic.get(s,0)+1
lt = list(dic.items())
lt.sort(key = lambda x:x[-1])
print(lt)
Image.new新建一个黑色背景的图像,再遍历一次,如果坐标(x,y)对应的颜色为上述两种其一,则把该坐标对应的像素点变成白色
脚本:
from PIL import Image
im=Image.open('misc51.png')
im = im.convert('RGB')
img = Image.new("RGB",(900,150))
for h in range(900):
for w in range(150):
s = im.getpixel((h,w))
if s == (64, 96, 128) or s == (128, 96, 64):
img.putpixel([h, w], (255, 255, 255))
img.show()
最后得到flag,ctfshow{51fcc6228d768a3acab1d05572e52133}
misc52
大概做法和misc51一样,但是不同的是,这题颜色的出现更有规律,每种颜色的出现次数在199-585次。这里只要选择出现次数最少的十种即可,不需要猜或是爆破。
脚本:
from PIL import Image
im=Image.open('misc52.png')
im = im.convert('RGB')
img = Image.new("RGB",(900,150))
lt = [(130, 176, 116),(72, 217, 123),(146, 16, 141),(130, 241, 105),(251, 160, 136),(5, 129, 88),(167, 46, 187),(20, 65, 141),(96, 231, 225),(196, 144, 18)]
for h in range(900):
for w in range(150):
s = im.getpixel((h,w))
if s in lt:
img.putpixel([h, w], (255, 255, 255))
img.show()
misc53
LSB隐写,打开StegSolve,选择Analyse中的Data Extract,勾选上相应的选项,得到flag
misc54
在Alpha 0,Green 0,Blue 0均发现了LSB隐写痕迹。和misc53不同的是,这里是竖向排列的,所以要改一下选项
misc55
注意到图片是上下翻转的,写脚本把图片翻转回来
from PIL import Image
img = Image.open('misc55.png')
img.transpose(Image.FLIP_TOP_BOTTOM).save('out.png')
观察到R0、G0、B0通道均有隐写痕迹,而且也是竖向排列
看文件头发现是zip格式,点下面的Save Bin保存为1.zip,解压后得到flag
misc56
观察到R4、R2、R1、G4、G2、G1通道均有隐写痕迹,得到flag
参考文章
![Logo](https://devpress.csdnimg.cn/79de2bf0b7994defa4242ef90d5513fa.jpg)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)