BuildCTF 2024 misc部分wp
白白的真好看
考点
1、0宽隐写
2、word文件隐写
3、汉信码转二维码
4、snow隐写
解题过程
看到snow就可以猜测是snow加密了
可以发现给出的是汉信码,而不是二维码
https://tuzim.net/hxdecode/ 访问网站需要魔法
得到网址 http://weixin.qq.com/r/ekReRh7Eh0P4rVol9xFo
直接访问会一直跳转微信下载页面,这里需要生成二维码进行扫描
跳转微信公众号,异部社区
回复雪得到snowsnow,那么这个就是key了
文件打开很奇怪,从文件名也可以猜测0宽隐写
可以得到flag2:\_wh1t3\_y0u_s33
word文件直接打开没东西,使用zip打开进行查看
在document.xml文件中找到了flag1: BuildCTF{Th3_wh1t3
最后一个猜测是snow.txt,进行snow隐写解密即可
得到flag3:\_1s_n0t_wh1t3}
拼接即可得到flag
BuildCTF{Th3_wh1t3\_wh1t3\_y0u_s33\_1s_n0t_wh1t3}
老色批
考点
1、LSB隐写
2、Base64解密
解题过程
可以看到base64加密的值
如果再来一次,还会选择我吗?
考点
1、png图片修复
2、条形码修复
3、base64解密
解题过程
需要密码,看看图片
无法正常显示,用010打开看看
可以看到图片头部格式被打乱,正常应该为89504E470D0A1A0A
也就是每两个字节就逆序一下
利用puzz直接进行逆序得到图片
拿到key为: 8!67adz6
key.png被涂了,flag.zip还需要密码
需要修复条形码,这里用网上的脚本
报错不用管,已经修复好了。
找一个在线条形码识别
https://products.aspose.app/barcode/zh-hans/recognize#/recognized
得到key: wo_bu_shi_xiao_hei_zi!!!
打开flag.txt一堆base,猜测是base64,拿到CyberChef识别
大约十几层的base64吧
得到flag:BuildCTF{y0u_are_great_boy}
exp或payload
条形码修复
import cv2
import numpy as np
# 读取图像
image = cv2.imread('key.png', cv2.IMREAD_GRAYSCALE)
# 获取图像的高度和宽度
height, width = image.shape
# 遍历每一列
for col in range(width):
# 获取这一列的所有像素
column_pixels = image[:, col]
# 检查是否同时存在黑色 (0) 和白色 (255) 像素
if 0 in column_pixels:
# 如果存在黑色像素,整列涂黑
image[:, col] = 0
elif 255 in column_pixels:
# 如果只有白色像素,整列涂白
image[:, col] = 255
# 保存或显示结果图像
cv2.imwrite('output_image.png', image)
cv2.imshow('Processed Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
什么?来玩玩心算吧
解题过程
随便输入一点,出现报错,使用的是eval函数
这里使用 parselmouth: 一个自动化的 Python 沙箱逃逸 payload bypass 框架
https://github.com/Macr0phag3/parselmouth?tab=readme-ov-file
python3 parselmouth.py --payload "__import__('os').popen('cat /flag').read()" --rule "__" "." "'" '"' "\\" "/" "*" "$" "#" "@" "\!" "+" "^" "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z" "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"
打入payload
方法二
exp或payload
__import__('\157\163').system('\143\141\164\040\057\146\052')
__import__('\157\163').system('\143\141\164\040\057\146\052') # 使用全角字符来绕过
食不食油饼
考点
1、0宽隐写
2、base64编码
3、BMP图片格式
4、FFT盲水印
5、base32编码
解题过程
需要密码,查看key.txt
可以看到文本中的间隔并不正常,猜测是0宽隐写
解密base64字符串得到key:7gkjT!opo
还是需要密码,010查看key.jpg
可以发现,实际上这个是一个bmp格式的图片文件,并不是jpg
由于是单图片,尝试了宽高以后,猜测FFT盲水印
得到key: 8GMdP3
base32解密得到flag
四妹,你听我解释
考点
1、图片字符集格式
2、图片宽高修复
3、社会主义核心价值观编码
解题过程
只给了一张图片,用010打开看看
可以发现在IEND图片结尾后还有一串的数据
利用puzz尝试宽高,发现被修改过
得到后半部分: 和谐公正平等平等友善敬业法治富强和谐民主法治诚信和谐
那么前半部分呢?
将字符集改为UTF-8,底部的数据变为中文,看来就是前半部分了
前半部分:自由文明法治平等公正敬业公正友善公正公正自由自由和谐平等自由自由公正法治友善平等公正诚信文明公正民主公正诚信平等平等诚信平等法治
进行拼接得到: 自由文明法治平等公正敬业公正友善公正公正自由自由和谐平等自由自由公正法治友善平等公正诚信文明公正民主公正诚信平等平等诚信平等法治和谐公正平等平等友善敬业法治富强和谐民主法治诚信和谐
进行社会主义核心价值观编码解密
四妹?还是萍萍呢?
考点
1、二维码修复
2、zip文件修复
3、png图片修复
4、base64编码
解题过程
先拼图,拼好一个是一个公众号
在倒数第二个IDAT块能够发现疑似压缩包的内容
不过少了504B
取出添加上头部
得到密码St7wg.
发现是一个图片,保存下来
尝试修复
得到flag
一念愚即般若绝,一念智即般若生
考点
1、阴阳怪气编码
2、与佛论禅编码
3、天书加密
4、base58编码
解题过程
查看password.txt文件
阴阳怪气编码
得到密码"s2j6dg@*"
与佛论禅解密
还有一层,猜测是天书解密
一把梭看看,base58解密
Black&White
考点
1、二维码生成
2、base45编码
解题过程
里面全是黑白块,并且是1089张图片,正好是平方数,猜测是33\*33的二维码
写脚本生成二维码
进行识别
得到内容:3I8XEDHUCJTARQFOEDX7D+08AC80T8N08Y6948DF2C43C9B6Z2
base45解码
exp或payload
from PIL import Image
import numpy as np
import os
# 图片的文件夹路径
folder_path = 'src' # 替换为实际路径
# 读取图片并存储在列表中
images = []
for i in range(1089):
img_path = os.path.join(folder_path, f'{i}.jpg') # 读取从 0.jpg 到 1088.jpg
img = Image.open(img_path)
images.append(img)
# 确保图片是相同的大小
img_width, img_height = images[0].size
# 创建一个新的大图像
final_image = Image.new('RGB', (33 * img_width, 33 * img_height))
# 按顺序拼接图片
for idx, img in enumerate(images):
row = idx // 33
col = idx % 33
final_image.paste(img, (col * img_width, row * img_height))
# 保存最终拼接的大图像
final_image.save('final_image.png')
E2_?_21P
考点
1、zip修复
2、Brainfuck编码
解题过程
尝试伪加密后,解压爆CRC错误
将头部的01 00 00 00 改为 01 00 08 00
将09改为00去除伪加密
进行解压
Brainfuck编码
EZ_ZIP
考点
1、jpg、zip图片格式识别
2、遍历解压zip
3、zip伪加密
解题过程
解压得到二维码,进行识别,扫描是跳转到公众号,那么就不是二维码内容的问题了,而是这个jpg文件中隐藏了东西,用010打开
可以看到在FFD9也就是jpg图片结束后底部跟着存放了一个zip文件
取出后发现存在压缩包嵌套,写脚本进行循环解压
得到flaggggggg.zip文件,需要密码
但是没给任何有关于密码的提示,猜测伪加密
打开文件查看
成功拿到flag
exp或payload
解压脚本
import os
import zipfile
def unzip_all_folders(root_folder):
all_done = False
while not all_done:
found_zip = False
for foldername, subfolders, filenames in os.walk(root_folder):
for filename in filenames:
if filename.endswith('.zip'):
found_zip = True
zip_file_path = os.path.join(foldername, filename)
with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
zip_ref.extractall(foldername)
os.remove(zip_file_path)
if not found_zip:
all_done = True
root_folder = r'目录绝对路径'
unzip_all_folders(root_folder)
Guesscoin
解题过程
猜正反面,%50的概率,100次才对50次以上就给flag
exp或payload
from pwn import *
res = []
io = remote("27.25.151.80",44959)
welcome = io.recvuntil(': ').decode()
print(welcome)
for i in range(0,100):
try:
io.sendline(b'0')
data = io.recv().decode()
print(data)
if "猜错了" in data:
io.sendline(b'1')
data = io.recv().decode()
print(data)
res.append("1")
else:
res.append("0")
except:
print(res)
break
HEX的秘密
解题过程
每个16进制位转10进制减去128,再转字符串即可
exp或payload
def process_hex(hex_string):
result = ""
for i in range(0, len(hex_string), 2):
two_digits = hex_string[i:i + 2]
decimal_value = int(two_digits, 16) - 128
char = chr(decimal_value)
result += char
return result
print(process_hex("c2f5e9ece4c3d4c6fbb3c5fafadfc1b5e3a1a1dfe2e9eee1f2f9f9f9fd"))
what is this?
解题过程
打开看到010猜测二进制转字符串
发现类似莫斯密码格式的字符
尝试进行替换,将c替换为'.' , p替换为'-', ’,‘替换为空格
包裹上flag进行提交
BuildCTF{S0_TH1S_15_M0R5E_C0DE_!!}