某60区块链安全之Storage任意地址写实战学习记录

区块链安全

文章目录

  • 区块链安全
  • Storage任意地址写实战
  • 实验目的
  • 实验环境
  • 实验工具
  • 实验原理
  • 实验内容
  • Storage任意地址写实战 实验步骤
    • 分析合约源代码漏洞
    • EXP利用

Storage任意地址写实战

实验目的

学会使用python3的web3模块
学会分析以太坊智能合约中的Storage变量存储问题
找到合约漏洞进行分析并形成利用

实验环境

Ubuntu18.04操作机

实验工具

python3

实验原理

EVM 中,有三个地方可以存储变量,分别是 Memory、Stack 和 Storage。Memory 和 Stack 是在执行期间临时生成的存储空间,主要负责运行时的数据存储,Storage 是永久存在于区块链中的变量。
EVM 对每一个智能合约维护了一个巨大的 key-value 的存储结构,用于持久化存储数据,我们称这片区域为 Storage。除了 map 映射变量和变长数组以外的所有类型变量,在 Storage 中是依次连续从 slot 0 开始排列的,一共有 2^256 个 slot,每个 slot 可以存储 32 字节的数据。Storage 存储结构是在合约创建的时候就确定好的,它取决于合约所声明状态变量,但是内容可以通过 Transaction 改变。
Storage 变量大致分为 4 种类型:定长变量、结构体、map 映射变量和变长数组。如果多个变量占用的大小小于 32 字节,按照紧密打包原则,会尽可能打包到单个 slot 中。
在以太坊 EVM 的设计思路中,所有的 Storage 变量共用一片大小为 2^256*32 字节的存储空间,没有各自的存储区域划分。Storage 空间即使很大也是有限大小,当变长数组长度很大时,考虑极端情况,如果长度达到 2^256,则可对任意 Storage 变量进行读写操作,造成未知影响。

实验内容

合约中内置了Storage变量存储问题,找到合约漏洞并形成利用,触发合约的SendFlag(address addr)事件即可
使用python3的web3模块远程利用漏洞并获取flag
实验地址为nc ip 10013

Storage任意地址写实战 实验步骤

获取合约地址和合约源代码
nc ip 10013连接到题目,输入1,获取部署合约的game account及token
1

打开http://ip,输入上述分配的game account,点击Request获取eth
某60区块链安全之Storage任意地址写实战学习记录_第1张图片

nc ip 10013连接到题目,输入2,获取部署合约的地址及new token
某60区块链安全之Storage任意地址写实战学习记录_第2张图片

nc ip 10013连接到题目,输入4,获取合约源代码,或者在题目附件找到合约源代码
某60区块链安全之Storage任意地址写实战学习记录_第3张图片

分析合约源代码漏洞

pragma solidity ^0.4.23;

contract ETH13 {
   

    address public owner;
    bytes32[] public codex;

    event SendFlag(address addr);

    constructor() public {
   
        owner = msg.sender;
    }

    function getflag() public {
   
        require

你可能感兴趣的:(区块链,安全,学习)