Dragon Slayer
题目¶
Prove yourself a true champion. Kill the mighty dragon and earn the right to call yourself a dragon slayer.
nc 34.141.16.87 30100
解题思路¶
-
目标是击败恶龙w
-
Dragon的攻击力、防御力以及血量都非常高 -
而
Knight初始只有Bronze Dagger和Wooden Shield -
购买商品需要足够的
GoldCoin,卖掉初始持有的 items 也不够购买Abyssal Whip和Dragonfire Shield,并且Shop也没有GC支付 XD -
那么,得想办法从
Bank弄点GC用 =ω=-
BankNote遵循ERC721代币标准,且mint()中调用了_safeMint() -
接下来需要想办法让
_safeMint()调用设计好的onERC721Received()。Bank中deposit()、merge()和split()使用到了BankNote.mint(),不过除Knight外,其他地址并没有GC。因而在未持有BN和GC的情况下,可通过Bank.merge()触发BankNote.mint(),其中传入数组bankNoteIdsFrom的长度为 \(0\) -
采用类似 flashloan 的方式使用
Bank.split(),使用完后deposit()再转移给bankNoteIdFrom,就能通过判断totalValue == bankNoteValues[bankNoteIdFrom]
-
Exploit¶
Flag¶
HackTM{n0w_g0_g3t_th4t_run3_pl4t3b0dy_b4af5ff9eab4b0f7}