2023 | Real World CTF | Blockchain
realwrap
题目¶
WETH on Ethereum is too cumbersome! I'll show you what is real Wrapped ETH by utilizing precompiled contract, it works like a charm especially when exchanging ETH in a swap pair. And most important, IT IS VERY SECURE!
nc 47.254.91.104 20000
faucet: http://47.254.91.104:8080
RPC(geth v1.10.26 with realwrap patch): http://47.254.91.104:8545
解题思路¶
- 目标是将
UniswapV2Pair
的reserve0
和reserve1
清零,即清空合约UniswapV2Pair
持有的WETH
和SimpleToken
- 合约
UniswapV2Pair
中的函数swap
在参数data
不为空时,将调用外部合约的函数uniswapV2Call
,通过参数to
控制,函数执行内容可自定义- 由于
mint
中永久锁定了一部分资金,因此合约UniswapV2Pair
的余额始终小于totalSupply
,无法通过burn
清空余额
- 由于
WETH
(Wrapped Ether,以太币操作套用ERC20
标准) 与SimpleToken
不同,合约地址是固定的,在合约Factory
中没有初始化的过程,用web3.eth.getCode
也获取不到合约的字节码- 随后意识到
WETH
是预编译合约,并注意到了文件geth_v1.10.26_precompiled.diff
- 预编译合约的调用需要通过内联汇编,不过本题对预编译合约进行了包装(
contracts.go
),因此UniswapV2Pair
中调用WETH
中函数的方式与SimpleToken
相同 -
接下来分析
contracts_weth.go
,与标准的IERC20
不同,还实现了一个transferAndCall
函数 -
transferAndCall
能够在转账的同时,以设定的数据(inputArgs.Data
)调用接收者合约1。若能让UniswapV2Pair
调用 token 的approve
函数就能够清空合约的余额 -
若在
uniswapV2Call
中直接使用transferAndCall
,调用者将为攻击者合约,因而可以通过代理调用来转换调用者 -
另外,
contracts_weth.go
中实现的approve
硬编码了状态修改的目标(realWrappedEtherAddr
)
Exploit¶
Hack.sol
exploit.js
Flag¶
rwctf{pREcOmpilEd_m4st3r_5TolE_mY_M0ney}
参考资料¶
- Precompiled Contracts and Confidential Assets | by Qtum | Qtum
- 7. Deploying to a live network | Ethereum development environment for professionals by Nomic Foundation
最后更新:
2023年1月11日 12:36:54
Contributors: