目录
图片篇(基础操作)
misc1
misc2
misc3
misc4
图片篇(信息附加)
misc5
misc6
misc7
misc8
misc9
misc10
misc11
misc12
misc13
misc14
misc15
misc16
misc17
misc18
misc19
misc20
misc21
misc22
misc23
misc41
图片篇(文件结构)
misc24
misc25
misc26
misc27
misc28
misc29
misc30
misc31
misc32
misc33
misc34
misc35
misc36
misc37
misc38
misc39
misc40
misc42
misc43
misc44
misc45
misc46
misc47
misc48
misc49
图片篇(颜色通道)
misc50
misc51
misc52
misc53
misc54
misc55
misc56
参考文章
图片篇(基础操作)
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数据
![](https://img-
blog.csdnimg.cn/ad2bcc16462b4b0e9e30814008549e31.png)打开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](https://cdkm.com/cn/png-to-
bmp%EF%BC%8C%E5%B0%86%E5%9B%BE%E7%89%87%E8%BD%AC%E5%8C%96%E4%B8%BAbmp%E6%A0%BC%E5%BC%8F%E3%80%82
“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
参考文章
CTFShow-MISC入门篇详细wp(1-56)_ctfshow misc入门_落寞的魚丶的博客-
CSDN博客
ctfshow-Misc入门 图片篇(1-49)_z.volcano的博客-
CSDN博客_ctf出题
学习计划安排
我一共划分了六个阶段,但并不是说你得学完全部才能上手工作,对于一些初级岗位,学到第三四个阶段就足矣~
这里我整合并且整理成了一份【282G】的网络安全从零基础入门到进阶资料包,需要的小伙伴可以扫描下方CSDN官方合作二维码免费领取哦,无偿分享!!!
如果你对网络安全入门感兴趣,那么你需要的话可以
点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!
①网络安全学习路线
②上百份渗透测试电子书
③安全攻防357页笔记
④50份安全攻防面试指南
⑤安全红队渗透工具包
⑥HW护网行动经验总结
⑦100个漏洞实战案例
⑧安全大厂内部视频资源
⑨历年CTF夺旗赛题解析