´ÓsolidityÓïÑÔÌØÐÔÉî¶È½â¶ÁÒÔÌ«·»ÖÇÄܺÏԼ©¶´Ô­ÀíºÍ¹¥»÷ÀûÓÃ

Ðû²¼Ê±¼ä 2018-08-02
1 ¸ÅÊö

        Ëæ×ÅÇø¿éÁ´¡¢ÒÔÌ«·»¼¼ÊõµÄÐËÆðºÍ²»Í£³ÉÊ죬Äþ¾²ÎÊÌâÒ²ËæÖ®¶øÀ´£¬½ñÄêÖÇÄܺÏԼ©¶´ÒѾ­Èöà¸öÇø¿éÁ´ÏîÄ¿¼Ûֵ˲¼ä¹éÁã¡£ÖÇÄܺÏÔ¼µÄ¿ª·¢ÓïÑÔ¡¢Éè¼Æģʽ¡¢ÔËÐлúÖƶ¼Ó봫ͳӦÓÃÓнϴó²îÒ죬Ëü¼ÈÓд«Í³µÄÄþ¾²·çÏÕ(ÈçÕûÊýÒç³öµÈ)£¬ÓÖÓÐÆæÌصÄÐÂÐÍ·çÏÕ(Èç˽ÓбäÁ¿²»¡°Ë½ÓС±ºÍÌØÊâÀàÐͱäÁ¿ÁýÕÖµÈ)¡£Ñз¢ÈËÔ±Èç¹û²»ÄÜÉî¿ÌÀí½âÕâЩºËÐÄÔ­Àí£¬ÔòºÜÈÝÒ×±àд³ö´æÔÚ©¶´µÄÖÇÄܺÏÔ¼£»¶ñÒâºÏÔ¼Ò²¿ÉÒÔͨ¹ýÕâÖÖÒªÁìÁôÏÂÒþ±Î©¶´£¬ÆÛÆ­ºÏԼͶ×ÊÈ˲¢°µµØÀïÊո±¾ÎÄÒÔWCTF2018µÄÒ»µÀÖÇÄܺÏԼ©¶´ÈüÌâ[1]ΪÀý£¬´ÓsolidityÓïÑÔÌØÐÔ³ö·¢£¬Éî¶È½â¶ÁÒÔÌ«·»ÖÇÄܺÏԼ©¶´Ô­ÀíºÍ¹¥»÷ÀûÓá£

2 ©¶´ºÏÔ¼·ÖÎö

        ¸ÃºÏÔ¼ÊÇÒ»¸öÒøÐÐÀàºÏÔ¼£¬Óû§¿ÉÒÔ´æÈëethµ½¸ÃºÏÔ¼£¬²¢ÔÚ´æÈëµ½ÆÚÖ®ºóÈ¡³ö¡£Ô­Ìâ¶Ô¸ÃºÏÔ¼ÃèÊöÈçÏ£º

¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾

        ¸ÃºÏÔ¼ÖдæÔÚ©¶´£¬¹¥»÷ÕßÀûÓ鶴¿ÉÒÔ͵ȡºÏÔ¼ÖеÄËùÓÐÓà¶î¡£Â©¶´Éæ¼°µ½ÕûÊýÒç³ö¡¢±äÁ¿ÁýÕÖÒÔ¼°ÓɱäÁ¿ÁýÕÖµ¼ÖµıäÁ¿Ï໥ӰÏì¡£

        ºÏÔ¼Ô´ÂëÈçÏ£º

¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾

        ÒªÌáÈ¡ºÏÔ¼µÄÈ«²¿ºÏÔ¼Óà¶î£¬confiscate º¯ÊýÊÇÒªº¦£¬µ«¸Ãº¯Êýµ÷ÓÃÀֳɱØÐëÂú×㣺

        ? msg.sender == owner

        ? secret == _secret

        ? now >= balances[account].deposit_term + 1 years

        ¹¥»÷Õß¿ÉÒÔͨ¹ýºÏÔ¼´æ´¢·ÃÎÊ¡¢ÕûÊýÒç³öºÍ±äÁ¿ÁýÕÖÀ´ÒÀ´Î½á¹¹ÉÏÊöÌõ¼þ¡£

