前言

近年来,各个大型CTF(Capture The Flag,中文一样平常译作夺旗赛,在网络安全领域中指的是网络安全手艺人员之间举行手艺竞技的一种竞赛形式)竞赛中都有了区块链攻防的身影,而且泛起的问题绝大多数都是区块链智能合约攻防。此系列文章我们主要以智能合约攻防为中央,来剖析智能合约攻防的要点,前两篇我们分享了合约反编译,反汇编的基础内容。后续的文章中,我们会继续分享CTF竞赛中智能合约常见题型(重入,整数溢出,空投,随机数可控等)及解题思绪,信赖会给读者带来不一样的收获。

上篇文章中我们分享了CTF竞赛中常考的重入破绽题型,本篇继续来分享CTF竞赛中的整数溢出题型,也是对照常见的一类题型,固然多数CTF智能合约问题并不仅仅考察单个破绽的攻防,可能涉及多个破绽的组合。

本篇我们以2018年WCTF上BelluminarBank问题为例,给人人分享智能合约整数溢出的题型。解出这道题不仅需要整数溢出攻击,也需用到变量笼罩,权限设置等多个攻击技巧。

问题地址:

由于WCTF智能合约竞赛没有在以太坊测试网(ropsten)举行,没有在线的攻防场景,合约详细问题先容及合约源码已在GitHub给出:https://github.com/beched/ctf/tree/master/2018/wctf-belluminar

问题剖析

问题提醒

团队需要对字节码举行反向工程,并使用以下攻击:

,

Allbet代理

欢迎进入Allbet代理(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

,
  • 整数溢出绕过存款限期限制;

  • 存储溢出以笼罩银行所有者;

  • 存储接见权限以泄露私有属性;

  • 部署自杀条约以强制将eth发送到目的条约(以解决余额差异)

不一定需要意外的以太攻击,若是使用withdraw()和invest()挪用,则可以适当平衡。可能是由于导致错误解决方案的伟大错误所致:withdraw()函数不会更改balances数组。然则仍然需要事先行使整数溢出。

合约说明

Belluminar Bank异常小而稀奇。其工作方式如下:

  • 任何人都可以投资任何金额,并应指定存款限期(在此之前存款将被锁定);
  • 存款限期必须比先前客户的存款限期至少长1年;
  • 每个存款分配一个账号;
  • 帐户0包罗31337 wei,由银行所有者(条约创建者)锁定多年;
  • 存款限期满一年(若是您不提款),银行所有者可以没收您的存款。

目的是破解这家银行并清空其余额。若是乐成,该机器人将向您发送买卖数据中的标志。

合约源码
pragma solidity ^0.4.23;

contract BelluminarBank {
    struct Investment {
        uint256 amount;
        uint256 deposit_term;
        address owner;
    }
    //全局变量
    Investment[] balances;
    uint256 head;
    address private owner;
    bytes16 private secret;  //secret可读取

    function BelluminarBank(bytes16 _secret, uint256 deposit_term) public {
        secret = _secret;
        owner = msg.sender;
        if(msg.value > 0) {
            balances.push(Investment(msg.value, deposit_term, msg.sender));
        }
    }

    function bankBalance() public view returns (uint256) {
        return address(this).balance;
    }

    //局部变量笼罩全局变量
    function invest(uint256 account, uint256 deposit_term) public payable {
        if (account >= head && account < balances.length) {
            Investment storage investment = balances[account];
            investment.amount += msg.value;
        } else {
            if(balances.length > 0) {
            //存在整数溢出
                require(deposit_term >= balances[balances.length - 1].deposit_term + 1 years);
            }
            //局部变量
            investment.amount = msg.value;
            investment.deposit_term = deposit_term;
            investment.owner = msg.sender;
            balances.push(investment);
登录并阅读全文 usdt跑分网声明:该文看法仅代表作者自己,与本平台无关。转载请注明:usdt支付接口(www.caibao.it):零时科技丨CTF技术宝典之智能合约#整数溢出破绽
发布评论

分享到:

七台河二手房网:2019台风白鹿将正面打击广东 将有大暴雨和大风
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。