-
-
[原创]Ethernaut智能合约代码审计题目writeup(5-9)
-
发表于: 2020-5-20 13:22 25603
-
目标:获取更多的 token
一开始是这样的,初始合约是 20,当我们转一个比 20 大的数的时候 20-_value 就会下溢
uint256 的取值范围是 [0-2^256-1],所以如果我们转 21 的话 20-21 = -1,也就是过了 0 到了 2^256-1
await contract.transfer('0x3C7f1E9B49B2f7c92e25224199d05D5Cb6923820',30)
随便找个地址转账(我把我地址最后一位改成了0)完了之后是这样的,提交就可以啦
目标:拥有所有权
我们要做的就是通过 delegatecall 来调用 pwn 函数,正如注释中说的那样,delegatecall 函数需要所用到的信息比如代码中的 msg.sender 就是这个合约的,所以只要我们构造一下 msg.data 就能够去调用 pwn 函数
当给 call 传入的第一个参数是 4 字节的时候,call 就会把这个参数作为要调用的函数,这个参数在以太坊的函数选择器的生成规则里是函数签名的 sha3 的前 4 个字节,接下来我们要做的就是触发回退函数,来执行 pwn 函数
可以使用 sendTransaction:
contract.sendTransaction({data:web3.sha3("pwn()").slice(0,10)});
slice 为提取字符串的前10个字符,四个字节,就是 10 个字符(例:0x34567890)
目标:让合约中有钱
什么代码都没有,但是有一种自毁合约的方法 selfdestruct,这种方法会把合约中剩余的钱强制转到某一个地址
在 remix 里面部署一个合约
调用 exploit 函数,自毁合约,同时把地址填成题目的合约地址
余额已经不是 0 了
这时候提交就可以啦
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
- 对某款智能手表的分析与攻击 6564
- [原创][车联网安全]使用STM32开发板实战汽车UDS诊断 15017
- [分享]binwalk路径穿越导致RCE(CVE-2022-4510) 9984
- [原创]Hack-A-Sat 2020预选赛 beckley 13588
- [原创]一个BLE智能手环的分析 31562