2.1 solidityÈ«¾Ö±äÁ¿´æ´¢

        ÔÚBelluminarBankºÏÔ¼ÖУ¬Ò»¹²ÓÐ4¸öÈ«¾Ö±äÁ¿£¬·Ö±ðÊÇbalances¡¢head¡¢owner¡¢secrete¡£ËüÃǵÄĬÈÏ·ÃÎÊÊôÐÔÊÇprivate£¬¿´ÉÏÈ¥Ö»ÓкÏÔ¼×Ô¼ºÄܹ»·ÃÎÊÕâЩ±äÁ¿¡£ÊÂʵÉÏ£¬ºÏÔ¼µÄËùÓбäÁ¿Êý¾Ý¶¼ÊǹûÈ»´æ´¢ÔÚÁ´ÉϵÄÇø¿éÖУ¬ÈκÎÈ˶¼¿ÉÒÔͨ¹ý·ÃÎÊ´æ´¢Êý¾ÝÀ´»ñµÃÕâЩ±äÁ¿µÄÖµ[2]¡£ÔÚsolidityÓïÑÔÖУ¬È«¾Ö±äÁ¿¶¼´æ´¢ÔÚstorageÖУ¬Æ¾¾ÝsolidityµÄ±äÁ¿´æ´¢¹æÔò£¬¶¨³¤µÄ±äÁ¿ÔÚstorageÖÐÊÇ˳Ðò´æ´¢µÄ£¬Êý×é±äÁ¿ÔÚstorageÖÐÆäË÷ÒýλÖôæ·ÅµÄÊÇÆäÊý×鳤¶È£¨²Î¼û[3]£©¡£¸ÃºÏÔ¼storageÖеıäÁ¿´æ´¢½á¹¹ÈçÏ£º

¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


        ¶ÔÓÚÔÚ¹«Á´²¿ÊðµÄºÏÔ¼£¬¿Éͨ¹ýÒÔÌ«·»web3½Ó¿Úweb3.eth.getStorageAt(co ntractAddress, index)»ñȡij¸öºÏÔ¼Ö¸¶¨storageË÷ÒýµÄÊý¾Ý¡£

        Òò´Ë£¬secrete²¢²»ÊÇÒ»¸ö²»ÐлñÈ¡µÄ˽ÓÐÊý¾Ý£¬¹¥»÷ÕßÖ»ÐèÒª·ÃÎʸúÏÔ¼storageÖеÄÊý¾Ý¾Í¿ÉÒԽṹconfiscate º¯ÊýµÄsecret == _secretÌõ¼þ¡£

2.2 solidityÈ«¾Ö±äÁ¿ÁýÕÖ

        BelluminarBankºÏÔ¼ÖеÄconfiscateº¯ÊýÒªÇóµ÷ÓÃÕß±ØÐëÊǺÏÔ¼ÓµÓÐÕ߲ſÉÒÔ½øÐÐÓà¶îÌáÈ¡²Ù×÷£¬¿´ÉÏÈ¥¹¥»÷ÕßÊÇÎÞ·¨ÌáÈ¡µÄ¡£È»¶ø£¬ÓÉÓÚsolidityÓïÑԵľֲ¿±äÁ¿´æ´¢ÌØÐÔ£¬µ¼Ö±¾ºÏÔ¼µÄowner±äÁ¿¿ÉÒÔ±»Ð޸ģ¬ÁýÕÖÎÊÌâ·ºÆðÔÚ invest º¯ÊýÖС£

        Ê×ÏÈÀ´¿´solidity¾Ö²¿±äÁ¿ÁýÕÖÈ«¾ÖstorageµÄÎÊÌâ¡£solidityÓïÑԵıäÁ¿´æ´¢ÓÐÒ»¸öÌØÐÔ£¬¼´Êý×é¡¢Ó³Éä¡¢½á¹¹ÌåÀàÐ͵ľֲ¿±äÁ¿Ä¬ÈÏÊÇÒýÓúÏÔ¼µÄstorage [4]£¬¶øÈ«¾Ö±äÁ¿Ä¬ÈÏ´æ´¢ÔÚstorageÖС£Òò´Ë£¬Èç¹ûÕâЩ¾Ö²¿±äÁ¿Î´±»³õʼ»¯£¬ÔòËüÃǽ«Ö±½ÓÖ¸Ïòstorage£¬ÐÞ¸ÄÕâЩ±äÁ¿¾ÍÊÇÔÚÐÞ¸ÄÈ«¾Ö±äÁ¿¡£

        ÒÔÈçϵļòµ¥ºÏÔ¼testΪÀý£¬º¯Êýtest1Öнç˵ÁËÒ»¸ö¾Ö²¿½á¹¹Ìå±äÁ¿x£¬µ«ÊÇûÓжÔÆä½øÐгõʼ»¯¡£Æ¾¾ÝsolidityµÄ±äÁ¿´æ´¢¹æÔò£¬ÕâʱºòxÊÇ´æ´¢ÔÚstorageÖеÄ£¬¶øÇÒÊÇ´ÓË÷Òý0¿ªÊ¼£¬ÄÇô¶ÔÆä³ÉÔ±±äÁ¿x,y¸³ÖµÖ®ºó£¬Ç¡ºÃÁýÕÖÁËÈ«¾Ö±äÁ¿aºÍb¡£ÓÐÐËȤ¿ÉÒÔÔÚ remix ÖÐÔÚÏ߶Ա¾ºÏÔ¼½øÐе÷ÊÔ¡£

