ethernuat ctf part3

--

a chain is only as strong as its weakest link

5. telephone

จาก code

โจทย์คือให้เราเปลี่ยนตัวเองเป็น owner

โอเค ถ้าเรายิง changeOwner ผ่าน contract อื่นก็ผ่านละ

จริงๆก็ดูเหมือนไม่ใช่ attack เท่าไหร่ละนะ แต่เค้าก็มีอธิบายว่าท่านี้ใช้ในการ phishing ได้

4. Token

จาก code

กำหนด initial balance คือ 20

โจทย์คือ ทำยังไงก็ได้ให้เรามี balance มากกว่า 20

โอเค ถ้าตัวแปรเป็น uint วิธีการคงจะเป็นการ underflow นี่แหละ เพราะเราต้องการเลขเยอะๆ

เช่น

จาก balance[msg.sender] = 20

ใช้คำสั่ง balance[msg.sender] -= 21

จะได้ว่า balance[msg.sender] = 2²⁵⁶

ก็ใช้ code ตามนี้ละนะ

พอผ่านแล้ว จะมีการแนะนำการใช้ safemath มาด้วยแหะ

fyi: solidity version 0.8 จะ revert ให้เองถ้ามี under/over flow

note:

จริงๆ บรรทัดนี้ค่อนข้างน่าสนใจ

require(balances[msg.sender] — _value >= 0);

เนื่องจากตัวแปรเป็น uint เราจะพบว่า

จาก require(20–21 >= 0)

จะได้ require(2²⁵⁶ >= 0)

คำถามคือ ถ้าเราเปลี่ยนข้างสมการ จะทำงานเหมือนเดิมรึเปล่า เช่น

เปลี่ยน require(balances[msg.sender] — _value >= 0);

เป็น require(balances[msg.sender] >= _value);

มาทดสอบกัน

พอเรียก one แล้วไม่ error แต่เรียก two แล้ว error แหะ

โอเค พอแค่นี้ก่อนดีกว่า ไว้มาต่อกัน

resource

--

--

No responses yet