1. 项目背景与核心挑战
"攻防世界:lottery"是一个典型的CTF(Capture The Flag)竞赛中的智能合约安全挑战项目。这类题目通常模拟真实区块链环境中的抽奖合约漏洞,要求参赛者通过代码审计和漏洞利用来获取合约中的虚拟资金。我在参与这道题目时,发现它完美复现了早期区块链项目中常见的随机数预测漏洞。
这个挑战的核心在于:一个看似公平的抽奖合约,实际上由于随机数生成机制的设计缺陷,使得攻击者能够准确预测中奖结果。这类漏洞在2018-2019年间曾导致多个真实区块链项目损失数百万美元。通过解这道题,不仅能学习Solidity安全知识,更能理解随机数在区块链环境中的特殊性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 合约代码深度解析
2.1 合约基础结构
首先我们来看合约的基础框架。这是一个典型的抽奖合约,主要包含三个关键函数:
solidity复制contract Lottery {
uint256 public prize;
address public owner;
constructor() payable {
owner = msg.sender;
prize = msg.value;
}
function guess(uint256 _guess) public payable {
require(msg.value == 1 ether);
uint256 answer = uint256(
keccak256(abi.encodePacked(blockhash(block.number - 1), block.timestamp))
);
if (_guess == answer) {
(bool sent, ) = msg.sender.call{value: prize}("");
require(sent, "Failed to send Ether");
}
}
}
2.2 漏洞关键点分析
这个合约的致命缺陷在于随机数的生成方式
