题目预览

  • Fuzzy identity
    • 分析
    • 攻击
  • Public Key
    • 分析
    • 攻击
  • Account Takeover
    • 分析
    • 攻击

Fuzzy identity

分析

题目合约:

pragma solidity ^0.4.21;interface IName { function name() external view returns (bytes32);}contract FuzzyIdentityChallenge { bool public isComplete;function authenticate() public { require(isSmarx(msg.sender));require(isBadCode(msg.sender));isComplete = true;}function isSmarx(address addr) internal view returns (bool) { return IName(addr).name() == bytes32("smarx");}function isBadCode(address _addr) internal pure returns (bool) { bytes20 addr = bytes20(_addr);bytes20 id = hex"000000000000000000000000000000000badc0de";bytes20 mask = hex"000000000000000000000000000000000fffffff";for (uint256 i = 0; i < 34; i++) { if (addr & mask == id) { return true;}mask <<= 4;id <<= 4;}return false;}}

题目要求我们将isComplete变为true。
很明显必须调用authenticate函数,也就要饶过两个require。
第一个require要求我们满足IName函数,并且返回值为bytes32(“smarx”),很容易满足。
第二个require意思是,我们用来攻击的地址中必须存在”badc0de”这一串字符,也就很容易想到使用creat2来完成。

攻击

攻击合约:

pragma solidity ^0.4.21;import "./FuzzyIdentity.sol";contract attack{ function name() external view returns