web
ezphp
<?php
highlight_file(__FILE__);
if(isset($_POST['v1_snert.com']) && isset($_POST['v2_snert.com'])){
$v1 = $_POST['v1_snert.com'];
$v2 = $_POST['v2_snert.com'];
if(sha1($v1)==sha1($v2) && $v1!=$v2){
$p=$_GET['p'];
if(!preg_match('/^ctf$/im',$p)){
die("nono");
}
if(preg_match('/^ctf$/i',$p)){
die("nono");
}
echo "good";
if($_COOKIE['user']=="admin"){
if(isset($_GET['flag'])||isset($_POST['flag'])){
die("nonono");
}
@parse_str($_SERVER['QUERY_STRING']);
extract($_POST);
$c=$_GET['c'];
if($flag==666) {
if(!preg_match('/[0-9]|[a-z]/i',$c)){
eval($c);
}
}
}
}
}
?>
首先第一个考察的点是POST传参。在php中变量名只有数字字母下划线,被get或者post传入的变量名,如果含有空格、+、[则会被转化为_, 但php中有个特性就是如果传入[,它被转化为_之后,后面的字符就会被保留下来不会被替换 。然后就是两个变量的sha1值相等,但两个变量不相等,这里不能用数组绕过,使用两个sha1值为0e开头的即可,0e开头会被当成0。
下面两个preg_match,一个是多行匹配,一个整个字符串进行匹配,使用%0a(换行的URL编码)。
在cookie设置user=admin,传参_POST[flag]=666,经过parse_str($_SERVER['QUERY_STRING'])处理,将URL查询字符串(如 ?a=1&b=2)解析为全局变量,会变成$_POST[flag]=666,再经过extract($_POST)将 $_POST 数组中的键值对转换为变量,可使$_PSOT[flag]转换成$flag。
最后就是一个无字母无数字的rce,异或、取反都可以。


signin
纯签到,file伪协议直接读即可。

ezupload
前端校验,传png后缀,抓包改为php,已经测试可以发现过滤了php、eval、system等函数。使用短标签绕过。也是送分题,ai也能问出来。

misc
JUST_SO_SO
打开压缩包是一个png和一个txt,坤坤的图片明显可以感觉到宽高被修改了,将宽高恢复发现其上的interesting,txt里内容是2进制,2进制转字符发现是zip压缩包

zip中有两个文件,其中haha.txt没有加密,而坐标.txt是加密的,将haha.txt拿出来,可以发现有隐藏字符,使用snow解密,而解密密码是刚刚的interesting,得到的就是压缩包的密码。


打开压缩包,将坐标.txt中的点在直角坐标系中表示出来,就可以得到flag。

pixel
打开是一张图片,首先可以分离出私钥文件,图片上只有黑、红、蓝、绿四种颜色,明显是4进制,黑0,红1,蓝2,绿3,把这些值提取出来转换成字符串,是一串base64,,将其转换为图片

这张照片只有黑白,黑0,白1,将值提取出来转换成字符串,这个字符串就是密文,利用最开始分离出来的密钥进行解密。

你要的flag全拿走
真送分题。打开压缩包可以看到注释的字符,解base64。

得到解密密码。使用MP3Stego解密即可。得到flag{90ba414e7dc2ea5adc7b0e836e9de76d}


套娃压缩包
首先是一个名字叫hash.zip的加密压缩包,hash这个名字已经在提示利用hash值去爆破压缩包密码。

解压缩以后,里面是一个key.txt和一个压缩包。通过循环解压缩,得到压缩包最里面是个hint.txt,宫水三叶是“你的名字”里在主人公,将刚刚那些压缩包的名字拼接起来,解base64可以得到一个压缩包,里面是flag.txt,先解base64然后sm4解密。


hbase
打开txt看到好几百行16进制字符串,每行都是32个字符,将前几行放cmd5网站上尝试解密,可以发现每行都是单个字符MD5后的结果。


写脚本,对每行MD5值进行爆破,得到很长一串base编码的内容,对该结果进解10次base64,即可得到flag{4ed2b09cf41c5a353d42ec5adfa1122b}

import hashlib
import string
def brute_force_md5(md5_hash, max_length=5):
# 定义可能的字符集合:所有可打印字符(包括字母、大写字母、数字、符号和空格)
possible_chars = string.printable.strip() # .strip() 去掉换行符和空格
for length in range(1, max_length + 1):
for guess in generate_combinations(possible_chars, length):
guess_hash = hashlib.md5(guess.encode()).hexdigest()
if guess_hash == md5_hash:
return guess
return None
def generate_combinations(chars, length):
if length == 1:
for char in chars:
yield char
else:
for char in chars:
for combination in generate_combinations(chars, length - 1):
yield char + combination
def read_hashes_from_file(file_path):
with open(file_path, 'r') as file:
return file.read().splitlines()
# 读取密文文件,假设文件路径为 'hashes.txt'
hashes_file = 'output.txt'
md5_hashes = read_hashes_from_file(hashes_file)
ms=""
# 对每个 md5 密文进行暴力破解
for md5_hash in md5_hashes:
print(f"正在破解哈希:{md5_hash}")
result = brute_force_md5(md5_hash, max_length=5)
if result:
print(f"找到匹配的明文: {result}")
ms=ms+result
else:
print("没有找到匹配的明文。")
print(ms)
重要文件
打开是一个word文档,算是misc签到题吧,flag就隐藏在各处。



只有最后这一部分有一点点不好找,将右图保存下来,然后提取水印。把这些拼接起来就是完整的flag{7a57580b8b51bfcb6c9de4410e3dc5f0}


1235

被折叠的 条评论
为什么被折叠?



