Ethernuat CTF part 5 (vault & king)
Capture The Fun !
Problem name: Vault
goal: จาก contract จงทำให้ locked เป็น false
โอเค ถ้าเราเรียก unlock ด้วย password ก็จะทำให้ locked = false
ซึ่ง password เป็น private state
เอาละ ทีนี้การอ่านตัวแปรใดๆใน state สามารถใช้ getStorageAt ได้ แต่ต้องรู้ตำแหน่งของ state นั้นๆ
มาลองอ่าน storage กัน
จะได้
0x0000000000000000000000000000000000000000000000000000000000000001
เหมือนจะเป็นค่าตัวแปร locked
จะได้
0x412076657279207374726f6e67207365637265742070617373776f7264203a29
เหมือนจะเป็น password
จะได้
0x0000000000000000000000000000000000000000000000000000000000000000
โอเค แสดงว่าเราได้ password มาแล้ว พอลองเอาไปยิงก็ solved ละนะ
ไว้มีโอกาสมาเขียน blog zk-SNARKs กัน เอาละ ไปกันต่อเลย
Problem name: King
goal: ทำให้ instance ของ ethernaut ไม่สามารถ reclaim kingship ได้
จาก code
จะเห็นว่าการ claim kingship เราต้องจ่าย msg.value เข้าไป
เมื่อเรา claim kingship และกด submit solution
instance ethernuat จะ reclaim kingship ด้วยความเป็น owner
ซึ่งถ้า execution ไม่ revert = เราขัดขวางการ reclaim ownership ไม่ได้
ดังนั้น เราต้องทำให้ execution revert
แล้วเราจะทำให้ revert ได้ยังไงบ้าง ?
จากบรรทัด king.transfer => เรียก receive function ของ king
เราสามารถเขียน revert แทรกเข้าไปใน receive function ของ king ได้
จะได้ attack contract ดังนี้
เอาละมา deploy กัน
… ใช้ auto gas price แล้ว pending ยาวๆ เลย เหมือนจะ deploy contract ไม่ได้เลยแหะ
พอลองมาหา gasPrice ที่ควรใช้ เพื่อให้ผ่าน block gaslimit ก็พบว่าน้อยมากๆ (> 0.1 gwei) แต่พวก pending tx ใช้ gasPrice กันเยอะเลย
น่าจะ deploy ไม่ได้อีกยาวๆเลย เพราะถ้าสู้ด้วย gasPrice เท่าๆกันจะเกิน block gas limit
แปลกจัง แบบนี้ก็ deploy ไม่ได้เลยสิ … ต้องไปละ ไว้มาลองดูอีกทีกัน เผื่อเป็นที่ network มั้ง
update:
ได้คำแนะนำมาจากคุณ Huzen Karode ว่า network ยังปกติดี
พอลองมาใช้ remix เชื่อมกับ metamask ก็ผ่านฉลุยเลย เหมือนว่า hardhat setup ผมจะยังมี error อยู่บางส่วนละนะ
พอแก้ได้มีแนะนำ real world case มาด้วย
เอาละ ไว้เจอกันบทความหน้าครับ