Ethernuat CTF part 5 (vault & king)

Nattawat Songsom
3 min readNov 6, 2022

--

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 มาด้วย

เอาละ ไว้เจอกันบทความหน้าครับ

--

--

No responses yet