pragma solidity 0.4.24;

contract test {

    struct aa{

        uint x;

        uint y;

    }

    uint public a = 4;

    uint public b = 6;

    function test1() returns (uint){

        aa x;

        x.x = 9;

        x.y = 7;

    }

}

        ÔÚinvestº¯ÊýµÄelse·ÖÖ§ÖУ¬Ê¹ÓÃÁËÒ»¸ö¾Ö²¿½á¹¹±äÁ¿investment¡£¸Ã¾Ö²¿±äÁ¿ÔÚµ±Ç°Ö´ÐзÖÖ§Öв¢Ã»Óб»³õʼ»¯£¬Ä¬ÈÏÖ¸ÏòºÏÔ¼µÄstorage¡£Ö´ÐÐÖжԸñäÁ¿µÄ³ÉÔ±¸³Öµ¾Í»áÖ±½ÓÁýÕÖÈ«¾Ö±äÁ¿£¬ÁýÕÖ¹ØϵΪ£º

¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾

        ͬʱ£¬ÔÚ±äÁ¿ÁýÕÖ֮ǰ±ØÐëÂú×ãÈçÏÂÌõ¼þ£¬¼´´æ¿îÆÚÏÞÊÇ×îÄ©Ò»¸ö´æ¿î¼Ç¼µÄÆÚÏÞºóÒ»Ä꣺deposit_term >= balances[balances.length - 1].deposit_term + 1 years¡£ÓÉÓÚdeposit_termÊÇÓû§ÌṩµÄ£¬ÇáËɾͿÉÒÔÂú×ã¡£

        ËùÒÔ£¬Í¨¹ý¾«ÐĽṹinvestº¯ÊýµÄ²ÎÊý¾Í¿ÉÒÔÁýÕÖstroageÖеÄsender£¬´Ó¶ø¸Ä±ä¸ÃºÏÔ¼µÄÓµÓÐÕßΪ¹¥»÷Õߣ¬Í»ÆÆconfiscate º¯ÊýµÄmsg.sender == ownerÏÞÖÆ¡£

