XYCTF 2024 misc&reverse部分题解

陆陆续续做了一个月的比赛也是结束了,本人水平不高,不过在这次比赛中也是学到了不少知识,在此写篇题解,为本次比赛做个总结。

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分钟就出结果了

  • 9
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值