ctfshow misc入门wp

目录

图片篇(基础操作)

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数据

打开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

参考文章

CTFShow-MISC入门篇详细wp(1-56)_ctfshow misc入门_落寞的魚丶的博客-CSDN博客

ctfshow-Misc入门 图片篇(1-49)_z.volcano的博客-CSDN博客_ctf出题

  • 32
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值