首页
社区
课程
招聘
[原创]Ethernaut智能合约代码审计题目writeup(10-14)
发表于: 2020-5-22 22:12 26687

[原创]Ethernaut智能合约代码审计题目writeup(10-14)

2020-5-22 22:12
26687


目标:拿到合约里面的所有资金

这个题老版本失败!白往里面放了那么多钱!!!

用新版本的成功了

因为他是提现完成之后才修改账户余额的,可以使用重入攻击

另外常用转币方式有三种,题目中用了第三种方法

<address>.reansfer()

发送失败时会通过 throw 回滚状态,只会传递 2300 个 gas 以供调用,从而防止重入


<address>.send()

发送失败时,返回布尔值 false,只会传递 2300 个 gas  以供调用,从而防止重入


<address>.gas().call.value()()

当发送失败时,返回布尔值 false 将传递所有可用的 gas 进行调用(可通过 gas(gas _value) 进行限制),不能有效防止重入攻击


用的是这个脚本:

部署的时候给他 1 ether,然后使用 initiateAttack 就可以啦


image.png


image.png


执行后


image.png


image.png



目标:成为 top,让变量 top 变为 true

代码:

题目声明了 Building 接口中的那个 isLastFloor 函数,我们可以自己编写

只要让他反转两次就可以啦


exp:

部署 hack 合约,然后执行 exploit 函数,就可以了,可以用 flag 查看一下

也可以在控制台查看 await contract.top()


image.png


image.png


image.png



目标:解锁需要一个 key,而这个 key 是 data[2] 是 private 的

在区块链上面没有私密的东西,都是公开的,只要找到就能过关

evm 每次处理32个字节,不足 32 字节的变量相互共享并补齐 32 字节

那么我们简单分析下题目中的变量:

bool public locked = true;  //1 字节 01

uint256 public constant ID = block.timestamp; //32 字节 常量 不写入存储

uint8 private flattening = 10; //1 字节 0a

uint8 private denomination = 255;//1 字节 ff

uint16 private awkwardness = uint16(now);//2 字节

bytes32[3] private data;


第一个32 字节就是由locked、flattening、denomination、awkwardness组成,另外由于常量 constant 是无需存储的,所以从第二个32 字节开始就是 data。前几个合起来是第一个 32,data[0] 是第二个 32,data[1] 是第三个 32,所以我们的是第四个

web3.eth.getStorageAt(instance,3,function(x,y){console.info(y);})



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2020-5-23 09:58 被kanxue编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (3)
雪    币: 377
活跃值: (14030)
能力值: ( LV13,RANK:606 )
在线值:
发帖
回帖
粉丝
2
emmm。。怎么显示不出来?
2020-5-22 22:14
0
雪    币: 47147
活跃值: (20460)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
3
yichen115 emmm。。怎么显示不出来?
问题解决,应该是编辑器安全性过滤检查,一些敏感字符串引起的。
2020-5-23 09:58
0
雪    币: 377
活跃值: (14030)
能力值: ( LV13,RANK:606 )
在线值:
发帖
回帖
粉丝
4
kanxue 问题解决,应该是编辑器安全性过滤检查,一些敏感字符串引起的。
了解了
2020-5-23 19:36
0
游客
登录 | 注册 方可回帖
返回
//