´Ósolidity˵»°¸öÐÔÉî¶È½â¶ÁÒÔÌ«·»ÖÇÄܺÏÔ¼·ì϶µÀÀíºÍ¹¥»÷ÀûÓÃ
°ä²¼¹¦·ò 2018-08-02Ëæ×ÅÇø¿éÁ´¡¢¡¢ÒÔÌ«·»¼¼ÊõµÄ¹ÄÆðºÍ²»ÐݳÉÊ죬°²È«ÎÊÌâÒ²ËæÖ®¶øÀ´£¬½ñÄêÖÇÄܺÏÔ¼·ì϶ÒѾÈöà¸öÇø¿éÁ´ÏîÄ¿¼Ûֵ˲¼ä¹éÁã¡£¡£¡£¡£¡£¡£¡£ÖÇÄܺÏÔ¼µÄ¿ª·¢Ëµ»°¡¢¡¢Éè¼ÆÄ£Ê½¡¢¡¢ÔËÐлúÖÆ¶¼Ó봫ͳÀûÓÃÓнϴó²î¾à£¬Ëü¼ÈÓд«Í³µÄ°²È«·çÏÕ(ÈçÕûÊýÒç³öµÈ)£¬ÓÖÓйÖÒìµÄÐÂÐÍ·çÏÕ(Èç˽ÓбäÁ¿²»¡°Ë½ÓС±ºÍÌØÊâÀàÐͱäÁ¿¸²¸ÇµÈ)¡£¡£¡£¡£¡£¡£¡£Ñз¢ÈËÔ±ÈôÊDz»ÄÜÉî¿ÌÀí½âÕâЩÖ÷ÌâµÀÀí£¬ÔòºÜÈÝÒ×±àд³ö´æÔÚ·ì϶µÄÖÇÄܺÏÔ¼£»£»£»¶ñÒâºÏÔ¼Ò²Äܹ»Í¨¹ýÕâÖÖ²½ÖèÁôÏÂÒñ±Î·ì϶£¬ºýŪºÏԼͶ×ÊÈ˲¢°µµØÀïÊո¡£¡£¡£¡£¡£¡£±¾ÎÄÒÔ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ÖеıäÁ¿´æ´¢²¼¾ÖÈçÏ£º£º
Òò¶ø£¬secrete²¢²»ÊÇÒ»¸ö²»³É»ñÈ¡µÄ˽º±¼û¾Ý£¬¹¥»÷ÕßÖ»±ØÒª½Ó¼û¸ÃºÏÔ¼storageÖеÄÊý¾Ý¾ÍÄܹ»»ú¹Øconfiscate º¯ÊýµÄsecret == _secretǰÌá¡£¡£¡£¡£¡£¡£¡£
2.2 solidityÈ«¾Ö±äÁ¿¸²¸Ç
BelluminarBankºÏÔ¼ÖеÄconfiscateº¯ÊýÒªÇóŲÓÃÕß±ØÐëÊǺÏÔ¼Õ¼ÓÐÕßÄÜÁ¦¹»½øÐÐÓà¶îÌáÈ¡²Ù×÷£¬¿´ÉÏÈ¥¹¥»÷ÕßÊÇÎÞ·¨ÌáÈ¡µÄ¡£¡£¡£¡£¡£¡£¡£È»¶ø£¬ÓÉÓÚsolidity˵»°µÄ²¿ÃűäÁ¿´æ´¢¸öÐÔ£¬µ¼Ö±¾ºÏÔ¼µÄowner±äÁ¿Äܹ»±»Åú¸Ä£¬¸²¸ÇÎÊÌâ³Ê´Ë¿Ì invest º¯ÊýÖС£¡£¡£¡£¡£¡£¡£
Ê×ÏÈÀ´¿´solidity²¿ÃűäÁ¿¸²¸ÇÈ«¾ÖstorageµÄÎÊÌâ¡£¡£¡£¡£¡£¡£¡£solidity˵»°µÄ±äÁ¿´æ´¢ÓÐÒ»¸ö¸öÐÔ£¬¼´Êý×é¡¢¡¢Ó³Éä¡¢¡¢½á¹¹ÌåÀàÐ͵IJ¿ÃűäÁ¿Ä¬ÈÏÊÇÒýÓúÏÔ¼µÄ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ÐγÉÁË¡°¾À²ø¡±£¬Ê×ÏÈÊDz¿ÃűäÁ¿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


¾©¹«Íø°²±¸11010802024551ºÅ