2.3 ÕûÊýÒç³ö

        ÔÚBelluminarBankºÏÔ¼Ô´ÂëµÄconfiscateº¯Êý»¹ÓÐÁíÍâÒ»¸öÈçϵÄʱ¼äÏÞÖÆ£¬¼´±ØÐëÔÚ´æ¿îÂúÒ»Äêºó²ÅÆøÌáÈ¡£¬now >= balances[account].deposit_term + 1 years¡£

        ÉÏÒ»½ÚÓÃÓÚÈ«¾Ö±äÁ¿ÁýÕֵĴæ¿î²Ù×÷ʹµÃbalancesÖÐ×îÄ©Ò»¸ö´æ´¢¼Ç¼µÄÆÚÏÞÒѾ­ÊÇ1Äêºó£¬¼´¹¥»÷ÕßÖÁÉÙÔÚ2Äêºó²ÅÆøµ÷ÓÃconfiscateº¯Êý½øÐÐÌá¿î¡£Óë´Ëͬʱ£¬deposit_termÔÚ¸³Öµ¸ø¾Ö²¿±äÁ¿µÄʱºò»á°ÑÈ«¾Ö±äÁ¿headÁýÕÖΪ³¬´óµÄÊý£¬ÕâҲʹµÃºóÐøµÄfor (uint256 i = head; i <= account; i++)Ñ­»·´¦ÖÃÎÞ·¨ÌáÈ¡È«²¿µÄ´æ¿î£¬ÒòΪhead²»Îª0¡£

        ÏÔÈ»£¬±ØÐë°ÑheadÁýÕÖΪ0²ÅÆøÌáÈ¡È«²¿µÄ´æ¿î£¬¼´investº¯ÊýµÄdeposit_term²ÎÊý±ØÐëΪ0¡£µ«Èç¹û¸Ã²ÎÊýΪ0£¬ÓÖÎÞ·¨Âú×ãinvestº¯ÊýµÄÈ«¾Ö±äÁ¿ÁýÕÖÖ´ÐеÄÌõ¼þdeposit_term >= balances[balances.length - 1].deposit_term + 1 years¡£

        ×Ðϸ·ÖÎö¿É·¢ÏÖ£¬Èç¹ûbalances[balances.length - 1].deposit_term+ 1 yearsÇ¡ºÃ¼´ÊÇ0£¬ÔòÉÏÊöµÄÌõ¼þºãΪÕæ¡£ÏÔÈ»£¬balances[balances.length - 1].deposit_termֻҪȡֵΪ(uint256_max ¨C 1 years + 1)£¬¾Í»áµ¼ÖÂÏà¼ÓºóµÄֵΪuint256_max+1¡£Õâ¸ö½á¹û»áÁè¼Ýuint256µÄ±í´ï¿Õ¼ä£¬·¢ÉúÒç³öµ¼ÖÂ×îºóµÄֵΪ0¡£

        Òò´Ë£¬¹¥»÷ÕßÏÈ×öµÚÒ»´Î´æ¿î£¬°Ñbalances×îºóÒ»ÏîµÄdeposit_termÉèÖÃΪÌØÊâÖµ£»È»ºó×öµÚ¶þ´Î´æ¿î£¬deposit_term´«Èë0Öµ£¬¾ÍÄÜ´¥·¢ÕûÊýÒç³ö£¬Èƹý±äÁ¿ÁýÕÖÌõ¼þÏÞÖƲ¢ÐÞ¸ÄheadΪ0Öµ¡£

