作者:Pinging
一、前言
前几天全国大学生信息安全竞赛初赛如期进行,在这次比赛中也看到了区块链题目的身影。所以我将题目拿来进行分析,并为后续的比赛赛题提供一些分析思路。
由于本次比赛我并没有参加,所以我并没有Flag等相关信息,但是我拿到了比赛中的相关文件以及合约地址并在此基础上进行的详细分析,希望能帮助到进行研究的同学。
二、题目分析
拿到题目后,我们只得到了两个内容,一个是合约的地址,一个是broken
eventSendFlag(uint256flagnum,stringb64email);functionpayforflag(stringb64email)public{require(balanceOf>=10000);emitSendFlag(1,b64email);}
首先我们看这个合约文件。合约开始定义了两个mapping变量——balanceOf与gift,之后为构造函数,以及发送flag的事件。当我们调用payforflag函数并传入使用base64加密的邮件地址之后,需要满足当前账户的余额比10000多。
由这第一手信息我们可以进行一些简单的猜想。这道题目需要领自己的余额大于10000,只有这样才能购买flag。这也是很常见的题目类型。而这个题目十分设计的还是十分巧妙的,我们接着向下看。
深圳全国首次在预付式经营领域应用数字人民币:金色财经报道,6月26日“深圳预付式经营领域应用数字人民币试点推广启动仪式”启动,深圳先行先试在预付式经营领域应用数字人民币,全国范围内尚属首次。中国人民银行深圳市中心支行有关负责人介绍,在预付式经营治理中引入数字人民币,实际上就是采用数字人民币智能合约进行预付资金管理。(深圳发布)[2023/6/27 22:01:47]
根据上面的合约代码,我们并不能得到更多的有用信息。然而此时我们就需要利用合约地址来进一步分析。
此处合约地址为:0x455541c3e9179a6cd8C418142855d894e11A288c。
我们访问公链信息看看是否能够访问到有价值的信息:
发现出题人并没有公开源代码,只有ABI码,此时我们只能根据此来进行合约逆向来寻找更有用的解题思路。
https://ethervm
varvar0=msg
var1=0x009c;func_01DC();stop();}elseif(var0==0x66d16cc3){//Dispatchtableentryforprofit()var1=msg
var1=0x009c;profit();stop();}elseif(var0==0x6bc344bc){//Dispatchtableentryfor0x6bc344bc(unknown)var1=msg
全国政协委员谈剑锋:应加强对元宇宙市场的监管,防范新型数字经济风险:3月5日消息,全国政协委员、第五空间信息科技研究院院长、上海市信息安全行业协会名誉会长谈剑锋认为,数字经济要深化发展,必须要和实体经济融合发展,要谨防资本利用国家发展规划和热点概念,出现新的虚拟经济泡沫。应对“元宇宙”市场乱象,应提前布局“元宇宙”行业监管、技术研发和舆情引导。谈剑锋建议:一是提前研究政策,布局行业监管。二是系统布局“元宇宙”核心技术。技术层是“元宇宙”的领先场景,是大型企业与跨国公司角逐的关键领域。
三是进一步加强舆情引导。资本市场对元宇宙过热投入,以及社交媒体如火如荼的宣传,容易对社会公众产生误导或不良影响。[2022/3/5 13:39:25]
vartemp0=memory;vartemp1=msg
elseif(var0==0x70a08231){//DispatchtableentryforbalanceOf(address)var1=msg
var1=0x013a;var2=msg
elseif(var0==0x7ce7c990){//Dispatchtableentryfortransfer2(address,uint256)var1=msg
全国政协委员张野:货币数字化是人类社会发展的必然趋势:全国政协委员、中国证监会科技监管工作委员会副主任张野表示,货币的形式是与人类文明程度密切相关的,因此货币数字化是人类社会发展的一个必然趋势。数字货币在提升支付、拨付效率、打击犯罪、降低货币制造管理成本等方面都具有非常广阔的应用空间。张野同时认为,在数字货币的设计上,要坚持几个原则。一是货币的主权性,二是使用上的便利性,三是安全性,四是匿名性。(人民政协报)[2020/11/24 21:52:08]
var1=0x009c;var2=msg
elseif(var0==0xa9059cbb){//Dispatchtableentryfortransfer(address,uint256)var1=msg
var1=0x009c;var2=msg
elseif(var0==0xcbfc4bce){//Dispatchtableentryfor0xcbfc4bce(unknown)var1=msg
var1=0x013a;var2=msg
else{revert(memory);}}//0x66d16cc3函数空投函数??functionfunc_01DC(){memory=msg
印度宣布全国封禁以来,加密交易所的注册数量和交易量都有所增加:自从印度最高法院取消央行的加密禁令以来,印度加密社区就一直在重建。随后,为了应对新冠疫情的流感大流行,印度总理Narendra Modi于3月25日宣布将进行为期21天的全国禁闭,禁闭期将于4月14日结束。本地加密交易所Wazirx首席执行官Nischal Shetty表示,其平台上的加密货币交易并未受到封锁的消极影响:“自银行加密禁令解除以来,平台的注册人数大幅增加;在印度施行封禁以后,注册人数又增加了25%。”另一家印度加密交易所Coindcx也看到了类似的趋势。其首席执行官Sumit Gupta在接受采访时表示,在加密禁令解除后的第一周,其交易所交易量增长了10倍。至于全国范围的封锁的影响,他表示:“在封锁的情况下,平台见证了注册人数的持续增长,每天增长速度保持一致。Coindcx平台上的每日交易量、用户活动以及(加密和INR)存款的数量,也与封禁之前的数据一致。这表明,与受危机影响较大的传统资产类别相比,加密资产在很大程度上仍然不相关。”(Bitcoin.com)[2020/4/3]
memory=msg
//利润函数:functionprofit(){memory=msg
memory=msg
memory=msg
声音 | 全国政协委员张近东:互联网时代已进入到物联网、区块链、人工智能的时代:全国政协委员、苏宁控股集团董事长张近东接受专访时表示,互联网时代已经从PC端时代迈入移动端时代,进入到物联网、区块链、人工智能的时代。[2019/3/11]
functionfunc_0278(vararg0){memory=msg
varvar0=0xb1bc9a9c599feac73a94c3ba415fa0b75cbe44496bfda818a9b4a689efb7adba;varvar1=0x01;vartemp0=arg0;varvar2=temp0;vartemp1=memory;varvar3=temp1;memory=var1;vartemp2=var30x20;varvar4=temp2;vartemp3=var40x20;memory=temp3-var3;memory=memory;varvar5=temp30x20;varvar7=memory;varvar6=var20x20;varvar8=var7;varvar9=var5;varvar10=var6;varvar11=0x00;if(var11>=var8){label_02FD:vartemp4=var7;var5=temp4var5;var6=temp4&0x1f;if(!var6){vartemp5=memory;log(memory,]);return;}else{vartemp6=var6;vartemp7=var5-temp6;memory=~(0x0100**(0x20-temp6)-0x01)&memory;vartemp8=memory;log(memory,]);return;}}else{label_02EE:vartemp9=var11;memory=memory;var11=temp90x20;if(var11>=var8){gotolabel_02FD;}else{gotolabel_02EE;}}}functionbalanceOf(vararg0)returns(vararg0){memory=0x00;memory=arg0;returnstorage)];}functiontransfer2(vararg0,vararg1){if(arg1<=0x02){revert(memory);}memory=msg
memory=msg
memory=msg
functiontransfer(vararg0,vararg1){if(arg1<=0x01){revert(memory);}memory=msg
memory=msg
memory=msg
functionfunc_0417(vararg0)returns(vararg0){memory=0x01;memory=arg0;returnstorage)];}}
之后我们针对此逆向后的代码进行分析。
我们经过分析发现了如下的public函数:
很明显这是代币合约,并且可以进行转账。而此代码中拥有两个转账函数。并且可以查看余额。
我们具体根据代码对函数详细分析:
首先我们分析编号为0x652e9d91的func_01DC()函数。
首先合约将内存切换到0x01位置,此处为:mapping(address=>uint)publicgift;
memory=msg
不知用户是否发现,我们就看到了漏洞点了,这是一个典型的溢出漏洞。
根据作者给出的代码,我们发现其具体余额是使用uint定义的,由于uint的位数是有限的,并且其不支持负数。所以当其负数溢出时就会变成一个很大的正数。
而根据我们的transfer2函数内容,我们知道:require(balance(msg.sender)-arg1>=0);。此句进行判断的时候是将用户余额减去一个arg1来判断是否大于0的。而如果arg1设置一个比较大的数,那么balance(msg.sender)-arg1就会溢出为一个非常大的数,此时就成功绕过了检测并且转账大量的代币。
所以我们可以利用此处的整数溢出来进行题目求解,然而在分析的过程中我又发现了另一个解法。
如果做题人没有发现此处的漏洞点,我们可以利用常规做法来进行求解。
根据给出的flag函数我们知道,我们只需要余额>10000即可,那么我们可以发现,我们的profit函数可以给我们不断的新增钱。
根据我们的分析,我们需要令合约余额==1并且gitf==1,此时即可调用profit()来将余额,调用后余额为2,gift为1。这时候将余额转给第二个账户,余额就又变成1了,就又可以调用profit()函数。这样不断给第二个用户转账,转账10000次即可。
三、漏洞利用技巧
此处我们介绍漏洞利用的技巧。
首先我们需要拥有两个钱包地址。
此时我们令Addr1调用func_01DC()函数领取1个代币以及1个gift。
之后我们调用profit领取一个代币。此时余额为2,gift为1。
由于transfer2需要余额大于2才能调用,所以我们首先令Addr2同样执行上面的两步。此时两个钱包均有余额为2。
这时候Adde1调用transfer给Addr2转账两个代币,此时Addr余额为0,Addr2为4。
之后Addr2就可以调用transfer2给Adde1转账一个非常大的金额。达到溢出效果。此时Addr1与Addr2均拥有了大量的代币。任意地址均可以调用flag函数。
具体的交易日志如下:
此时flag就被调用发送到用户账户上了。
四、总结
本次题目非常巧妙,如果后面的同学想直接查看交易日志是非常难通过一个账户来进行跟踪的。并且本题目没有公布合约,所以考验逆向能力。但是只要逆出来后就是一道比较简单的题目,没有完全逆出来的同学也可以使用常规做法进行不断转账来使余额满足要求。希望本文对大家之后的研究有所帮助。欢迎讨论。
Bitfinex即将要发10亿美元的IEO进行自救,代币名称为LEO。具体的发行方式大家可以戳葱姐家这篇文章《BitfinexIEO白皮书草案曝光,"发币自救"已成实锤?》了解下.
1900/1/1 0:00:00狂人本着负责,专注,诚恳的态度用心写每一篇分析文章,特点鲜明,不做作,不浮夸!本内容中的信息及数据来源于公开可获得资料,力求准确可靠,但对信息的准确性及完整性不做任何保证,本内容不构成投资建议.
1900/1/1 0:00:00尊敬的LBank用户???在为用户提供主节点钱包充提币的过程中,我们发现VOLLAR主网节点的稳定性并难以满足用户正常的使用诉求,造成了非常不友好的用户使用体验.
1900/1/1 0:00:00亲爱的Coinw用户:CoinwPriority双优计划第三期项目Cortex将在5月4日23:00进行快照,快照后优先向平台核心用户免费发放CTXC打新额度.
1900/1/1 0:00:00文章系金色财经专栏作者供稿,发表言论仅代表其个人观点,仅供学习交流!金色盘面不会主动提供任何交易指导,亦不会收取任何费用指导交易,请读者仔细甄别,谨防上当.
1900/1/1 0:00:002017年,我只是一个厌倦了朝九晚五工作的办公室文员。那时我狂看Netflix,有一天,我花了4700美元买了一枚比特币,开始了为期一年、走遍20个国家的奇妙旅行.
1900/1/1 0:00:00