[TOC]

WEB

真假之间-wgb

源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<meta charset="UTF-8">
<h1>好好阅读代码,你要的flag就在代码中!;</h1>
<?php
highlight_file(__FILE__);
error_reporting(E_ALL);
ini_set('display_errors', 0);
$flag1 = 0;
$a = $_GET['a'];
$b = $_GET['b'];
if(isset($a) && strpos(base64_decode('MW82MmU3ZTYxZTQzZTk0YTE='),$a) && floatval($a) < 10000000 && floatval($a) > 6000000 && strlen($a) <= 4){
$obj = (object)$b;
if(isset($b) && strpos(strrchr(md5(sha1($obj->scalar)),'b1'),'fca7')){
$flag1 = 1;
echo "You're ok flag"."\n";
$c = isset($_GET['c']) ? $_GET['c'] : '';
$c = urldecode($c);
if (isset($c) && preg_match('/setItem\s*\(\s*[\'"](.+?)[\'"]\s*,\s*(\[.*\])\s*\)/', $c, $matches)) {
$m = $matches[1];
$n = $matches[2];
$value = json_decode($n, true);
if (json_last_error() === JSON_ERROR_NONE) {
$result = [$m, $value];
if(is_array($result[1]) && is_numeric($result[1][1]) && !is_numeric($result["0"]) && $result["0"] > 2024 ){
if($result[1][1] == "9999999999999999" && $result[1][1] !== "9999999999999999"){
$i = $result[0];
echo "<script>$c</script>";
echo "<script>
var t = window.sessionStorage.getItem('".$i."');
console.log(t)
const url = 'inc.php?flag1=".$flag1."&value=' + encodeURIComponent(t);
window.location.href = url;
</script>";
}else{
die("Emmm...");
}

}else{
die("Emmm...");;
}
} else {
die("Emmm...");;
}
} else {
die("Emmm...");;
}
} else { die("Emmm..."); }
} else { die("Emmm..."); }
?>

看这一段:

1
2
3
4
5
6
echo "<script>
var t = window.sessionStorage.getItem('".$i."');
console.log(t)
const url = 'inc.php?flag1=".$flag1."&value=' + encodeURIComponent(t);
window.location.href = url;
</script>";

最后要跳转到 /inc.php 文件,我们可以试试直接访问。

根据代码可知,在inc.php文件中,要接收两个参数,一个是flag1,一个是value

所以我们试试访问

1
/inc.php?flag1=1&value=999

image-20250913170157952

界面很干净,我们看看源码,能发现一个提示

image-20250913170227698

说明flag应该跟base85有关

我们再抓包看看,发现cookie

image-20250913170434221

看着很奇怪,我们试试把它拼接后进行base85解码

1
Ao(mgHUKl<&AbEBu<QF]NB_COH

image-20250913170716398

发现了flag字段,说明方向正确的。

然后在进行增添优化

1
Ao(mgHUKl=<&\AbEBu<QF]NB_COH

image-20250913170823049

flag{D9xT7ePqA1LuVnYk}

六件套-wgb

这道题目应该是非预期解

开启环境后直接访问 /flag.php 文件就能拿到flag

image-20250913170953192

flag{f6efe1cf-e444-4218-80c4-0ee9951510d4}

MISC

Format-8bit-wgb

下载附件解压后是一张jpg图片

image-20250913165206896

可以直接扔进随波逐流,发现里面混进了其他文件

image-20250913165351864

有一个zip文件,里面有一个422.txt

进行binwalk文件分离,得到422.txt

打开发现是乱码

image-20250913165457952

这种乱码很有可能就是编码的问题,网上找个乱码恢复的网站就可以恢复

image-20250913165633918

发现需要从UTF-8转换成GB2312,就能拿到flag

flag{2815dc1e28f9d89e2b80072d23c4dc35}

non-interlaced-wgb

拿到压缩包打开是9张图片(1.png——9.png)

先将1.png放进随波逐流发现有flag的字样

image-20250919104940282

说明在R通道,有flag相关内容。

把9张图片的R通道的80x80个字节提取出来并保存为zip文件

exp.py:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from PIL import Image
import numpy as np
import os

# 定义图片所在目录
image_dir = r"d:\competition\2025网谷杯\misc\non-interlaced-wgb\non-interlaced"

# 创建包含完整路径的图片文件列表
paths = [os.path.join(image_dir, f"{i}.png") for i in range(1, 10)]
data = bytearray()

# 处理每张图片
for p in paths:
try:
# 检查文件是否存在
if not os.path.exists(p):
print(f"文件 {p} 不存在")
continue

# 打开图片并转换为RGB模式
im = Image.open(p).convert("RGB")
# 转换为numpy数组
arr = np.array(im)
# 选择平均值最大的颜色通道
c = arr.mean(axis=(0, 1)).argmax()
# 提取该通道的所有数据
data += arr[:, :, c].tobytes()
except Exception as e:
print(f"处理图片 {p} 时出错: {e}")

# 保存提取的数据到同一目录
output_path = os.path.join(image_dir, "hidden.zip")
with open(output_path, "wb") as f:
f.write(data)

print(f"数据提取完成,已保存到{output_path}")

得到zip文件后,解压发现有个flag.jpg

image-20250919105526850

flag{1c2121cab407dd44a5540d530ab9c6aa}