2.4 ¡°±äÁ¿¾À²ø¡±µÄ¸±×÷ÓÃ

        ÔÚÈ«¾Ö±äÁ¿ÁýÕÖÖУ¬ºÜÈÝÒ×·¢Éú¡°±äÁ¿¾À²ø¡±ÏÖÏ󣬴Ӷø´¥·¢Ò»Ð©ÈÝÒ×±»ºöÊӵĸ±×÷Óá£ÕâÀïÒÔÒ»¸ö¼òµ¥ºÏÔ¼testΪÀý£¬º¯ÊýtestArrayÖÐÒÀÈ»´æÔڽṹÌå¾Ö²¿±äÁ¿aÁýÕÖÈ«¾Ö±äÁ¿xµÄÇé¿ö¡£µ«ÓÉÓÚxÊÇÊý×é±äÁ¿£¬ÆäÖ±½ÓË÷ÒýµÄstorage´æ´¢Î»Öýö´æ´¢ÆäÊý×鳤¶È£¬Ò²¾ÍÊÇa.xÖ»»áÁýÕÖxµÄÊý¾Ý³¤¶È£¬¶øa.y½«ÁýÕÖ±äÁ¿num¡£

        ÔÚtestArrayº¯ÊýÖУ¬¸³Öµ²Ù×÷a.x = 5ʱ£¬ÒòΪx.lengthÓë±äÁ¿a.x´¦ÓÚͬһ´æ´¢Î»Ö㬸³ÖµºóÊý×éxµÄ³¤¶ÈÄð³ÉÁË5¡£½ÓÏÂÀ´£¬¸³Öµa.y£¬²¢½«±äÁ¿a¼ÓÈëµ½Êý×éx¡£ËùÒÔ±äÁ¿aʵ¼ÊÉϼÓÈëµ½ÁËÊý×éxË÷ÒýΪ5µÄλÖá£Èç¹ûµ÷ÊÔtestArrayº¯ÊýÖ´ÐУ¬»á·¢ÏÖÔÚº¯ÊýÖ´ÐÐÍê±ÏÖ®ºó£¬x[5].x = 6, x[5].y = 7¡£

        ÕâÊÇΪʲôÄØ£¿Ã÷Ã÷´úÂëÖи³ÖµÐ´µÄÊÇ a.x = 5£¬a.y = 7¡£Õâ¾ÍÊÇÈ«¾Ö±äÁ¿xºÍ¾Ö²¿±äÁ¿aÐγÉÁË¡°¾À²ø¡±£¬Ê×ÏÈÊǾֲ¿±äÁ¿aÐ޸ĵ¼ÖÂÈ«¾Ö±äÁ¿x¸Ä±ä£¬È»ºóÊÇÈ«¾Ö±äÁ¿xÐ޸ĵ¼ÖÂÁ˾ֲ¿±äÁ¿Ð޸ģ¬×îºó°ÑÐ޸ĺóµÄ¾Ö²¿±äÁ¿ÓÖ´æ´¢µ½Ð޸ĺóµÄÈ«¾Ö±äÁ¿¡£ÕâÀï¼´ÊÇ£¬¸³Öµ²Ù×÷a.x = 5ʱ£¬°ÑÊý×éxµÄ³¤¶ÈÄð³ÉÁË5;  ½ÓÏÂÀ´x.push²Ù×÷£¬Êµ¼ÊÉÏÊÇÏȽ«¸ÃÊý×éxµÄ³¤¶È¼Ó1£¬´Ëʱa.x = 6; ×îºóÔÙ°Ña.x = 6, a.y=7¼ÓÈëµ½x[5]¡£ËùÒÔ£¬´æÈëÊý¾ÝµÄx¾ÍÊÇÐÂÊý×éµÄ³¤¶È6¡£

pragma solidity 0.4.24;

contract test {

    struct aa{

        uint x;

        uint y;

    }

    aa [] x;

    uint public num = 4;

 
    function testArray() returns (uint){

        aa a;

        a.x = 5;

        a.y = 7;

        x.push(a);

    }

}

3 ©¶´ÀûÓ÷½Ê½

        ÔÚµÚ2½ÚÖжԺÏÔ¼ BelluminarBank´æÔڵļ¸¸ö©¶´½øÐÐÁË·ÖÎö£¬ÏÂÃ潫˵Ã÷ÈçºÎÀûÓÃÕâ¸ö©¶´ÌáÈ¡ºÏÔ¼µÄÈ«²¿Óà¶î£¬ÕâÀïÔÚRemixÔÚÏß±àÒë»·¾³Öв¿Êð¸ÃºÏÔ¼£¬²¢ÑÝʾÆäÀûÓ÷½Ê½¡£

        Ê×ÏȲ¿ÊðºÏÔ¼£¬ÔÚ²¿Êð²ÎÊýÖÐÉèÖÃsecrete Ϊ¡°0x01¡±£¬deposit_termΪ1000£¬msg.valueΪ 31337 wei¡£

²¿ÊðºÏÔ¼ºó£¬ºÏÔ¼µÄÈ«¾Ö±äÁ¿ÈçÏÂͼËùʾ£º

¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾

        ÕâÑù£¬ºÏԼĿǰµÄÓà¶îÊÇ 31337 wei£¬ºÏÔ¼ÓµÓÐÕߵĵØַΪ£º0xca35b7d915458ef54 0ade6068dfe2f44e8fa733c¡£

        ÏÂÃ濪ʼÐèÒª½á¹¹Ìõ¼þʹµÃ¹¥»÷Õß¿ÉÒÔÀֳɵ÷ÓÃconfiscateº¯Êý¡£

