某60区块链安全之Create2实战一学习记录

发布于:2024-05-31 ⋅ 阅读:(114) ⋅ 点赞:(0)

区块链安全

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,获取合约源代码,或者在题目附件找到合约源代码
在这里插入图片描述

分析合约源代码漏洞

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利用


网站公告

今日签到

点亮在社区的每一天
去签到