简单来说就是对最近这一两周的一个总结
这一切都要从10月25号那天说起…那天学弟们基本上都出去打线下了,所以拟态也就没人看,本来我也不准备上线了,但是突然有人call了我,说强网拟态好像有一道区块链,但是放在了Crypto里面,因此就上号瞄了一眼…
1. 万物起源——强网拟态blockchain赛题
当时一上线看到几个公共靶机链接就没绷住,至于为什么我们后面再说,但是因为咱上线比较晚,所以那个时候已经从公共靶机变为独立靶机了,结果开了靶机连上去,欸,您猜怎么着,404 Not Found
我靠当时就给我气笑了,然后看到公告有个tar包需要自己起,所以跟着公告的命令走了一遍,结果定睛一看,我靠,API可视化工具
当时我人瞬间就懵圈了,哪有区块链不给RPC给API的啊?我甚至都怀疑这是不是区块链题目了,结果一看路由前缀:WeBASE-Front,好家伙,肯定是微众那边的什么神秘东西,八成就是FISCO-BCOS了(事后也确认了就是这坨东西)
总之访问靶机域名/WeBASE-Front路由,就会自动跳转到一个节点控制台,里面包含了题目合约本身:
1 | pragma solidity ^0.4.25; |
我靠,这tm不就是Ethernaut的CoinFlip吗?!
他自己都加了个onlyEOA,但是他甚至都不愿意去修改那神秘的Nonce机制(甚至叫Nance给我看乐了),纯膈应
那说句实话真没啥好说的,就是用Web3py去计算伪随机数然后调用API就行了,真没啥东西
但是这API写的好史啊,但凡给的是RPC我就真写脚本走预期解了,所以我重新看了一下合约…
tmd你把key通过construcotr()传参保存在合约里面是何意味?我靠从上古时代开始就有的签到题现在还有**[CENSORED]**没有吸取教训说是,所以我的目标从预期解写脚本转移到了查看题目合约部署时的那次交易
虽然没有RPC能直接调用,但是节点控制台能直接搜区块信息,这不得给我气笑了?所以剩下的你们也都知道了:我直接获取了合约部署那次交易传入的合约字节码和constructor参数(也就是_key),然后直接秒杀了
从被call上线到做完,整个流程刚好30分钟,包括我下楼拿外卖上楼,赛后从某些渠道了解到这道blockchain的难度分类是困难,困难在哪我请问了,气笑了
因此在Writeup提交截止的那一个瞬间,我在B站小号上发了这个视频:锐评第八届“强网”拟态Crypto方向赛题blockchain
2. 最傻逼的出题错误——flag上链
2.1 初始素材——NewStarCTF 2025 Week 5 INTbug赛题
我印象很深刻,那天是一个周一,学弟在开新生赛的Crypto讲解会(我们刚打完校内新生赛),我在下面捧场
突然想起来自己很长一段时间没看NewStar了,所以闲来无事上线看看有没有什么题目玩玩摸个🐟,然后就看到了这道题:
1 | // SPDX-License-Identifier: MIT |
摆明了是一道整型溢出的题目,通过usePoints打整型下溢,还特地用了unchecked块,只能说不能再明显了,中规中矩的一道题
如果只是这样那也没啥,毕竟是新生赛,不可能出太难…
但是!你这家伙把flag放到合约里面上链是何意味?!你tm甚至还是扔到Ethereum Sepolia上的?!我靠我是真的没有想到都2025年了国内的区块链题目还是会有把flag明文传上去的操作出现又给我气笑了
与此同时,我想到了另一个比赛的题目:
2.1 额外素材——LilCTF 2025 生蚝的宝藏赛题
这道题目只告诉你合约的地址和部署合约的交易哈希(请记住这个信息),然后就没了,合约也不给你,让你自己搞
当时我还以为题目有问题,但是用cast能做,因此就算了,于是尝试cast code获取到了合约的字节码,然后反编译得到源码,实际上就是一个异或,flag存在一个mapping里面需要自己去cast storage获取指定存储位置的值,然后提交解密后的treasure,最后得到flag
一切都是那么的平平无奇,直到我突发奇想:你既然要检测,肯定有个明文要去比对,那么肯定会传入我们需要treasure,于是我尝试了cast rpc eth_getTransactionByHash…
tmd还真就是把treasure明文传进合约里面!直接给我气笑了,当时做完了没交(大概是领先一血半个多小时吧),然后去找LilRan师傅问给源码是不是考点的一部分,得到回复是确实是考点的一部分,那么题目大致没啥问题,除了flag上链…
好玩的是,treasure是flag的后半段
总之就单单是flag上链这个弔问题我已经在不同难度梯度,不同规模的比赛里面都见过了,这覆盖面也太广了吧?!没人说,到时候全都这么出题,然后flag上链,题目一出来就被秒杀…受着!
然后各位也就知道了,新的视频素材有了:锐评国内区块链题目出题人的一个小毛病:flag上链
3. Solution——对非预期以及如何规避非预期的讨论
那么提出了问题,不可能完全不给解决方案吧?刚好有位大哥(应该是搞过Sui链那边的CTF题目的)在flag上链的视频的评论区提出了他们的一个解决方案,当时的讨论也是给了我一些新的思考方向,所以又出了一个简单的视频讲了一下当前存在的4类区块链靶机,其架构以及一些可能存在的缺点
由于我懒得再搞一遍图了(我没保存那些图)所以这里就不再展开:胡说瞎扯——CTF区块链靶机框架的四种类型以及简单讨论
简单来说就是推荐每个人独立拥有一条私链,这样就能最大程度避免作弊行为(再有那就是跨队交流的问题了,不在本文的讨论范围内)
虽然这几个视频里面一直在强调共用一条私链可能会有风险,但是想到国内的比赛很多都是共用私链(应该用的是SolidCTF框架),所以我确实有点想打破现在的这个情况,因此我让GPT5提供了一个简单的监控脚本:
1 | #!/usr/bin/env python3 |
这还只是一个雏形,因为大部分题目有提供合约,所以我们可以自己编译手上的合约然后比对code确认challenge合约,然后存储排布也可以通过分析合约去计算,自动监控题目的解出,然后等待别人发送解题交易,就可以检测到解题的交易,并通过交易的from,to,input等字段数据判断成功解题的队伍如何解题的,进而“偷窃成果”完成“作弊”
上面的脚本只使用了常规的Ethereum JSON-RPC API方法,基本可以说是无感作弊,这也是当前环境下所有队伍共用一条链的一个潜在风险,希望指出这一点能让国内CTF中Ethereum链安全相关的题目能够更进一步
当然我也知道没啥人看我的博客和视频就是了www,总之这是最后一个视频:论区块链题目使用公共私链的潜在作弊手段:链交易监控
本人高度厌恶作弊行为,如果你们有谁用了上面的监控脚本或者我这里给的的思路想搞作弊,最后出问题了,那就受着!你tm活该,打的就是你这种出生o(*≧▽≦)ツ┏━┓
4. 后记——对强网拟态blockchain赛题官方Writeup的锐评
强网拟态的官方Writeup出来了,blockchain那题的Writeup写的一坨细碎:
- 比赛中途改了题目合约,但是Writeup里面没有修改并提及,仍旧是老版本的
onlyExternallyAccount而不是新的onlyEOA - 比较重要的伪随机数预测脚本没有写,但是可以一把梭的维吉尼亚密钥爆破脚本写了,侧重点清奇
- Solidity代码不放在代码块里面,看的让人头大
- 旧版的
onlyExternallyAccount的缺陷描述完全错误:合约一定存在字节码(就算你用了EIP-7702,你的EOA也有23个bytes的code),包括最小代理模式的代理合约也不是完全没有字节码,没有字节码的是合约部署过程中正在执行constructor()的合约,因为此时还没有将Runtime Bytecode上链 - 有关
lastNance(神tm来个Nance)防重复机制的问题,如果使用的是新版的onlyEOA,是的,它没有效果,但是如果使用的是旧版的onlyExternallyAccount,它就是有效的,因为可以在constructor()中写入重复猜硬币的操作绕过旧版的检测
考虑到出题人写Writeup的上下文,和Ethernaut第3关(CoinFlip)8成相似的代码,外加上flag上链的操作,可以知道本题的出题人压根不懂Solidity,同时还把它扔进Crypto,真的是贻笑大方
但凡来点ecrecover相关的数字签名考点呢?或者CVE-2022-40769那种虚荣地址生成器的密码学漏洞这种好玩的漏洞呢?偏偏选了个最不Crypto的考点,合约还漏洞百出…
这个我也出了视频,在锐评这道题的视频的P2(笑)
- 本文作者: 9C±Void
- 本文链接: https://cauliweak9.github.io/2025/11/07/From-Mimic-2-honoring/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!
我爹
我E神
式神
三极管全能神
Marin