当前位置:   article > 正文

ctfshow-Misc入门_ctfshow misc

ctfshow misc

写在前面

后续提取图片中的flag均为脚本提取,部分flag提取出错需要人工再次核验哈~,flag提取演示

图片篇(基础操作)

misc1

flag在下载的图片上

在这里插入图片描述

在这里插入图片描述

misc2

将后缀名改为.png即可在图片上看到flag

在这里插入图片描述

misc3

推荐一款图片浏览器 Honeyview,直接可以查看bpg格式的图片

在这里插入图片描述

misc4

用 HxD 依次查看文件头,将后缀名依次改为 .png.jpg.bmp.gif.tif.webp,将内容拼接起来即可得到flag

在这里插入图片描述
在这里插入图片描述

图片篇(信息附加)

misc5

HxD 打开,拖到尾部即可发现flag

在这里插入图片描述

misc6

HxD 打开,搜索关键词 ctfshow 即可发现flag

在这里插入图片描述

misc7

HxD 打开,搜索关键词 ctfshow 即可发现flag

在这里插入图片描述

misc8

binwalk 查看图片发现隐藏图片,利用 foremost 提取出来

在这里插入图片描述
在这里插入图片描述

misc9

zsteg 查看图片,发现flag

在这里插入图片描述

zsteg (补充)

zsteg安装方法 (补充)

更换RubyGems的源
gem sources --remove https://rubygems.org/
gem sources --add https://gems.ruby-china.com/
gem sources -l
安装zsteg
git clone https://hub.fastgit.org/zed-0xff/zsteg.git 
cd zsteg
gem install zsteg
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

zsteg的使用方法 (常见)

查看帮助
zsteg -h

查看LSB信息
zsteg pcat.png

检测zlib
# -b的位数是从1开始的
zsteg zlib.bmp -b 1 -o xy -v

显示细节
zsteg pcat.png -v

尝试所有已知的组合
zsteg pcat.png -a

导出内容
zsteg -E "b1,bgr,lsb,xy" pcat.png > p.exe

更多的使用方法可以查看README.md
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

misc10

binwalk 查看图片,分离图片,查看数据块即可发现flag,需要注意的是zlib是PNG IDAT的可选压缩格式

在这里插入图片描述

misc11

binwalk 查看发现两个IDAT数据块,尝试删去第一个数据块,查看图片发现flag

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

misc12

zsteg查看图片提示数据块异常

在这里插入图片描述

测试后发现需要删掉前8个IDAT块

在这里插入图片描述

在这里插入图片描述

misc13

