V3D4's Blog

安全技术记录/分享/交流

0%

ctfshow-misc入门-1-30

ctfshow开始上新misc入门了,题目知识点涵盖的非常广,八神师傅tql,目前暂时出到30题,简单记录下

misc1-3

打开图片就是,其中3需要下载一个bpgviewer,百度下个就行

misc4

txt改成png就行

misc5

记事本或者010打开,文件末尾即为flag,或者strings misc5.png | grep ctfshow

misc6

记事本或者010打开,flag在文件中间,或者strings misc6.png | grep ctfshow

misc7

同上,strings misc7.jpg | grep ctfshow

misc8

同上,strings misc8.png | grep ctfshow,在photoshop:LayerName中

misc9

同上,strings misc9.png | grep ctfshow

misc 10

zlib解压最后一个idat块,代码如下

1
2
3
import zlib
s=bytes.fromhex('789C4B2E492BCEC82FAF363635363235323132494C36B34C4E3233493333313637B3B030354C4C36B734A8050009960BD1')
print(zlib.decompress(s))

misc 11

用tweakpng删掉第一个idat块即可

misc11

即大小为2931的这一块

misc12

与上题一样,也是删除idat块,慢慢尝试删除前八个的时候出了flag,最后剩下这些块

misc12

misc13

用tweakpng发现IEND块长度异常,正常来讲它的长度应该是0,但是这里为2,一开始不知道多的这个块有啥意思,尝试用zsteg得到了错误的答案,后来问了八神师傅,提示多的那两位是flag的位置,才恍然大悟,这里也加了混淆,即需要隔位取,所以不能直接strings出来

misc13-1

这里多了两位0D E1

misc13-2

到这个位置发现flag

随便写个脚本提取下

1
2
3
4
5
6
7
8
r = ''
s=bytes.fromhex('631A74B96685738668AA6F4B77B07B216114655336A5655433346578612534DD38EF66AB35103195381F628237BA6545347C3254647E373A64E465F136FA66F5341E3107321D665438F1333239E9616C7D942862E7A1CAA7248E7EB82AAC1FA193E3FF9F1300AF30882A7379F69F4920D185849313F735D185255517069EEAB9599CC7153F79B2A64DC317AA7C12312503FEFEABC8637CBECE1CDB4ED47D35D643BDB3FF7C5C1A781B7F026C7953327A7CC43E972E74B2471754C1A6E56FED38C5C80F4989933904D5A7DF2714589C964C1F5BDF9C929239ABA43BD3CA3109C059EAF30F5A23DCDC34C8DE3A9C35A0A7ABD55645BC5D3F5450D240DDB6147DFCDCFE33D27235C072BB9792BE5C8923')
for i in range(0,len(s),2):
try:
r+=chr(s[i])
except:
pass
print(r)

misc14

图片里有两个jpg,手动提取下,定位到第三个FFD8为位置直接复制到末尾保存为新图片,即为flag

misc15

记事本010或者string就有,利用的是bmp文件头部12-15位的这个偏移量

misc16

binwalk分离,flag在DD4这个文件里,具体原理还不太清楚,好像是LZMA压缩的数据?

misc17

卡了最久的一题,太难想到了,原理也不清楚,都是后来问师傅才做出来的

首先binwalk一下可以发现一个bzip2压缩包,但是无论binwalk分解还是手动分离都是损坏的,打不开,后来解没有任何思路了

misc17

问了师傅才知道,需要先用zsteg提取数据,然后再用binwalk分离,最后得到一张png即为flag

zsteg

misc17-1

至于zsteg如何分离数据而不是lsb数据,也是问了师傅才知道的

zsteg -E ‘extradata:0’ misc17.png > 17.tmp

binwalk

misc17-2

binwalk -e出来的1F1直接就是一张png图片,就是flag了

misc18

exiftool一下就出来了

misc18

misc19

同上,flag在exif信息中

misc20

同上,flag在exif信息中,还是个中文的,注意诶是a不是i

misc20

misc21

提示flag在序列号里,所以用继续用exiftool看一下,发现序列号是串hex,提示hex(X&Ys)

misc21

misc21-1

刚好exif信息里还有两组XY,分开hex再合起来就是flag(一开始合起来hex的,怎么也不对,后来问了八神师傅)

misc21-2

1
print('ctfshow{'+hex(3902939465)[2:]+hex(2371618619)[2:]+hex(1082452817)[2:]+hex(2980145261)[2:]+'}')

misc22

又是直接在strings就出来了,在photoshop:LayerName中,据八神师傅说原意不是这个,不知道原本是咋做的

misc23

给了个psd文件,提示flag在时间中,再次用exiftool看一下

misc23

发现history action一栏有提示,时间戳转hex就是flag,遂将history when一栏中的4个时间转为数字再转为hex

1
print('ctfshow{'+hex(874865822)[2:]+hex(2699237688)[2:]+hex(2156662245)[2:]+hex(460377706)[2:]+'}')

misc24

提示flag在图片上面。一般的图片藏flag都会将flag藏在图片下面,如果图片是png,只需要将高度修改即可,然而此题给的是bmp文件,像素信息直接就是在图片的hex中,所以存在将flag藏在图片上面的可能。

打开图片属性,发现图片大小是900*150,即135000个像素,而图片本身去掉文件头后应该是675000/3=225000个像素,明显多了很多,于是猜测图片高度,发现250*900刚好等于225000个像素,将图片的高度改为250后即可得到flag

即6-9位修改位FA 00 00 00即可

misc24

misc25

随便拉长png高度即可,flag在图片下面

misc26

首先拉长图片高度,发现flag确实在图片下面,但是其中两位是图片的正确高度,脚本爆破下高度即可

1
2
3
4
5
6
7
8
9
10
11
12
import os
import binascii
import struct

misc = open("misc26.png", "rb").read()

for i in range(1000000):
data = misc[12:20] + struct.pack('>i', i) + misc[24:29]
crc32 = binascii.crc32(data) & 0xffffffff
if crc32 == 0xEC9CCBC6:
print(i)
print("hex:" + hex(i)) # 转为16进制

misc27

flag在图片下面,修改jpg高度即可,也是直接搜索150的hex值的位置就行了,无论啥图片

,应该都可以在winhex里搜宽高所代表的的hex值

misc28

flag在图片下面,修改gif的高度即可,需要注意的是,gif的每一帧都有宽高所以修改的地方不止一处

misc29

同上一题,将每一帧的高度都改掉,flag在某一帧里

misc29

misc30

将宽度改为950即可