[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
|

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

说明flag应该跟base85有关
我们再抓包看看,发现cookie

看着很奇怪,我们试试把它拼接后进行base85解码
1
| Ao(mgHUKl<&AbEBu<QF]NB_COH
|

发现了flag字段,说明方向正确的。
然后在进行增添优化
1
| Ao(mgHUKl=<&\AbEBu<QF]NB_COH
|

flag{D9xT7ePqA1LuVnYk}
六件套-wgb
这道题目应该是非预期解
开启环境后直接访问 /flag.php 文件就能拿到flag

flag{f6efe1cf-e444-4218-80c4-0ee9951510d4}
MISC
下载附件解压后是一张jpg图片

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

有一个zip文件,里面有一个422.txt
进行binwalk文件分离,得到422.txt
打开发现是乱码

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

发现需要从UTF-8转换成GB2312,就能拿到flag
flag{2815dc1e28f9d89e2b80072d23c4dc35}
non-interlaced-wgb
拿到压缩包打开是9张图片(1.png——9.png)
先将1.png放进随波逐流发现有flag的字样

说明在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

flag{1c2121cab407dd44a5540d530ab9c6aa}