HxD查看发现图片尾部存在可疑数据,观察发现{前面那一串字符从第一位开始每隔一位选取一个字符,连起来就是ctfshow,编写脚本提取flag

s="631A74B96685738668AA6F4B77B07B216114655336A5655433346578612534DD38EF66AB35103195381F628237BA6545347C3254647E373A64E465F136FA66F5341E3107321D665438F1333239E9616C7D"
flag=""
for i in range(0,len(s),4):
    flag += s[i]
    flag += s[i+1]
print(flag)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

misc14

binwalk查看图片,发现JPEG图片,foremostbinwalk无法成功提取,用HxD打开搜索文件头手动提取
在这里插入图片描述

在这里插入图片描述

misc15

HxD打开搜索关键词 ctfshow 即可发现flag

在这里插入图片描述

misc16

binwalk查看图片,发现额外数据,用binwalk -e提取出来,查看提取出来的文件发现flag

在这里插入图片描述

misc17

binwalk提取出来的东西解不出,尝试 zsteg,根据提示提取信息得到PNG图片,查看图片发现flag

在这里插入图片描述

在这里插入图片描述

misc18

exiftool 查看图片,flag在标题、作者、照相机和镜头型号里

在这里插入图片描述

misc19

exiftool 查看图片,flag在主机上的文档名里

在这里插入图片描述

misc20

exiftool 查看图片,flag在评论里

在这里插入图片描述

misc21

exiftool 查看图片,将序列号686578285826597329转字符得到hex(X&Ys),分别将X/Y ResolutionX/Y Position转成hex,然后拼接起来,flag为ctfshow{e8a221498d5c073b4084eb51b1a1686d}

在这里插入图片描述

misc22

直接查看图片没有发现什么,但是用 Honeyview浏览缩略图时发现数据

在这里插入图片描述

利用 MagicEXIF 查看图片,flag为ctfshow{dbf7d3f84b0125e833dfd3c80820a129}

在这里插入图片描述

misc23

exiftool看一下发现有好几个历史时间,History Action中有提示

在这里插入图片描述

将给出的四个时间的时间戳转换出来,分别hex后拼在一起,转换地址

在这里插入图片描述

misc41

提示中的F001是突破点,HxD 查看图片发现有有大量F001组成了某种形状

在这里插入图片描述

F001出现过的位置中所有十六进制的值单独截取出来,每四位分隔开,把F001替换成0,其他值替换成空格,得到一张含有flag的图片,这里也可以采用CyberChef来解决问题,flag为ctfshow{fcbd427caf4a52f1147ab44346cd1cdd}

图片篇(文件结构)

misc24

HxD查看一下图片,文件头占了53个字节,文件尾的位置在675053字节处 (后面两个字节是windows的”补0”),因为每个像素点由3个字节 (十六进制码6位) 表示,每个字节负责控制一种颜色,分别为蓝(Blue)、绿(Green)、红(Red),所以文件真实的像素大小为:(675053-53)/3=225000

在这里插入图片描述
在这里插入图片描述

题目给的图片是900*150=135000个像素大小

在这里插入图片描述

尝试后发现这题的宽度是对的,所以正确的高度是225000/900=250,将高度改成

在这里插入图片描述
在这里插入图片描述

misc25

TweakPNG查看图片发现图片的CRC值不对,猜测应该是修改了宽高,用脚本跑一下看看

在这里插入图片描述

在这里插入图片描述

根据脚本计算出来的值修改宽高,保存后即可看到flag

在这里插入图片描述
在这里插入图片描述

misc26

TweakPNG查看图片发现图片的CRC值不对,和上一题一样用脚本跑一下看看

在这里插入图片描述
在这里插入图片描述

根据脚本计算出来的值修改宽高,保存后即可看到flag

在这里插入图片描述
在这里插入图片描述

misc27

根据提示,猜测依旧是修改图片高度,将高度改高后即可发现flag

在这里插入图片描述
在这里插入图片描述

misc28

根据提示,猜测依旧是修改图片高度,将高度改高后即可发现flag,但是需要注意从预览图中能看到flag,但是直接打开看不到,可以使用图片编辑器或者Stegsolve打开

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

misc29

GIF有很多帧,将每一帧的高度都改高后,用Stegsolve查看,在第八帧即可发现flag

在这里插入图片描述

misc30

根据提示修改BMP图片宽度即可发现flag

在这里插入图片描述
在这里插入图片描述

misc31

根据题给描述,计算正确宽度

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

misc32

根据题给描述,计算出正确的高宽

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'))

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

在这里插入图片描述

修改宽高保存后即可看到flag
在这里插入图片描述
在这里插入图片描述

misc33

根据题给描述,计算出正确的高宽

在这里插入图片描述

修改宽高保存后即可看到flag

在这里插入图片描述
在这里插入图片描述

misc34

利用脚本把生成的所有图片都保存下来了,观察哪个是正常的

import zlib
import struct
filename = r"C:\Users\95235\Downloads\misc34\misc34.png"
with open(filename, 'rb') as f:
    all_b = f.read()
    #w = all_b[16:20]
    #h = all_b[20:24]
    for i in range(901,1200):
        name = str(i) + ".png"
        f1 = open(r"C:\Users\95235\Downloads\misc34\\" + name,"wb")
        im = all_b[:16]+struct.pack('>i',i)+all_b[20:]
        f1.write(im)
        f1.close()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

在这里插入图片描述

misc35

先把图片基础的高度调高一点(高度在600,宽度在993-1000这个范围内都可以得到flag),才能看到flag

import zlib
import struct
filename = r"C:\Users\95235\Downloads\misc35\misc35.jpg"
with open(filename, 'rb') as f:
    all_b = f.read()
    #w = all_b[159:161]
    #h = all_b[157:159]
    for i in range(901,1200):
        name = str(i) + ".jpg"
        f1 = open(r"C:\Users\95235\Downloads\misc35\\" + name,"wb")
        im = all_b[:159]+struct.pack('>h',i)+all_b[161:]
        f1.write(im)
        f1.close()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

在这里插入图片描述

misc36

和上一题一样先把图片基础的高度调高一点,脚本爆破即可,用照片编辑器查看gif文件

import zlib
import struct
filename = r"C:\Users\95235\Downloads\misc36\misc36.gif"
with open(filename, 'rb') as f:
    all_b = f.read()
    for i in range(920,951):
        name = str(i) + ".gif"
        f1 = open(r"C:\Users\95235\Downloads\misc36\\" + name,"wb")
        im = all_b[:38]+struct.pack('>h',i)[::-1]+all_b[40:]
        f1.write(im)
        f1.close()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在这里插入图片描述
在这里插入图片描述

misc37

Stegsolve查看,flag在8、14、21、31、34帧中,拼接起来即可

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

misc38

题目所给的是apng图片,可以使用APNG Disassembler来把每一帧分离出来,9、17、36、40帧中藏有flag

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

misc39

这里是利用不同帧之间的间隔时间来隐写的,利用identify来处理该GIF图片

安装命令:
sudo apt-get install imagemagick
  • 1
  • 2

提取命令:identify -format "%T " misc39.gif > 1.txt,得到的一串36和37

在这里插入图片描述

把37换成1、36换成0,得到长度为287的二进制字符串,由于无法整除8,考虑7位一组,转换成字符得到flag

在这里插入图片描述

misc40

文件识别为apng文件,使用工具APNG Disassembler,flag在记录详细信息的txt文件中,用脚本把flag提取出来

在这里插入图片描述

在这里插入图片描述

misc42

根据提示,用tweakpng打开图片,发现IDAT块的长度很可疑,有一部分IDAT块的长度转换为字符是ctfshow,将后面的接着转换成字符即可得到flag

在这里插入图片描述
在这里插入图片描述

misc43

根据题给描述,先用tweakpng打开分析一下图片,发现报了一堆错,使用pngdebugger分析,发现所有IDAT块的crc32值都是错误的

在这里插入图片描述

将错误的IDAT块的crc-code提取出来,拼接起来转字符串即可得到flag

在这里插入图片描述

import binascii
def hex_to_str(s):
    hex = s.encode('utf-8')
    str_bin = bin
    str_bin = binascii.unhexlify(hex)
    return str_bin.decode('utf-8')

s = 'E59387E593A62E63746673686F777B36656232353839666666663565333930666536623837353034646263303839327D'
hex_to_str(s)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

misc44

根据提示,用PNGDebugger打开,把信息导入到txt文件中

在这里插入图片描述

利用脚本把CRC OK的替换成1,CRC FAILED替换成0,注意先把前十行的内容删去,再把最后四行删去

在这里插入图片描述

misc45

根据题给描述,猜测是文件转换,测试后发现转成.bmp格式后,用binwalk提取即可,看大师傅的blog发现考察点是png和bmp像素点的读取方式

在这里插入图片描述
在这里插入图片描述

misc46

根据题给描述,搜索后猜测应该是画图之类的,先提取出GIF的详细信息

identify misc46.gif > message.txt 
  • 1

在这里插入图片描述

观察得到的信息,其中0+0、174+49、196+47这些是偏移量,用其来进行画图

坐标提取:

f = open(r"C:\Users\95235\Downloads\misc46\message.txt","r")
x = f.readlines()
f.close()

f = open(r"C:\Users\95235\Downloads\misc46\out.txt","w")
for i in x:
    f.write(i.split("+")[1])
    f.write(" ")
    f.write(i.split("+")[2][:2])
    f.write("\n")
f.close()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

根据得到的点坐标进行绘图

在这里插入图片描述

在这里插入图片描述

misc47

测试后发现是apng格式,解题的思路是根据每一个IDAT块前面的一个fcTL块中包含的水平垂直偏移量

在这里插入图片描述

import struct
from PIL import Image
import matplotlib.pyplot as plt
f = open(r'C:\Users\95235\Downloads\misc47\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))
    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]))
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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

在这里插入图片描述

misc48

010 editor打开,发现提示统计FF的数量再减去1、ctfshow{}中包含32个字符

在这里插入图片描述

因为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
  • 1

分别转换成hex即可

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]
f = '0123456789abcdef'
flag = 'ctfshow{'
for i in range(len(s)):
    flag += f[s[i]]
flag += '}'
print(flag)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

misc49

010 editor打开,FFE后面的就是flag的值

在这里插入图片描述

图片篇(颜色通道)

misc50

由于是颜色通道篇的,很自然想到用Stegsolve查看一下,

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号