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 แหะ
โอเค พอแค่นี้ก่อนดีกว่า ไว้มาต่อกัน