2024 | WMCTF | BlockChain
claim-guard
题目¶
We got a cheater.
nc claim-guard.wm-team.cn 1337
解题思路¶
- 合约
Chall
共有三个函数:registerBlock()
、proveWork()
和claimLastWinner()
。题目要求player
,即给定的 EOA,成为lastWinner
。需要player
在同一个块内依次调用三个函数并提供正确的工作证明 blockNonce
记录每个区块中proveWork()
成功执行的次数。只有第一个成功执行proveWork()
的账户能够调用claimLastWinner()
成为lastWinner
-
题目环境中包含一个 bot,会在每个区块调用
registerBlock()
,并监听 mempool。如果出现能够成功执行proveWork()
的交易,bot 将使用更高的 gas price 试图抢跑对应交易 -
与
proveWork()
不同,bot 发送的registerBlock()
交易的 gas price 是固定的 -
Anvil 默认按照 gas price 从高到低对交易进行排序1,同时需要保证每个账户的交易的
nonce
是有效的。在实现中采用对独立交易以 gas price 和 FIFO (ready ID) 优先排序的方式。其中,独立交易不依赖其它交易,即nonce
有效可以立即执行。非独立交易将在前置交易执行后解锁并加入到独立交易集合中TransactionsIterator
-
根据
nonce
和题目约束,proveWork()
只能在registerBlock()
之后执行,因此只需要player
以更高的 gas price 抢跑 bot 的registerBlock()
交易并完成proveWork()
即可 - 另外,由于区块的使用率几乎总是不到 50%,因此 base fee 会逐区块减少,可以以此来区分模拟执行和实际执行,设置小于当前 base fee 而大于下一区块 base fee 的 gas price,从而阻止 bot 发送
proveWork()
交易
解题脚本¶
Flag¶
WMCTF{is_m3v_this_ea5y}
最后更新:
2024年9月15日 00:36:35
Contributors: