深入Ethernaut CTF挑战:智能合约漏洞实战解析

本文详细解析了Ethernaut CTF中六个智能合约挑战的攻防技术,涵盖回退函数滥用、构造函数误用、整数溢出、委托调用风险、强制转账和重入攻击等核心漏洞,并展示了Manticore等工具在漏洞挖掘中的实际应用。

1. Fallback

挑战描述
目标是通过回退函数机制成为合约所有者并提取资金。合约包含四个关键函数:

  • 构造函数Fallback()初始化所有者贡献值
  • contribute()允许用户贡献少量ETH(<0.001 ETH)
  • 回退函数在满足条件时(有贡献记录且附带ETH)将调用者设为所有者

技术要点
通过浏览器控制台执行:

  1. contract.contribute({value:1}) 建立贡献记录
  2. 通过MetaMask直接向合约地址转账触发回退函数
  3. contract.withdraw()提取资金

2. Fallout

漏洞本质
构造函数Fal1out()存在拼写错误(应为Fallout),导致其变为普通公开函数。任何用户调用后即可成为所有者:

1
2
3
function Fal1out() payable {
  owner = msg.sender; // 致命拼写错误
}

3. Token

整数下溢漏洞
转账函数存在无符号整数下溢:

1
2
require(balances[msg.sender] - _value >= 0); // 永远为真
balances[msg.sender] -= _value; // 输入21可触发下溢

攻击方案:contract.transfer(0x0, 21)使余额变为2^256-1

4. Delegation

委托调用风险
通过delegatecall执行Delegate合约的pwn()函数:

1
2
3
function() {
  if(delegate.delegatecall(msg.data)) { ... } // 状态空间共享
}

攻击载荷:发送包含pwn()函数签名0xdd365b8b的交易

5. Force

强制转账技术
通过自毁合约强制转账:

1
2
3
contract Selfdestruct{
  function attack(){ selfdestruct(target); }
}

关键点:自毁时ETH强制转入目标地址,无视常规转账限制

6. Re-entrancy

重入攻击模式
漏洞代码模式:

1
2
3
4
5
6
function withdraw() {
  if(balances[msg.sender] > 0) {
    msg.sender.call.value(_amount)(); // 外部调用优先于状态更新
    balances[msg.sender] -= _amount;
  }
}

攻击合约需实现恶意回退函数,在ETH回调时递归调用withdraw

工具应用

  • Manticore:符号执行检测整数溢出
  • Slither:静态分析发现构造函数误用
  • Ethersplay:可视化EVM调度器结构
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计