赞
踩
目录
压缩包解压之后得到一张图片,里面就是flag
将txt拖到winhex中查看,发现文件头为89 50 4E 47,说明是png格式,直接修改后缀为.png,得到flag
发现为.bpg格式文件,使用bpgview.exe打开,在命令行输入bpgview.exe misc3.bpg,即可得到flag
将解压得到的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格式。
将图片拖进winhex,搜索ctfshow,发现在结尾处有flag
与上一题一样,用winehx打开搜索ctfshow,发现flag
与上一题一样
打开winhex查看,发现中间有很多00字段,猜测可能包含了另一个文件
打开kali使用binwalk命令分析,发现存在另一个文件,用foremost分离得到另一张图片,打开就是flag
binwalk misc8.png
foremost misc8.png
winhex打开搜索ctfshow,得到flag
在kali中使用binwalk -e命令分离出隐藏文件,得到flag
binwalk misc10.png
binwalk -e misc10.png
用tweakpng.exe打开发现有两个数据块,根据提示删除第一个数据,再另存为图片,得到flag
也是用tweakpng.exe打开删除前8个数据块即可
根据提示,用winhex打开,拉到结尾处找到一段像flag的值,隔位取值,得到flag
用winhex打开,发现有大量00数据
打开kali,用binwalk命令分析一下,发现在2103处还有数据为jpg图片,使用dd命令分离出该图片
binwalk -e misc14.jpg
dd if=misc14.jpg of=flag.jpg skip=2103 bs=1
winhex打开搜索ctfshow
用binwalk命令分离出隐藏文件,得到flag
binwalk -e misc16.png
在kali中使用zsteg命令,再用binwalk对1.txt进行分离,得到flag
zsteg -E "extradata:0" misc17.png > 1.txt
binwalk -e 1.txt
根据提示,右击属性,找到详细信息
在kali中利用exiftool查看图片,将文档名和主机拼起来就是flag
exiftool misc19.tif
也可以打开在线网站https://exif.tuchong.com/进行查看
与上题一样也是exif,将内容转成字母,得到flag
ctfshow{c97964b1aecf06e1d79c21ddad593e42}
也是exif,查看信息,得到序列号为686578285826597329,提交发现错误,尝试转成十六进制形式,发现得到提示,按顺序将xy转化成十六进制
转换脚本:
- n = [3902939465, 2371618619, 1082452817, 2980145261]
- flag=''
- for i in n:
- a=str(hex(i))
- flag+=a[2:]
- print(flag)
在kali中使用exiftool命令查看图片,可以看到存在缩略图,再以二进制形式提取缩略图信息,并写入flag.jpg中
exiftool misc22.jpg
exiftool -ThumbnailImage -b misc22.jpg > flag.jpg
或者使用MagiExif软件打开,可以直接看到缩略图
kali中使用exiftool命令查看到有四个时间
exiftool misc23.psd
使用在线工具https://tool.lu/timestamp/,将四个时间转化为时间戳
最终得到874865822,2699237688,2156662245,460377706,用21题的脚本跑一下,即可得到flag
在010Edito中搜索F0 01,使其高亮,就可以看到flag了
右击属性可以看到目前像素是900 x 153=137700,而文件头占了53字节,文件结尾在675053字节处。又因为每个像素点由三个字节表示,每个字节控制一种颜色,分别为红、绿、蓝三种颜色。所以文件真实像素大小为(675053-53)/3=225000。根据提示本题的宽度是没问题的,所以只需要修改高度即可。高度=225000/900=250
修改高度为FA,右键另存为图片,得到flag
这题是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了
与上一题一样,用脚本跑出正确的宽高,修改之后得到flag
修改图片高度为FF,得到flag
修改高度96 00 为FF 00,另存为新的图片,因为是gif格式不方便查看,打开StegSolve查看图片,即可得到flag
使用winhex搜索中的替换功能,将96 00全部替换为FF 00,即可得到flag
将图片宽度修改为950的16进制值03 B6,因为大多数的BMP文件都是倒向的位图,所以这里要倒着写。另存为图片,得到flag
和misc24一样,计算图片的宽高,像素是900 x 153=137700,真实像素大小为(487251-54)/3=162399。又因为高度正确,所以宽度=162399/150=1082.66。修改宽度为1082的16进制值04 3A即可。
也是crc校验问题,用misc25的脚本爆破出正确宽高,修改即可
与上题一样
由于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()
这题需要先修改图片的高度,这里我改到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()
先修改图片高度为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()
将图片后缀改为png,使用APNG Disassembler对其进行分离或者打开在线网站https://tu.sioe.cn/gj/fenjie/,分离gif帧,可以看到在第9,14,21,31,34帧有flag,拼起来提交即可。
用APNG Disassembler或 Honeyview打开图片,一帧一帧查看就可以得到flag
这里是利用不同帧之间的间隔时间来隐写的。打开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)
用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)
用tweakpng打开,发现这几个数转字符串就是ctfshow,将剩下的全部转成字符得到flag。
ctfshow{078cbd0f9c8d3f2158e70529f8913c65}
用tweakpng打开 发现报错,用pngdebugger打开进行分析,发现很多错误的crc值,根据提示提取出来转成字符串得到flag
根据提示应该还是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="")
exif,binwalk都没有什么有效的信息,按照提示可能是换一种文件格式。去在线网站:https://cdkm.com/cn/png-to-bmp,将图片转换成bmp格式。然后在kali中使用binwalk命令进行分析,发现存在flag.png,提取出来得到flag
binwalk misc45.bmp
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()
给了一个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()
用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}
脑洞题,winhex打开图片,发现能看到很多字符串,而且这些字符串前面都出现过FFE,将FFE后的那个字符提取出来就是flag了
最终得到ctfshow{0c618671a153f5da3948fdb2a2238e44}
考察StegSolve的使用,直接StegSolve打开,拼起来得到flag
统计一下每种颜色像素点的个数,发现绝大多数颜色只出现过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}
大概做法和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()
LSB隐写,打开StegSolve,选择Analyse中的Data Extract,勾选上相应的选项,得到flag
在Alpha 0,Green 0,Blue 0均发现了LSB隐写痕迹。和misc53不同的是,这里是竖向排列的,所以要改一下选项
注意到图片是上下翻转的,写脚本把图片翻转回来
- 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
观察到R4、R2、R1、G4、G2、G1通道均有隐写痕迹,得到flag
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。