区块链安全
Create2实战一
实验目的
学会使用python3的web3模块
学会分析以太坊智能合约Create2引发的漏洞及其利用
找到合约漏洞进行分析并形成利用
实验环境
Ubuntu18.04操作机
实验工具
python3
实验原理
君士坦丁堡硬升级中引入了一个新操作码 CREATE2 ,它使用新的方式来计算常见的合约地址,让生成的合约地址更具有可控性
在 CREATE2 以前,CREATE指令创建的合约地址是通通过交易发起者(sender)的地址以及交易序号(nonce)来计算确定的。sender 和 nonce 进行 RLP 编码,然后用 Keccak-256 进行计算
CREATE2 指令则主要是根据创建合约的初始化代码(init_code)及盐(slat)生成
实验内容
合约中内置了利用create2操作码攻击问题,找到合约漏洞并形成利用,触发合约的SendFlag(address addr)事件即可
使用python3的web3模块远程利用漏洞并获取flag
实验地址为nc ip 10011
Create2实战一 实验步骤
获取合约地址和合约源代码
nc ip 10011连接到题目,输入1,获取部署合约的game account及token
打开http://ip,输入上述分配的game account,点击Request获取eth
nc ip 10011连接到题目,输入2,获取部署合约的地址及new token
nc ip 10011连接到题目,输入4,获取合约源代码,或者在题目附件找到合约源代码
文章来源:https://www.toymoban.com/news/detail-754074.html
分析合约源代码漏洞
pragma solidity ^0.5.10;
contract ETH11 {
event SendFlag(address addr);
address public target;
function check(address _addr) public {
uint size;
assembly {
size := extcodesize(_addr) }
require(size > 0 && size <= 4);
target = _addr;
}
function execute() public {
require(target != address(0));
target.delegatecall(abi.encodeWithSignature(""));
selfdestruct(address(0));
}
function sendFlag() public payable {
require(msg.value >= 1000000000000000000000000 ether);
emit SendFlag(msg.sender);
}
}
题目要求部署一个合约,合约代码大小不超过4字节;调用 check 函数,参数是我们部署的合约地址;调用 execute 函数,执行 delegatecall 到我们部署的合约内,但是,有个问题,我们没法在4个字节内 emit SendFlag
其实题目考查知识点为 Create2 的骚操作:在同一个地址上部署合约,合约的字节码可以不同,即在同一个地址上先后可部署不同的合约
所以题目的逻辑如下面4、5、6、7、8步骤所示:
用 create2 的骚操作,部署一个合约 0x33ff ,即 selfdestruct(msg.sender)
调用 check() ,让 target 为我们部署的合约地址
给我们部署的合约发一笔空交易,让它自毁
再次使用 create2 骚操作,在同一个地址部署合约,合约内容为 emit SendFlag(0)
调用 execute() ,就会执行我们第二次部署的合约的 emit SendFlag 事件,因为是 delegatecall 操作,所以还是相当于在原题目合约中进行的 emit SendFlag 操作,成功!
EXP利用文章来源地址https://www.toymoban.com/news/detail-754074.html
到了这里,关于某60区块链安全之Create2实战一学习记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!