ctfshow misc record

菜狗杯

misc

损坏的压缩包

考察点:文件不符改后缀

先丢到binwalk分析,发现是由png和zlib文件组成的,再丢到winhex,发现文件头 就是png的而不是zip的,那很显然要改文件后缀成.png,然后flag就在图上了,提取文字即可

迷之栅栏

考察点:010editor比较文件功能、栅栏密码

解压后发现是两张图,让我们找不同,联想到010editor有这样的功能, 丢进去,工具–比较文件: 2024-07-12-08-46-06 点最下面的差异,就可以自动定位到不同的地方 2024-07-12-08-47-01 cfhwfaab2cb4af5a5820} tso{06071f997b5bdd1a 然后题目名提示是栅栏密码,那就解密一下, 偏移量从1开始试: 2024-07-12-08-52-10

你会数数吗

考察点:010editor直方图分析

找了个wp,发现是让我们数每个字母出现的次数,利用010editor里的工具–直方图(Histogram), 倒数第二列是字符出现次数,点击一下让它倒序排列(由多到少),结果flag就出来了。。。 2024-07-12-08-57-06

你会异或吗

考察点:py脚本利用异或恢复文件

是个损坏图片,丢到010中分析,发现文件头根本不是png的,然后结合题目提示 神秘数字:0x50,题目名字又和异或有关,那就自然而然联想到分别把文件头的八个部分和0x50进行异或运算,发现最终结果就是png正确的文件头格式: 2024-07-12-09-10-43 2024-07-12-09-11-13 2024-07-12-09-11-39 2024-07-12-09-11-57 正好就是0x89504E47 那么就可以通过写python脚本,利用文件操作模块,对损坏图片文件整体进行异或运算,得到正常的png图片文件,如下:(python3)

1
2
3
4
5
f=open("misc5.png",'rb')
con=f.read() # 二进制形式。然后下面的b是int形式,要转换成bytes时,使用bytes(),且里面的内容需要加[]
with open('flag.png','wb') as nfile:
for b in con:
nfile.write(bytes([b ^ 0x50]))

最后发现flag就在恢复后的图片里: 2024-07-12-09-28-33 利用图片提取文字功能即可。

萌新

misc

隐写4

考察点:word文字隐写

打开word是图片,猜测是图片隐写,但是提示中说图片没用,那就是word隐写了 wps里,文件 –>选项 –> 视图 –>(显示)隐藏文字打勾

杂项5

考察点:段落正则匹配处理

下载txt,打开后得到以下文本:

1
2
3
小明如愿以偿的打开了压缩包,可是眼前的文字自己只能认识FBI,其他的都不认识,而且屏幕出现了一句话,你能帮小明找到这句话的意思吗?
FBI No under 18
i was always Fond of visiting new scenes, and observing strange characters and manners. even when a mere chiLd i began my travels, and made mAny tours of discovery into foreiGn {parts and unknown regions of my native City, to the frequent alarm of my parents, and The emolument of the town-crier. as i grew into boyhood, i extended the range oF my obServations. my holiday afternoons were spent in rambles about tHe surrounding cOuntry. i made myself familiar With all its places famous in history or fable. i kNew every spot where a murder or robbery had been committed, or a ghost seen. i visited the neighboring villages, and added greatly to my stock of knowledge,By noting their habits and customs, and conversing with their sages and great men.}

其实一眼望去文本就不对劲了,不符合规范英文的书写方式,比如不会出现chiLdmAnyoF这样子,很容易让人混淆,而且加上文中出现{},那么提示就很明显了,找出里面大写字母。 首先假设{前面就是FLAG,那么我们就找出{}里面的大写字母然后再来拼接,找出{CTFSHOWNB},剩下就是FLAG{CTFSHOWNB}。 不过这种办法太费劲了,有更快办法 一个是把长文复制到WORD(365)里面,使用替换功能,勾选通配符,查找内容为[a-z.,-\ ](根据文本内容发现有标点符号空格),替换为留空,直接将所有小写字母,标点符号,空格替换(删除),输出FLAG{CTFSHOWNB}。 还有一个就是利用在线正则表达式工具:https://www.mklab.cn/utils/regex 匹配规则:[A-Z{}],勾选全局匹配,复制文本到匹配结果,下面匹配组就出来了,然后到word里面替换段落标记,输出FLAG{CTFSHOWNB} 最后一个借助菜鸟教程里面的教学工具:https://www.runoob.com/try/try.php?filename=tryjsref_regexp5 替换掉文本,修改匹配规则,同样也可以得到结果。 这道题考的,我觉得是细心,经验

杂项6

考察点:压缩包zip伪加密

必要前置知识:

zip伪加密是在文件头的加密标志位做修改,进而再打开文件时识被别为加密压缩包 一个 ZIP 文件由三个部分组成:

压缩源文件数据区+压缩源文件目录区+压缩源文件目录结束标志

压缩源文件数据区: 50 4B 03 04:这是头文件标记(0x04034b50) 14 00:解压文件所需 pkware 版本 00 00:全局方式位标记(有无加密) 08 00:压缩方式 5A 7E:最后修改文件时间 F7 46:最后修改文件日期 16 B5 80 14:CRC-32校验(1480B516) 19 00 00 00:压缩后尺寸(25) 17 00 00 00:未压缩尺寸(23) 07 00:文件名长度 00 00:扩展记录长度

压缩源文件目录区: 50 4B 01 02:目录中文件文件头标记(0x02014b50) 3F 00:压缩使用的 pkware 版本 14 00:解压文件所需 pkware 版本 00 00:全局方式位标记(有无加密,这个更改这里进行伪加密,改为09 00打开就会提示有密码了) 08 00:压缩方式 5A 7E:最后修改文件时间 F7 46:最后修改文件日期 16 B5 80 14:CRC-32校验(1480B516) 19 00 00 00:压缩后尺寸(25) 17 00 00 00:未压缩尺寸(23) 07 00:文件名长度 24 00:扩展字段长度 00 00:文件注释长度 00 00:磁盘开始号 00 00:内部文件属性 20 00 00 00:外部文件属性 00 00 00 00:局部头部偏移量

压缩源文件目录结束标志: 50 4B 05 06:目录结束标记 00 00:当前磁盘编号 00 00:目录区开始磁盘编号 01 00:本磁盘上纪录总数 01 00:目录区中纪录总数 59 00 00 00:目录区尺寸大小 3E 00 00 00:目录区对第一张磁盘的偏移量 00 00:ZIP 文件注释长度 ––––––––––––––––我是分割符–––––––––––––– 先把flag.zip丢到winhex分析: 2024-07-12-09-56-11 我们看到上图,红色框的50 4B是压缩源文件数据区的头文件标记,它对应的红色框的08 00并不影响加密属性。 绿色框的50 4B是压缩源文件目录区 ,它对应的绿色框的09 00影响加密属性,当数字为奇数是为加密,为偶数时不加密。 因此我们更改标志位保存即可: 2024-07-12-10-16-38 2024-07-12-10-16-48 2024-07-12-10-16-55 2024-07-12-10-16-28 然后该位置就被修改为了08 00,然后ctrl+s保存 然后就可以打开压缩包了: 2024-07-12-10-22-03 还可以使用ZipCenOp.jar 将flag.zip和ZipCenOp.jar都放在同一文件夹 在命令行中执行以下命令: java -jar ZipCenOp.jar r flag.zip 然后直接打开压缩包查看flag.txt即可。(选择WinRAR这款加压缩软件打开)

(未完待续)杂项8

考察点:利用py脚本爆破图片分辨率

首先先查看图片尺寸,记录下来,然后丢到winhex,把记录下来的尺寸给转化成十六进制,然而修改了几次之后都发现不行,因为原图的宽高被修改破坏了,得找到准确的宽高!因此可以用python脚本爆破出来,参考如下: https://www.cnblogs.com/Flat-White/p/13515090.html 或者这个,但是不知道为什么两个都跑不出来:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# -*- coding: utf-8 -*
import struct
import binascii
import os

m = open("flag.png","rb").read()
k=0
for i in range(5000):
if k==1:
break
for j in range(5000):
c = m[12:16] + struct.pack('>i', i) + struct.pack('>i', j)+m[24:29]
crc = binascii.crc32(c) & 0xffffffff
if crc == 0x030C00AF:
k = 1
print(hex(i),hex(j))
break

misc入门

图片篇(基础操作)

misc1

2024-09-07-18-35-03