记录某夏令营结营CTF的write up

本文最后更新于:2023年10月2日 下午

Intro

暑假参加了某网安相关的夏令营,想着把最近手头上的事忙完了后把最后结营的CTF的Write up 写一下,现在人在高铁上也睡不着不如能写一部分是一部分吧。其实题目都是原题,就权当记录一下WP和解题过程,所以大佬就别看了- -可能有点浪费你们的时间,当然欢迎讨论。

MISC

doge

一张可爱的doge图片

这是一个misc题自然而然的想到用binwalk或hex编辑器来查看图片内容,对于这道题来说当然是一无所获,之后祭出我们的神器stegsolve,其实刚开始我自己做是没发现的,但其实这道题的结果隐藏在其他不同的通道中。

stegsolve查看其他通道的结果

这道题的来源:点击链接


教练,我想打CTF

很经典的图片

这个也是原题,网络上一堆解法,但是作为misc题也算是十分经典且难度中等了。这个题的关键是图片中有一个压缩包,将其分离解压后发现是一个可以在linux下执行的程序,将之执行即可得到flag,所以这道题的大致思路为:

相关工具的使用方法自己 -h 查看

  1. 使用 binwalk 查看图片的内容
    • 这道题我还使用相关工具查看了其16进制,没有看出来有用的讯息
  2. 使用 foremost 分离出图片的文件(binwalk也支持分离文件,看个人爱好)
  3. 以这道题为例,最重要的是将分离的压缩包进行解压得到那个程序,别的题目可能会分离出其他的东西
  4. 针对这道题为例,可以通过解压压缩包后得到可以得到flag的执行程序(记得提升权限)

队友提交flag后出错,我开始以为主办方可能修改了flag或者设置了假flag,开始考虑是不是图片长宽不够的原因。还使用了网络上的CRC检验脚本,这里也贴出来。

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

crcbp = open("flag.png", "rb").read() #打开图片
for i in range(2000):
for j in range(2000):
data = crcbp[12:16] + \
struct.pack('>i', i)+struct.pack('>i', j)+crcbp[24:29]
crc32 = binascii.crc32(data) & 0xffffffff
if(crc32 == 0x7A5A2BA): #图片当前CRC
print(i, j)
print('hex:', hex(i), hex(j))

最后发现是队友flag敲错了- -


64.0

通过强大的搜索能力,发现这道题的来源是实验吧的一道题。这道题给的文件一打开即为损坏,使用经典的二进制编辑器查看发现缺少文件头,这里添加 GIF98a ,添加完成后有两种情况,队友在010editor中添加后发现仍然打不开,我在记事本中添加后可以打开,打开后生成正确的GIF图片。

复原图片

然后可以发现是一个小黄人在 8 ✖️ 8 的棋盘上不断出现,使用工具分离出gif的每一帧,由题目可知每一个格子代表一个数字,分别从0-63,找到对应的ASCII码,然后得到flag提交,一把梭。

如图

MIMI

这道题给了一个卡农的音乐mp3文件,开始猜测是音乐的隐写题,放到AU甚至其他工具里发现不是波形的问题,寻找其他解法时找到了这个东西,这里用到了MP3stego这个工具,这个工具也有点坑,在复现的时候一定要注意路径是否正确,使用Canon作为decode密码后,完成之后可以得到一串字符,这个就是zip的密码。

解压压缩包后发现里面是类似的乱码,猜测可能是png文件,发现缺少PNG文件头,使用脚本补上。

1
2
3
4
5
6
7
8
9
10
11
12
13
import base64

def foo():
f = open(r'.\/pic_png.txt').read()
fsave = open('pic.png', 'wb')
addHeader = bytes.fromhex("89504E470D0A1A0A")
fsave.write(addHeader)
fsave.write(base64.b64decode(f))
fsave.close()

if __name__ == '__main__':
foo()
print('ok')
txt文件
flag

crypto

code

一道crypto题,但是感觉有点杂项,队友解到一半没有思路了,貌似是强网杯的一道题的思路简化版。题目给了这个文件

code.txt

不用多想,就是base64加密嘛,解谜后得到的全是1 0组合的字符文件,遂即傻眼了,如果把1看成黑,0看成白(可能正好相反),通过python脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import PIL
from PIL import Image

MAX = 256 # max尺寸 = 你文件字符数的平方根
img = Image.new("RGB",(MAX,MAX))
i = 0
str = open('./01.txt').read()

for x in range(MAX):
for y in range(MAX):
if(str[i] == '1'):
img.putpixel([x,y],(0,0,0))
else:
img.putpixel([x,y],(255,255,255))
i = i+1
img.show()
img.save("result.png")

可以生成一张二维码图,之前打CISCN的时候有一道题类似,好像是麻将题,下次可以聊聊这道题。

生成二维码后一扫就知道flag了!

后记

这篇文章从9月初拖到现在才写完,拖延症要命捏。


记录某夏令营结营CTF的write up
https://jackeyzzz12138.github.io/2023/09/01/wp00/
作者
Jackey
发布于
2023年9月1日
许可协议