1、
补充:.bpg
文件类型:Borland Project Group
扩展名为.bpg的文件是一个开发文件。
文件说明:
Contains groups of files, called packages, that can be compiled in a single batch; used for organizing files related to a specific programming project; also called a Borland Package Group..bpg
打开.bpg文件
Mac OS
需要使用到bpg图片的软件才可以打开bpg
下载bpg
bpg下载地址(其他地方下的用不了....)
https://bellard.org/bpg/
执行命令
bpgview.exe E:\firefox_download\misc3(1).zip\misc3.bpg
misc4
给了6个txt文件,hex fiend打开 看文件头和文件尾判断是什么文件
知识点
JPEG\JPG
文件头:FF D8 FF
文件尾:FF D9
开头四个点 结尾也是点
TGA
未压缩的前4字节 00 00 02 00
RLE压缩的前5字节 00 00 10 00 00
PNG
文件头:89 50 4E 47 0D 0A 1A 0A
文件尾:AE 42 60 82
即开头为.PNG,结尾为IEND.B
GIF
文件头:47 49 46 38 39(37) 61
文件尾:00 3B
开头为GIF89a
BMP
文件头:42 4D
文件头标识(2 bytes) 42(B) 4D(M)
BM开头
TIFF (tif)
文件头:49 49 2A 00
II开头
ico
文件头:00 00 01 00
Adobe Photoshop (psd)
文件头:38 42 50 53
所以第一个为png、第二个是jpg、第三个是bmp、第四个是gif、第五个是tif、第六个是webp文件。应该为RIFFL开头
改后缀即可
Misc13
这道题png图片隐写的原理有关
隐写术-PNG文件隐写(一)_3097的博客-CSDN博客_png文件隐写
找到文件末尾的IEND块,会发现这个块是14字节而非通常的12字节,也就是说这个块除了4位长度、4位标识和4位CRC,还带了两位数据(通常IEND块是不带数据的,但它也可以带,这应该就是本题知识点)。
不难发现,每空两个字符取出来就是
c->63
t->74
f->66
导出十六进制编码
写脚本:
a="631A74B96685738668AA6F4B77B07B216114655336A5655433346578612534DD38EF66AB35103195381F628237BA6545347C3254647E373A64E465F136FA66F5341E3107321D665438F1333239E9616C7D"
flag=""
for i in range(0,len(a),4):#步长为4,也就是说每次虚幻去四个字符,留下两个,删去两个
hexStr=a[i:i+2]
flag+=chr(int("0x"+hexStr,16))#输出十六进制对应的ASCII码
print(flag)
得到flag
misc23
提示说flag在时间里
下载之后得到的是一个psd文件(photoshop)
ExifTool最新版是一个可以跨平台查看、编辑文件的应用程序。ExifTool最新版目前支持十多种数据格式。ExifTool最新版能够读取全球任一厂商的数码相片格式。
查看文件信息
关键信息:
Timestamp指的是时间戳,DECtoHEX是十进制转十六进制 ,而且一共有四段
时间戳转换工具:https://tool.lu/timestamp/
得到数据:
874837022
2699208888
2156633445
460348906
转化为十六进制
ctfshow{fcbd427caf4a52f1147ab44346cd1cdd}
misc27
之前改动宽高都是png,在特定的位置改就可以啦,但是jpg不同,因为jpg图像被压缩了,所以需要查找
jpg是有损压缩格式,png是无损压缩格式。jpg是jpeg的简称,是目前网络上最为流行的图片格式,jpg格式的图片可以将图像文件压缩到最小格式,png全称为Portable Network Graphics,翻译过来就是便携式网络图形,它是一种无损压缩的图片形格式。
查看图片属性:
高度150转换成16进制为96
宽度900转换成16进制为0384
直接在010editor搜索
修改高度
拿到flag
misc28
提示还是flag在图片下面
但是这次拿到的是gif动图,有多帧,所以要改多处
ctfshow{59c8bc525426166b1c893fe12a387fd7}
misc29
提示:flag在图片下面。
这道题有多帧,所以全部要改
这题还是gif 格式文件 和上一题一样 但是这有10帧数 需要把所有高度都改了9600 为FF00 然后使用Stegsolve 打开第8帧就是flag。
ctfshow{03ce5be6d60a4b3c7465ab9410801440}
misc30(bmp文件修改宽高)
hint:正确宽度是950
bmp文件十六进制分析:实战——读取并分析BMP图像的十六进制数据_泼夫的博客-CSDN博客_图片16进制查看
上图为文件头部分
修改即可
950->03B6(这里有个要注意的点:要倒着写)
拿到flag
ctfshow{6db8536da312f6aeb42da2f45b5f213c}
misc31(计算bmp文件宽度)
上一道题目的链接有bmp结构介绍
查看目前图片大小:
目前是900*150=135000个像素大小
每个像素点分别有RGB构成
文件头占了53个字节,文件尾的位置在487253字节处(后面两个字节是windows的”补0”),又因为每个像素点由3个字节(十六进制码6位)表示,每个字节负责控制一种颜色,分别为蓝(Blue)、绿(Green)、红(Red)
文件真实的像素大小为:(487253-53)/3=162400
这题的高度是对的,所以正确的宽度是162400/150=1082
转换16进制
宽改到43A(也就是3A 04)
拿到flag
ctfshow{fb09dcc9005fe3feeefb73646b55efd5}
misc32(png图片爆破宽高)
爆破脚本:
import zlib
import struct
# 同时爆破宽度和高度
filename = "misc32.png"
with open(filename, 'rb') as f:
all_b = f.read()
data = bytearray(all_b[12:29])
n = 4095
for w in range(n):
width = bytearray(struct.pack('>i', w))
for h in range(n):
height = bytearray(struct.pack('>i', h))
for x in range(4):
data[x+4] = width[x]
data[x+8] = height[x]
crc32result = zlib.crc32(data)
#替换成图片的crc
if crc32result == 0xE14A4C0B:
print("宽为:", end = '')
print(width, end = ' ')
print(int.from_bytes(width, byteorder='big'))
print("高为:", end = '')
print(height, end = ' ')
print(int.from_bytes(height, byteorder='big'))
结果:
在010修改即可
拿到flagctfshow{685082227bcf70d17d1b39a5c1195aa9}
misc33
同一个思路,同一个脚本
ctfshow{03070a10ec3a3282ba1e352f4e07b0a9}
misc34
由于脚本是根据CRC计算宽度和高度的,所以这里脚本没用了,只能根据提示一点一点微调
调整的过程中发现有一条线
修改时注意图片中间的线,越明显越接近
正确宽度是1123多一点少一点都不行
修改宽度为:0463
ctfshow{03e102077e3e5de9dd9c04aba16ef014}
另一种写法使用脚本爆破所有可能
暴力枚举脚本:
import zlib
import struct
filename = "misc36.gif"
with open(filename, 'rb') as f:
all_b = f.read()
for i in range(920,951):
name = str(i) + ".gif"
f1 = open(name,"wb")
im = all_b[:38]+struct.pack('>h',i)[::-1]+all_b[40:]
f1.write(im)
f1.close()
ctfshow中Misc入门WP(超级全)_罡罡同学的博客-CSDN博客_ctfshowmisc的file
misc35(jpg爆破宽度)
具体脚本在上面链接
高度调到了600,宽度在993-1000这个范围内都可以得到flag
ctfshow{ca35201ca9ed607e5a68f44ef573fbc3}
misc36(gif宽度爆破)
爆破脚本
import zlib
import struct
filename = "misc36.gif"
with open(filename, 'rb') as f:
all_b = f.read()
for i in range(920,951):
name = str(i) + ".gif"
f1 = open(name,"wb")
im = all_b[:38]+struct.pack('>h',i)[::-1]+all_b[40:]
f1.write(im)
f1.close()
经测试,要先把每一帧的高度调大,不然看不到结果
原来的高度:
修改(注意要倒着写)
get it!
ctfshow{1ebf739f832906d60f57436b8179166f}
misc37(gif逐帧分离)
题目提示flag在图片里
下载拿到一张动图
放到gif在线分离工具:https://tu.sioe.cn/gj/fenjie/
分别在 第9、14、21、31、34
帧
拼起来就是:ctfshow{2056782cd57b13261dcbbe3d6eecda17}
misc38(apng图片分离)
下载之后拿到一张png,看起来是静止的,在chorm打开之后发现是一张动图png
ctfshow{48b722b570c603ef58cc0b83bbf7680d}
misc39(gif时间差flag)
hint:
misc40(apng时间差flag)
apng动图,使用APNG Disassembler工具,分离文件,同时会生成txt文件,记录详细信息
例如这个需要把54提取出来,转换成对应的ascii码
脚本:
flag=""
for i in range(1,69):
if i < 10:
i = "0" + str(i)
f = open("apngframe" + str(i) + ".txt")
s = f.read()
# delay=116/1000
flag += chr(int(s.split("/")[0][6:]))
print(flag)
运行:
实际在28张图片时出现flag,可以将range范围改为28,69
flag:ctfshow{95ca0297dff0f6b1bdaca394a6fcb95b}
misc41(IDAT的数据块长度)
hint:提示:flag有多长?2cm……不好意思打错了,41位
使用工具:TweakPNG
打开查看IDAT
块 将长度进行chr
转换
脚本(ascii转换)
s = [229,152,191,229,152,191,49,99,116,102,115,104,111,119,123,48,55,56,99,98,100,48,102,57,99,56,100,51,102,50,49,53,56,101,55,48,53,50,57,102,56,57,49,51,99,54,53,125]
for i in s:
print(chr(i),end='')
结果:
flag:ctfshow{078cbd0f9c8d3f2158e70529f8913c65}
misc43(收集报错)
hint:错误中隐藏着通往正确答案的道路
tweakpng打开图片发现很多报错提示,用pngdebugger看一下
pngdebugger使用:工具 PNG Debugger 的安装使用_Goodric的博客-CSDN博客
里面有很多的crc是fail的模块
根据提示,把这些部分的十六进制提取出来
string ="E59387E50x93A62E630x746673680x6F777B360x656232350x383966660x666635650x333930660x653662380x373530340x646263300x3839327D"
string=string.replace("0x","")
for i in range(0,len(string),2):
print((string[i:i+2]),end=" ")
#两两切割,0x替换掉
结果:(得到十六进制数据)
E5 93 87 E5 93 A6 2E 63 74 66 73 68 6F 77 7B 36 65 62 32 35 38 39 66 66 66 66 35 65 33 39 30 66 65 36 62 38 37 35 30 34 64 62 63 30 38 39 32 7D
转为acsii码:
flag:ctfshow{6eb2589ffff5e390fe6b87504dbc0892}
misc44(CRC32隐写)
提示:错误中还隐藏着坑
还是试着用来png debugger,不过这次出来了好多crc数据块
至于如何提取正确和错误的CRC32,我的做法是用PCRT识别再放入txt,再写个脚本,就比较容易
PCRT:一款自动化检测修复PNG损坏的取证工具
可以在kali中安装PCRT:git clone https://github.com/sherlly/PCRT.git
然后 python PCRT.py -y -v -i misc44.png > 666.txt
python脚本代码:
原文链接:https://blog.csdn.net/m0_46625346/article/details/119083860
f = open('666.txt')
res = ''
while 1:
c = f.readline()
if c:
if 'chunk crc' in c:
# print(c)
res+='0'
elif 'Correct IDAT CRC' in c:
res+='1'
else:
break
print(res)
print(len(res))
for i in range(len(res)//8):
a = res[i*8:i*8+8]
try:
print(chr(int(a,2)),end='')
except:
pass
666.txt的内容:
运行结果:
flag:ctfshow{cc1af32bf96308fc1263231be783f69e}
misc45(图片格式转换)
提示:有时候也需要换一换思维格式
其实图片中是是藏有了其他文件但是因为png和bmp格式图片像素点的读取方式不一样,在png格式下分离不出文件,需要先把图片从png格式转换成bmp格式,在进行binwalk提取得到flag.png
在线转换网站:https://cn.onlineconvert.com/pdf-to-bmp
直接改后缀名没法用,还是需要转化
binwalk -e
misc46(gif偏移量绘图)
hint:你见过扶乩吗
这道题由于工具没有安装成功所以没做,学习一下大致思路
misc47
打开图片发现什么都没有
用谷歌浏览器打开:
果然是apng文件
了解一下apng文件结构,简单来说就是每一个IDAT块前面都会有一个fcTL块,它其中就包含水平垂直偏移量
我们就是要提取这些偏移量进行绘图
先把图片的十六进制数据导出为1.txt
引用一下师傅的脚本:
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()
得到flag
ctfshow{6d51f85b45a0061754a2776a32cf26c4}
参考博客:ctfshow中Misc入门WP(超级全)_罡罡同学的博客-CSDN博客_ctfshowmisc的file
misc48(大大的脑洞)
用winhex打开,发现右侧文本信息有提示
1、统计FF的数量,再减去1
2、ctfshow{}中包含32个字符
第一条提示,其实指的是统计每两个有意义块之间的FF的数量再减一
图中紫色的就是,开头的那个FF也算,因为只有一个,减去1后就是0;接下来是12、11、0…
因为flag长度是32位,所以只统计前32个,即:
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
用小脚本跑一下
s = '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'
d = '0123456789abcdef'
for i in s.split(' '):
print(d[int(i)],end='')
0cb07add909d0d60a92101a8b5c7223a
ctfshow{0cb07add909d0d60a92101a8b5c7223a}
。
原文链接:https://blog.csdn.net/m0_46625346/article/details/119083860
misc49,同样也是脑洞题。这里直接放参考链接了
https://blog.csdn.net/q20010619/article/details/120238821#t15
颜色通道题
misc50(stegslove颜色通道)
用stegsolve工具打开,不停的换色道,发现flag踪迹(狗头)
ctfshow{84470883ee1eec2e886436461bf79111}
misc51
hint:你会数数吗。
乱糟糟的图片看的眼花缭乱,参考了师傅们的wp,思路应该是:
用脚本计算每个像素点出现的数量,并按出现数量的大小顺序排序
脚本:
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)
脚本跑出来的色素点个数是排好序的,这样看来,只有三种像素点出现次数多,其中(0,0,0)占最大部分,黑色,猜测是底色,其他两种颜色进行画图即可
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
和上一题不一样的地方在于,在某些通道可以依稀看到flag
大概做法和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()
#由于数值较多,这里采用列表+循环
运行得到:
ctfshow{f87ad503c2c163471fbe768c9d7a9d6c}
misc53(横向LSB)
解答:非常基础的LSB隐写。用stegsolve查看,可以看到三个颜色的0通道都发现了隐写痕迹。(原来勾选可以先看颜色通道,学到了)
ctfshow{69830d5a3a3b5006f7b11193e9bc22a2}
misc54(竖向LSB)
在Alpha0
、B0
、G0
通道均发现lsb隐写痕迹,而且和misc53不同的是,这里是竖向排列的,即按列(column
)
勾选上对应选项
https://www.cnblogs.com/cat47/p/11483478.html (至于位平面的选取为什么是BRG应该是色块的重叠顺序,具体可以参考上面的链接,都试试)
ctfshow{b1f8ab24b8ca223d0affbf372ba0e4fa}
misc55(反转+LSB隐写)
参考这位师傅的wp:
(还有一种方便的做法使用zsteg)
直接原图分析
分离
ctfshow学习记录-misc入门(图片篇-颜色通道50-56)_九枕的博客-CSDN博客_misc51
这篇里面有写脚本对图片进行翻转
ctfshow-Misc入门 图片篇(50-60)_z.volcano的博客-CSDN博客
ctfshow{daf256838e19a19d9e7b0a69642ad5ee}
misc56(MSB)
msb是小端存放的意思,lsb是大端存放
提示:怎么老是愉快的LSB部分。
解答:lsb查看,发现r4,r2,r1,g4,g2,g1有。
这道题目得是msb才出flag
ctfshow{1b30c28a5fca6cec5886b1d2cc8b1263}
后面还有几道题,不过现在ctfshow没有了,这位师傅的payload有ctfshow-Misc入门 图片篇(50-60)_z.volcano的博客-CSDN博客