²½Öè1:  ÁýÕÖowner²¢½á¹¹ÕûÊýÒç³öÌõ¼þ

        ÒªÏëת×ߺÏÔ¼Óà¶î£¬Ê×ÏȱØÐëÐ޸ĺÏÔ¼µÄowner¡£ÀûÓþֲ¿½á¹¹Ìå investment Ð޸ĺÏÔ¼owner£¬ÐèÂú×ãÌõ¼þ£º

        £¨1£©account < head or account >= balances.length

        £¨2£©deposit_term >= balances[balances.length ¨C 1].deposit_term + 1 years

        ÉèÖù¥»÷Õߣ¨0x1472¡­160C£©µÄinvestµ÷ÓòÎÊýÈçÏ£º

        ? msg.value = 1 wei (ÒòΪÔÚºÏÔ¼³õʼ»¯Ê±ownerÒѾ­´æÈëÒ»±Ê½ð¶î£¬ËùÒÔ´ËʱbalancesÊý×鳤¶ÈΪ1£¬ÎªÁ˲»¸Ä±äbalancesÊý×鳤¶È£¬ÕâÀïÒÀÈ»½«ÆäÉèÖÃΪ1 we i

        ? depositsit_term = 2^256 - 1 years = 115792089237316195423570985008687907853269984665640564039457584007913098103936 £¨ÔÚ²½Öè2ÖÐÐèÒªÀûÓÃÕâ¸öÊýÖµ½á¹¹Òç³ö£¬Í¬Ê±Õâ¸öÖµ¿ÉÒÔʹԴÂëÖÐ require Ìõ¼þµÃµ½Âú×㣩

        ? account = 1 (Âú×ãÌõ¼þ account >= balances.length)

        µ÷ÓÃÖ®ºó£¬ÐµĴæ¿î¼Ç¼Êý¾Ý½«´æ·ÅÔÚbalancesÊý×éË÷ÒýΪ1µÄλÖᣴËʱµÄbalancesÊý×éÇé¿öºÍÈ«¾Östorage±äÁ¿Çé¿öÈçÏÂͼËùʾ¡£


¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾

        ¿ÉÒÔ·¢ÏÖ£¬ownerÒѾ­ÐÞ¸ÄΪ¹¥»÷ÕßµØÖ·£¬Í¬Ê±head±»´«ÈëµÄdeposit_termÁýÕÖΪһ¸ö³¬´óÖµ¡£

        ¶øÌáÈ¡Óà¶îÊÇ´ÓbalancesÊý×éÖÐheadË÷Òý¿ªÊ¼µÄ´æ¿î¼Ç¼¿ªÊ¼¼ÆËãÊý¶îµÄ¡£ÏÔÈ»£¬ÎªÁËÌáÈ¡µ½ºÏÔ¼ownerµÄÓà¶î£¬¼´balances[0]ÕË»§µÄÓà¶î£¬head±ØÐë±»ÁýÕÖΪ0¡£Òò´Ë£¬ÐèÒª½øÐеڶþ´Îstorage±äÁ¿ÁýÕÖ£¬ÐÞ¸Ähead¡£

²½Öè2:  »Ö¸´head²¢Èƹýdeposit_termÏÞÖÆ

        ¼ÌÐøÉèÖù¥»÷Õßµ÷ÓÃinvestµÄ²ÎÊý£º

        ? msg.value = 2wei (ͬÑù±£Ö¤balancesµÄ³¤¶ÈÁýÕÖºó²»·ºÆð´íÎó)

        ? deposit_term = 0: »Ö¸´head

        ? account = 2 (Âú×ãÌõ¼þ account >= balances.length ¼´¿É)

        ÒòΪÔÚ²½Öè 1 ÖУ¬ÒѾ­½«balances[1].deposit_term ÉèÖÃΪ 2^256 -1 years£¬Òò´ËÔÚµÚ¶þ´Îµ÷Óà invest º¯Êýʱ£¬ÓÉÓÚbalances[balances.length - 1].deposit_term + 1 years¡±Òç³öΪ0Âú×ãÁËrequireÌõ¼þ£¬ËùÒÔ¿ÉÒÔÀֳɽøÐеڶþ´ÎÁýÕÖ¡£

        ÕâÑù¼´Âú×ãÁ˵÷ÓÃconfiscateº¯ÊýµÄÌõ¼þmsg.sender == owner£¬Í¨¹ý¶ÁÈ¡storageºÜÈÝÒ×»ñµÃsecrete£¬Ìõ¼þsecret == _secret Ò²¿ÉÒÔÂú×㣬ͬʱ»¹ÖØÐÂÁýÕÖÁËheadʹ֮±äΪ0 ¡£

        ÁýÕÖÖ®ºóÈ«¾Östorage±äÁ¿ºÍbalancesÊý×éÈçÏÂͼËùʾ£º

¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾

        ¿ÉÒÔ·¢ÏÖheadÒѾ­ÐÞ¸ÄΪ0ÁË¡£

        ÏÖÔÚÀ´¿´¿´µÚÈý¸öÌõ¼þ£º

        now >= balances[account].deposit_term + 1 years

        accountÊÇ´«ÈëµÄÊý¾Ý£¬Ä¿Ç°ºÏÔ¼ÖÐaccountÊýÁ¿Îª3¡£ÔÚÇ°ÃæµÄinvestµ÷Óúó£¬ balances[2].deposit_term = 0¡£ ÏÔÈ»Ìõ¼þ now >= balances[2].deposit_term + 1 years ½¨Á¢£¬ËùÒÔÔÚ»Ö¸´headÊý¾ÝµÄͬʱ£¬Ò²ÈƹýÁËconfiscateº¯ÊýÖжÔÓÚ´æ¿îÆÚÏÞµÄÅж¨¡£½ÓÏÂÀ´Ö»Òªµ÷Óú¯Êýconfiscateʱ£¬ÉèÖÃaccount Ϊ 2£¬±ã¿Éʹʱ¼äÅжÏÌõ¼þÂú×㣬ͬʱҲÄÜÌáÈ¡ËùÓÐÕË»§µÄÓà¶î¡£

²½Öè3:  Ôö¼ÓºÏÔ¼Óà¶î

        ¾­¹ý²½Öè1ºÍ²½Öè2£¬ºÃÏñ¹¥»÷ÕßÒѾ­¿ÉÒÔµ÷ÓÃconfiscateº¯ÊýÌáÈ¡ËùÓÐÓà¶îÁË£¬È»¶øʵ¼ÊÉÏÊDz»ÐеÄ¡£½»Ò׻ᷢÉú»Ø¹ö£¬ÕâÊÇΪʲôÄØ£¿

        ×Ðϸ·ÖÎöÇ°ÃæµÄÊý¾Ý¾Í»á·¢ÏÖ£¬²½Öè1ÖÐmsg.valueΪ 1 wei£¬µ«ÊÇ×îºóbalancesÊý×éÖеÄbalances[1].amount È´Äð³ÉÁË 2 wei¡£ÕâÊÇÒòΪ±äÁ¿ÁýÕÖ¹ý³ÌÖз¢ÉúÁË¡°¾À²ø¡±¸±×÷Óã¬ÓÉÓÚmsg.valueÁýÕÖbalancesÊý×éµÄ³¤¶È£¬balances¸üÐÂÇ°Ôö¼ÓÁËÊý×鳤¶È£¬Êý×鳤¶ÈÓָıäÁËmsg.value£¬×îºóµ¼Ö´æÈëµÄamountÄð³ÉÁËеÄÊý×鳤¶È£¬¼´2¡£

        ËùÒÔ£¬Ã¿´Îµ÷ÓÃinvestº¯Êý½øÐбäÁ¿ÁýÕÖ£¬´æ¿î¼Ç¼µÄÕËÄ¿½ð¶î¶¼±Èµ÷ÓÃÕßʵ¼ÊÖ§¸¶µÄmsg.value´ó¡£ÏÂͼÊÇÁ½´Îµ÷ÓÃinvestÖ®ºóµÄbalancesÊý×éÇé¿ö¡£

¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾

        ´ÓͼÖпÉÒÔ¿´³ö£¬´æ¿î¼Ç¼ÖеÄÕËÃæÖµ»á±Èʵ¼Ê½»Ò×µÄmsg.value¶à 1 wei¡£Í¨¹ýconfiscateº¯Êý¼ÆËãµÃµ½µÄËùÓÐÕË»§×ܶîΪ31342 wei£¬¶øʵ¼ÊµÄºÏÔ¼ÕË»§×ÜÓà¶îΪ 31340 wei¡£

¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾


        ΪÁËÄܹ»½«ºÏÔ¼ÖÐËùÓÐÓà¶îÌáÈ¡³öÀ´£¬ÐèÒªÔö¼ÓºÏÔ¼µÄÕæʵÓà¶î£¬Ê¹Æäͬ´æ¿î¼Ç¼ÖеÄÓà¶îÏàµÈ¡£È»¶ø£¬Í¨¹ýinvest·½Ê½Ôö¼ÓµÄÓà¶î¶¼Êб»¼ÆÈëÕËÃæÓà¶î£¬ÄÇôÔõôÔÚ²»Í¨¹ýinvestº¯ÊýµÄÇé¿öÏÂÔö¼ÓºÏÔ¼µÄÕæʵÓà¶îÄØ£¿

´ð°¸ÊÇselfdestructº¯Êý¡£

        selfdestructº¯Êý»á½«¸ÃºÏÔ¼µÄÓà¶îתµ½Ö¸¶¨ÕË»§£¬È»ºó´ÓÇø¿éÁ´ÖÐÏú»Ù¸ÃºÏÔ¼µÄ´úÂëºÍstorage¡£¸Ãº¯ÊýµÄ¹Ù·½ÎĵµËµÃ÷[5]ÈçÏ£º

¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾

        Òò´Ë£¬¿ÉÒԽṹһ¸öºÏÔ¼£¬È»ºóÔÚºÏÔ¼Öе÷ÓÃselfdestructº¯Êý½«ºÏÔ¼µÄÓà¶îת¸øBelluminarBankºÏÔ¼¡£Îª´Ë£¬½á¹¹ÈçϺÏÔ¼£º

contract donar{

    function donar() public payable{

        selfdestruct(contractAddr);

    }

}

        ¸ÃºÏÔ¼´´½¨ºóÂíÉÏÏú»Ù£¬Í¬Ê±½«×Ô¼ºµÄÓà¶îת¸øÒøÐкÏÔ¼¡£

        ÔÚ remix ÖÐ ±àÒë¸ÃºÏÔ¼£¬Í¬Ê±½« contractAddrÌ滻ΪÒøÐкÏÔ¼µØÖ·¡£È»ºó ÔÚdeploy¸ÃºÏԼʱ£¬ÉèÖà msg.value Ϊ2 wei¡£µ±ºÏÔ¼´´½¨ÓÖÏú»ÙÖ®ºó£¬ÆäÓà¶î£¨2wei£©½«×ª¸øÒøÐÐÕË»§£¬Ê¹ÒøÐкÏÔ¼µÄÕËÃæÓà¶îºÍʵ¼ÊÓà¶îÒ»Ö£¬ÕâÑùconfiscateº¯Êýµ÷ÓþÍÄܹ»ÕýÈ·Ö´ÐС£

        DonarºÏÔ¼²¿ÊðÉèÖÃÈçÏ£º

¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾

        ºÏÔ¼²¿ÊðÍêÖ®ºó£¬BelluminarBank ºÏÔ¼Óà¶îÈçÏÂͼ£º

¶«É­¡¤(ÖйúÇø)¹Ù·½ÍøÕ¾

²½Öè4£ºµ÷ÓÃconfiscateÌáÈ¡ºÏÔ¼Óà¶î

        ¾­¹ýÉÏÃæµÄ²Ù×÷Ö®ºó£¬ÉèÖÃconfiscateº¯ÊýµÄ²ÎÊýΪ[2£¬¡°0x01¡±]¼´¿É½«ºÏÔ¼µÄÈ«²¿Óà¶îת×ß¡£
 

²Î¿¼Á´½Ó£º

¡¾1¡¿https://github.com/beched/ctf/tree/master/2018/wctf-belluminar

¡¾2¡¿https://solidity.readthedocs.io/en/v0.4.24/security-considerations.html#private-information-and-randomness

¡¾3¡¿https://medium.com/aigang-network/how-to-read-ethereum-contract-storage-44252c8af925

¡¾4¡¿ http://solidity.readthedocs.io/en/v0.4.24/frequently-asked-questions.html

¡¾5¡¿https://solidity.readthedocs.io/en/v0.4.24/introduction-to-smart-contracts.html?highlight=selfdestruct