TGCTF 2025 - Misc - WriteUp


碎碎念

也是很开心能参加杭师大的新生赛啊,这次比赛的体验感也是非常不错,巩固知识点的同时也学到了一些新的知识点(还抢了个osint一血嘿嘿),希望以后再接再厉捏

简单签到,关注:”杭师大网安“谢谢喵🐱

知识点省流

公众号签到

WP

谜底就在谜面上

image-20250413041011562

where it is(osint) (一血)

知识点省流

图寻

知识点省流

将照片丢给谷歌,第一个就是我们要找的内容,点进去对应的页面

image-20250413041335517

发现其实是一个卖房的网站,里面有具体的地址和地图,框起来的那个港墘就是答案

image-20250413041421362

也可以在谷歌地图找一下这个具体的地址,也能找到

image-20250413041521578

next is the end

知识点省流

脚本小子

WP

解压得到一个目录,目录内还有目录,一直延伸,所以写个脚本一直读到最后的文件内容即可

import os

def find_deepest_txt_file(root_dir):
    deepest_path = ''
    max_depth = -1
    txt_file_path = ''

    for current_dir, dirs, files in os.walk(root_dir):
        depth = current_dir.count(os.sep)
        if depth > max_depth and any(f.endswith('.txt') for f in files):
            max_depth = depth
            deepest_path = current_dir
            # 只读取第一个 .txt 文件(如果有多个可以改成循环)
            for f in files:
                if f.endswith('.txt'):
                    txt_file_path = os.path.join(current_dir, f)
                    break

    if txt_file_path:
        print(f'找到的最深层 .txt 文件路径是:\n{txt_file_path}\n')
        with open(txt_file_path, 'r', encoding='utf-8') as file:
            content = file.read()
        print('文件内容如下:\n')
        print(content)
    else:
        print('没有找到 .txt 文件')

if __name__ == '__main__':
    root_dir = 'next_or_end/'  # 可修改为你的起始目录
    find_deepest_txt_file(root_dir)

最后得到

image-20250413041647471

你的运气是好是坏?

知识点省流

就跟题目意思一样 看你运气

WP

纯搞抽象,答案是114514,就是纯猜

这是啥o_o

知识点省流

gif间帧隐写+汉信码

WP

提取gif里面每张图片的间隔然后转成ascii值即可

image-20250413151233357

处理一下丢给厨子↓

image-20250413152035359

TeamGipsy&ctfer

知识点省流

简单的ubuntu取证

WP

可以先用任意取证工具读取虚拟机中的文件(这边用的ufs),可以查到root目录下的.bash_history文件中的内容,看到root用户开启了两个docker容器,且服务为mysql,不难猜到flag在容器中

image-20250413154052823

用vmware打开虚拟机,进入recovery mode中直接使用root账户的命令行(在csdn里搜搜怎么进救援模式就好),然后启动两个docker容器,进入容器中的mysql里查找数据即可

image-20250413154507834

进去后docker开启容器然后进去登mysql查表即可

image-20250413154645141

ez_zip

知识点省流

爆破+明文攻击+压缩包结构修复

WP

第一层,先直接爆破得到密码为20250412

d636e500b0c3cbc9558afd57c5c1ea5

第二层,注意到两层里都包含了一个sh512文档,那么猜测第二层里面的内容是第一层的sh512文档内容的sh512加密,加密后保存文件大小及哈希值一致,遂确定是明文攻击,用archpr进行攻击即可

image-20250413161052067

第三层,攻击成功后得到一个压缩包,但是已损坏且crc检验失败,应该是要修复一下压缩包

image-20250413161129404

经过反复确认,确定压缩包是用bandzip压缩的(正好我也是用的这个),所以自己写一个flag.txt文档,然后用bandzip压缩后,通过010逐一比对数据恢复内容即可,最后恢复出来的结构如下↓(修复的部分包括文件名字长度、压缩方式、crc等)

image-20250413164136749

修复完成后解压压缩包得到flag

image-20250413164229794

你能发现图中的秘密吗?

知识点省流

邻近像素等距隐写+lsb隐写+png图IDAT块隐写+pdf图层多通道隐写

WP

一共有三个附件

第一个附件考的是图中图——邻近像素等距隐写+lsb隐写,得到的图片中放大可以看到有很多等距排列的像素点,可以写脚本提取出里面的图片,然后用zsteg分析图片可以得到后半段flag,但因为cming师傅说有问题遂没有继续处理

第二个附件考的是lsb隐写+png图IDAT块隐写:

给的图片stegsolve看到red0通道有内容,分析得到压缩包密码

image-20250413164911504

解压得到两张图片,其中一张图片有第二段flag

image-20250413165103442

另一张图片用010分析发现最后有一个长度不正常的IDAT块,并且用zsteg可以分析出一个extradata,是zlib数据,提取出来后就是这一段IDAT块数据,

image-20250413165128686

image-20250413165152970

在其基础上拼接上png头尾,然后爆破正确宽度后得到正确的图片后找到第一段flag

# 赖智谦
# 文件创建时间:2025/1/7 23:20
import struct

file = "xxx.png"
with open(file, 'rb') as f:
    all_bin = f.read()
    for i in range(100, 2000):
        f1 = open('./qwq/'+str(i) + ".png", "wb")
        pic = all_bin[0:16] + struct.pack('>i', i) + all_bin[20:-1]  # 16到20B的内容为宽度
        f1.write(pic)
        f1.close()
        print(i)

image-20250413165303340

第三个附件考的是lsb隐写+png图IDAT块隐写+pdf文件多通道隐写:

与第二个附件大体相同,唯一不同的是压缩包中的两个png图片变成了一个png图片和一个pdf文件,将pdf文件丢进ps中,会发现里面其实有两个通道,其中一个就是flag2(把图层打开)

image-20250413164659472

qwq