当前位置:   article > 正文

ctfshow misc入门wp_kali binwalk

kali binwalk

目录

图片篇(基础操作)

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转化成十六进制

转换脚本:

  1. n = [3902939465, 2371618619, 1082452817, 2980145261]
  2. flag=''
  3. for i in n:
  4.     a=str(hex(i))
  5.     flag+=a[2:]
  6. 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博客

这里直接上爆破宽高的脚本:

  1. import binascii
  2. import struct
  3.  
  4.  
  5.  
  6. crcbp = open("misc25.png", "rb").read()    #打开图片
  7. crc32frombp = int(crcbp[29:33].hex(),16)     #读取图片中的CRC校验值
  8. print(crc32frombp)
  9.  
  10. for i in range(4000):                        #宽度1-4000进行枚举
  11.     for j in range(4000):                    #高度1-4000进行枚举
  12.         data = crcbp[12:16] + \
  13.             struct.pack('>i', i)+struct.pack('>i', j)+crcbp[24:29]
  14.         crc32 = binascii.crc32(data) & 0xffffffff
  15.         # print(crc32)
  16.         if(crc32 == crc32frombp):            #计算当图片大小为i:j时的CRC校验值,与图片中的CRC比较,当相同,则图片大小已经确定
  17.             print(i, j)
  18.             print('hex:', hex(i), hex(j))
  19.             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

  1. import struct
  2. filename = "misc34.png"
  3. with open(filename, 'rb') as f:
  4.     data = f.read()
  5.     for i in range(901,1200):
  6.         name = str(i) + ".png"
  7.         f1 = open(name,"wb")
  8.         new = data[:16]+struct.pack('>i',i)+data[20:]
  9.         f1.write(new)
  10.         f1.close()

misc35

这题需要先修改图片的高度,这里我改到600,之后再遍历宽度得到正确的图片,宽度在993~1000范围内的图片都是正常的

脚本:

  1. import struct
  2. filename = "misc35.jpg"
  3. with open(filename, 'rb') as f:
  4.     data = f.read()
  5.     for i in range(901,1000):
  6.         name = str(i) + ".jpg"
  7.         f1 = open(name,"wb")
  8.         new = data[:159]+struct.pack('>h',i)+data[161:]
  9.         f1.write(new)
  10.         f1.close()

misc36

先修改图片高度为300,再利用脚本遍历,得到正确宽度为941

脚本:

  1. import struct
  2. filename = "misc36.gif"
  3. with open(filename, 'rb') as f:
  4.     data = f.read()
  5.     for i in range(920,951):
  6.         name = str(i) + ".gif"
  7.         f1 = open(name,"wb")
  8.         new = data[:38]+struct.pack('>h',i)[::-1]+data[40:]
  9.         f1.write(new)
  10.         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。

脚本:

  1. s="11000111110100110011011100111101000110111111101111111011011010101100100111000011000101100101100110110011001110010111001011010111001101100010011011111000101100101011001001101100111000110010001110010110110011001111000010111001110010111000101100011110000101100000110100011010101110011111101"
  2. flag=""
  3. for i in range(41): #287//7
  4.     flag += chr(int(s[7*i:7*(i+1)],2))
  5. print(flag)

 

misc40

用APNG Disassembler打开,分离出各个帧。可以看到除了分离出图片外,每个图片还有个txt文档,里面有我们要的内容。写脚本提取出来.

脚本:

  1. flag=""
  2. for i in range(28,69): #flag内容从28位开始
  3.     f = open('apngframe'+str(i)+'.txt')
  4.     s = f.read()
  5.     flag += chr(int(s.split("/")[0][6:]))
  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

脚本:

  1. f=open("1.txt","r")
  2. s=f.read()
  3. f.close()
  4. flag=""
  5. for i in s.split():
  6.     if "OK!" == i:
  7.         flag += "1"
  8.     elif "FAILED" ==i:
  9.         flag += "0"
  10. print(flag)
  11. #11111111111111110110001101110100011001100111001101101000011011110111011101111011011000110110001100110001011000010110011000110011001100100110001001100110001110010011011000110011001100000011100001100110011000110011000100110010001101100011001100110010001100110011000101100010011001010011011100111000001100110110011000110110001110010110010101111101
  12. print(len(flag)) #344
  13. for i in range(43):
  14.     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每一帧的偏移量作为坐标来画图

