陆陆续续做了一个月的比赛也是结束了,本人水平不高,不过在这次比赛中也是学到了不少知识,在此写篇题解,为本次比赛做个总结。
MISC
1.熊博士
下载解压得到....jpg和小纸条.txt
打开图片大体没发现隐藏的信息,然后打开txt里面是
CBXGU{ORF_BV_NVR_BLF_CRZL_QQ}
猜测是某种替换密码加密,使用随波逐流工具箱一键解密(下载地址随波逐流工作室 (1o1o.xyz)),得到flag:
xyctf{liu_ye_mei_you_xiao_jj}
2.game
下载得到一张图片
直接谷歌识图,打开图片来源对应的网址,发现游戏是Papers Please,得到flag
XYCTF{Papers Please}
(在这里就不贴图了,因为博主本人登不上谷歌识图,百度识图也是没找到结果,结果反反复复尝试base36等各种编码,折磨了好久,到最后也没写出来 (ಥ㉨ಥ))
3.ez_隐写
下载得到zip,发现需要密码,用winhex打开发现是zip伪加密(伪加密知识可以百度自行学习,大部分讲的都很详细)
用winhex翻到结尾,把所有504B01021400140009000800中的09换成00(一共三个),再打开zip发现不需要密码了,解压得到hint.png和WATERMARK.zip
WATERMARK.zip需要密码且不是伪加密,猜测密码藏在hint.png中,用winhex打开,发现图片高度过大,修改高度得到正常图片
得到WATERMARK.zip密码,解压得到jpg,WATERMARK译为水印,猜测与水印有关,去网上搜索相关知识,使用WaterMake盲水印工具得到水印(一开始做的时候字很小看的时候很费眼,现在写题解重做一次发现清楚多了)
XYCTF{159-WSX-IJN-852}
4.zip神之套
解压得到zip和exe,猜测zip密码藏在exe中,双击exe发现打不开,拖到Powershell得到xyctf????????ftcyx,暴力破解得到密码xyctf20240401ftcyx
得到两个压缩包,一个加密一个未加密,加密的压缩包刚好只比未加密的压缩包多了一个flag.md,其余文件均相同,明显是采取明文碰撞,使用ARCHPR明文攻击(攻击几分钟就可以取停了),得到加密密钥
虽然没有得到口令,但是使用加密密钥就可以得到未加密的压缩包
打开flag.md即得到flag
XYCTF{1A4B8-C9D2F3E-6A4B8C-9D2F3E7F}
5.真>签到
没啥说的,winhex打开得到flag
XYCTF{59bd0e77d13c_1406b23219e_f91cf3a_153e8ea4_77508ba}
6.彩蛋?
第一段:比赛须知里发现130131103124106173164150151163137141137,随波逐流解密得到八进制转字符为XYCTF{this_a_
第二段:主页往下滑发现01串:11001101101001110111011001001011111110100111101001111101,二进制转字符发现有乱码,注意到长度为56,猜测是七个一组进行转码的,使用网站From Binary - CyberChef解密得find_it}
第三段:题目说flag不止两段,找了好久在网站中也没有找到其他特殊字符,最后猜到海报图片中有隐藏信息,下载图片并转成png(Convertio — 文件转换器),然后放kali里使用zsteg
zsteg -a poster.png
发现一行keybroad加密的字符,去网上搜keybroad解密,找到个在线网站(Will's Qwerty to Dvorak Converter (xedoloh.com))解密即得第三段flag
最终得到flag:
XYCTF{this_a_bl0ckbuster_for_png_and_i_think_yon_can_find_it}
7.Osint1
解压得到三张图片,直接百度识图第二张,找到一个小姐姐的小红书,就找到flag了哈哈哈
8.Osint2
结合图中的信息,上12306找到车次是G3293,再试试洛阳的几个有名的景点龙门石窟,洛阳博物馆,老君山等等,发现最后答案是老君山
9.Ez_osint
打开图片,使用Stegsolve.jar打开图片调一下通道,发现一个网址,登陆进去,按最新公开信筛选,大概在page=3620左右,找到信件,打开评论区就找到flag了(出题人坏事做尽,打个ctf还要猝不及防吃狗粮)
10.EZ_Base1024*2
下载出来一个txt,打开发现是奇奇怪怪的字符,结合题目猜测是base2048编码,去网上找在线网站(Encode and Decode Base2048 Online Tool | Nerdmosis),解得flag
11.出题有点烦
下载的到一个zip,检查发现不是伪加密,也没有其他信息,暴力破解得到密码123456,解压得到五张图片,第一张在winhex里发现一个错误的flag,不用管,把五张图片丢到kali里foremost一下,发现第五张分离出来一个压缩包,暴力破解,得到密码xyctf,得到flag
XYCTF{981e5_f3ca30_c841487_830f84_fb433e}
12.我的二维码为啥扫不出来?
下载解压,有一张类似二维码的图片和一段py代码,分析代码,发现是对flag.png进行了7次操作,每次抽取随机一行或列,将像素颜色反转(每十个像素一行/列)。观察图片发现第二行,第一列,第三列,第六列明显进行了反转操作,编写代码将其颜色反转
from PIL import Image
import random
def reverse_color(x):
return 0 if x == 255 else 255
def reverse_row_colors(pixels, row, width, block_size=10):
for x_block in range(width // block_size):
x = x_block * block_size
y = row * block_size
for x_small in range(x, x + block_size):
for y_small in range(y, y + block_size):
pixel = pixels[x_small, y_small]
pixels[x_small, y_small] = reverse_color(pixel)
def reverse_col_colors(pixels, col, height, block_size=10):
for y_block in range(height // block_size):
x = col * block_size
y = y_block * block_size
for x_small in range(x, x + block_size):
for y_small in range(y, y + block_size):
pixel = pixels[x_small, y_small]
pixels[x_small, y_small] = reverse_color(pixel)
original_img = Image.open("new.png")
new_img = original_img.copy()
width, height = new_img.size
pixels = new_img.load()
reverse_row_colors(pixels,1, height)
reverse_col_colors(pixels,0, height)
reverse_col_colors(pixels,2, height)
reverse_col_colors(pixels,5, height)
'''
count = 0
while count < 7:
x = random.randint(0, 1)
if x == 0:
reverse_col_colors(pixels, random.randint(0, height // 10 - 1), height)
else:
reverse_row_colors(pixels, random.randint(0, width // 10 - 1), width)
count += 1
'''
new_img.save("neww.png")
这样我们手动反转了4次,只需再操作三次,编写代码遍历求flag并对flag.png进行扫码,当扫码出结果时停止并输出
from PIL import Image
from pyzbar.pyzbar import decode
import random
def reverse_color(x):
return 0 if x == 255 else 255
def reverse_row_colors(pixels, row, width, block_size=10):
for x_block in range(width // block_size):
x = x_block * block_size
y = row * block_size
for x_small in range(x, x + block_size):
for y_small in range(y, y + block_size):
pixel = pixels[x_small, y_small]
pixels[x_small, y_small] = reverse_color(pixel)
def reverse_col_colors(pixels, col, height, block_size=10):
for y_block in range(height // block_size):
x = col * block_size
y = y_block * block_size
for x_small in range(x, x + block_size):
for y_small in range(y, y + block_size):
pixel = pixels[x_small, y_small]
pixels[x_small, y_small] = reverse_color(pixel)
def decode_qr_code(image_path):
image = Image.open(image_path)
decoded_objects = decode(image)
if decoded_objects:
return decoded_objects[0].data.decode('utf-8')
else:
return None
original_img = Image.open("new4.png")
width, height = original_img.size
pixels = original_img.load()
count = 0
while True:
modified_img = original_img.copy()
pixels_modified = modified_img.load()
for _ in range(3):
x = random.randint(0, 1)
if x == 0:
reverse_col_colors(pixels_modified, random.randint(0, height // 10 - 1), height)
else:
reverse_row_colors(pixels_modified, random.randint(0, width // 10 - 1), width)
modified_img.save("modified.png")
result = decode_qr_code("modified.png")
if result:
print("Found QR code in modified.png:", result)
break
count += 1
if count % 100 == 0:
print("Tried", count, "modifications, no QR code found yet.")
大概跑1分钟就出结果了