Tokenbank


文档摘要

Token bank 题目描述 原题链接 原题目要求 TokenBankChallenge 合约的 token balance 为 0。 运行 安装 Foundry 根据 Foundry 官方文档配置好运行环境。 运行测试 功能简述 为了能够复现 Challenge,在不改变原题意下,将 TokenBankChallenge 里面的withdraw 某行增加 unchecked。 解决思路是 withdraw 里面的 balanceOf 的减少是在 transfer 之后,因此我们可以 re-entrancy,在 transfer 的时候转多笔。

Token bank

题目描述

原题链接

原题目要求 TokenBankChallenge 合约的 token balance 为 0。

运行

安装 Foundry

根据 Foundry 官方文档配置好运行环境。

运行测试

$ cd WTF-CTF $ forge test -C src/Capture_the_Ether/Miscellaneous/Token_bank -vvv

功能简述

为了能够复现 Challenge,在不改变原题意下,将 TokenBankChallenge 里面的withdraw 某行增加 unchecked。

解决思路是 withdraw 里面的 balanceOf 的减少是在 transfer 之后,因此我们可以 re-entrancy,在 transfer 的时候转多笔。

require(token.transfer(msg.sender, amount)); unchecked { balanceOf[msg.sender] -= amount; }

新建一个 Attacker 合约,作为 Player,先从 TokenBankChallenge 里面提取 token,然后转给 Attacker。

Player 调用 Attacker 的 deposit,再把 token 从 Attacker 存入 TokenBankChallenge。

Player 调用 Attacker 的 withdraw,将 token 转给自己,然后 token 会调用 Attacker 的 tokenFallback,我们在这里再次调用 TokenBankChallenge 的 withdraw。即可将 TokenBankChallenge 的 token 余额转走。


作者与出处
原作者: WTFAcademy
来源:WTFAcademy
许可证:MIT
整理: 灏天文库整理
由灏天文库结构化整理,提供目录导航、全文检索与在线阅读,便于系统化学习
发布者: 作者: WTFAcademy 转发
评论区 (0)
U