脚本:

  1. from PIL import Image
  2. import matplotlib.pyplot as plt
  3. f = open('1.txt')
  4. pp = []
  5. while 1:
  6.     c = f.readline()
  7.     if c:
  8.         s = eval(c.split('+')[1]+','+c.split('+')[2][:2])
  9.         pp.append(s)
  10.         print(s)
  11.         # print(c)
  12.     else:
  13.         break
  1. img = Image.new('RGB',(400,70),(255,255,255))
  2. for i in pp:
  3.     new = Image.new('RGB',(1,1),(0,0,0))
  4.     img.paste(new,i)
  5. plt.imshow(img)
  6. plt.show()

misc47

给了一个png,打开发现没内容,用浏览器打开,确认是apng。对于apng格式每一个IDAT块前面都会有一个fcTL块,它其中就包含水平垂直偏移量。

脚本:

  1. import struct
  2. from PIL import Image
  3. import matplotlib.pyplot as plt
  4. f = open('misc47.png','rb')
  5. c = f.read()
  6. c = c[c.index(bytes.fromhex('6663544C00000001')):]
  7. pp = []
  8. for i in range(1,1124,2):
  9.     start = c.index(bytes.fromhex('6663544C0000')+struct.pack('>h',i))
  10.     # start = c.index(bytes.fromhex('6663544C000000'+hex(i)[2:]))
  11.     # print(start)
  12.     fc = c[start:start+30]
  13.     print(fc[18:20],fc[22:24])
  14.     print(struct.unpack('>h',fc[18:20])+struct.unpack('>h',fc[22:24]))
  15.     pp.append(struct.unpack('>h',fc[18:20])+struct.unpack('>h',fc[22:24]))
  16.     # print(fc.index(b'\xb6'),fc.index(b'\x34'))
  17. # print(c[:100])
  18. img = Image.new('RGB',(400,70),(255,255,255))
  19. for i in pp:
  20.     new = Image.new('RGB',(1,1),(0,0,0))
  21.     img.paste(new,i)
  22. plt.imshow(img)
  23. 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次

脚本:

  1. from PIL import Image
  2. im=Image.open('misc51.png')
  3. im = im.convert('RGB')
  4. img = Image.new("RGB",(900,150))
  5. dic = {}
  6. for h in range(900):
  7.     for w in range(150):
  8.         s = im.getpixel((h,w))
  9.         dic[s] = dic.get(s,0)+1
  10. lt = list(dic.items())
  11. lt.sort(key = lambda x:x[-1])
  12. print(lt)

Image.new新建一个黑色背景的图像,再遍历一次,如果坐标(x,y)对应的颜色为上述两种其一,则把该坐标对应的像素点变成白色

脚本:

  1. from PIL import Image
  2. im=Image.open('misc51.png')
  3. im = im.convert('RGB')
  4. img = Image.new("RGB",(900,150))
  5. for h in range(900):
  6.     for w in range(150):
  7.         s = im.getpixel((h,w))
  8.         if s == (64, 96, 128) or s == (128, 96, 64):
  9.             img.putpixel([h, w], (255, 255, 255))
  10. img.show()

最后得到flag,ctfshow{51fcc6228d768a3acab1d05572e52133} 

misc52

大概做法和misc51一样,但是不同的是,这题颜色的出现更有规律,每种颜色的出现次数在199-585次。这里只要选择出现次数最少的十种即可,不需要猜或是爆破。

脚本:

  1. from PIL import Image
  2. im=Image.open('misc52.png')
  3. im = im.convert('RGB')
  4. img = Image.new("RGB",(900,150))
  5. 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)]
  6. for h in range(900):
  7.     for w in range(150):
  8.         s = im.getpixel((h,w))
  9.         if s in lt:
  10.             img.putpixel([h, w], (255, 255, 255))
  11. img.show()

misc53

LSB隐写,打开StegSolve,选择Analyse中的Data Extract,勾选上相应的选项,得到flag

 

misc54

在Alpha 0,Green 0,Blue 0均发现了LSB隐写痕迹。和misc53不同的是,这里是竖向排列的,所以要改一下选项

 

 

misc55

注意到图片是上下翻转的,写脚本把图片翻转回来

  1. from PIL import Image
  2. img = Image.open('misc55.png')
  3. 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出题

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/107258
推荐阅读
相关标签
  

闽ICP备14008679号