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}