作者:Pinging
一、前言
前幾天全國大學生信息安全競賽初賽如期進行,在這次比賽中也看到了區塊鏈題目的身影。所以我將題目拿來進行分析,并為后續的比賽賽題提供一些分析思路。
由于本次比賽我并沒有參加,所以我并沒有Flag等相關信息,但是我拿到了比賽中的相關文件以及合約地址并在此基礎上進行的詳細分析,希望能幫助到進行研究的同學。
二、題目分析
拿到題目后,我們只得到了兩個內容,一個是合約的地址,一個是broken
eventSendFlag(uint256flagnum,stringb64email);functionpayforflag(stringb64email)public{require(balanceOf>=10000);emitSendFlag(1,b64email);}
首先我們看這個合約文件。合約開始定義了兩個mapping變量——balanceOf與gift,之后為構造函數,以及發送flag的事件。當我們調用payforflag函數并傳入使用base64加密的郵件地址之后,需要滿足當前賬戶的余額比10000多。
由這第一手信息我們可以進行一些簡單的猜想。這道題目需要領自己的余額大于10000,只有這樣才能購買flag。這也是很常見的題目類型。而這個題目十分設計的還是十分巧妙的,我們接著向下看。
全國“元宇宙”相關商標注冊申請已近8000件,99%以上是今年申請:金色財經報道,數據顯示,截至12月7日,全國已經有7900多件“元宇宙”相關商標注冊申請,99%以上是今年申請。按照我國商標注冊申請約4個月的審查周期,如果這些商標均在不同類別、不構成近似,那么最遲到明年4月,全國可能就有近8000個元宇宙相關商標等待批準。(經濟日報)[2021/12/8 12:58:40]
根據上面的合約代碼,我們并不能得到更多的有用信息。然而此時我們就需要利用合約地址來進一步分析。
此處合約地址為: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
江蘇昆山完成全國首筆基于區塊鏈技術的宅基地使用權流轉交易:8月2日下午,江蘇昆山完成了一筆基于區塊鏈技術的農村閑置住宅使用權流轉交易。在鄉村振興的命題下,“區塊鏈+農業”也是一個新的農業科技探索。繼江蘇射陽縣實現土地線上全流程“不見面”交易、江蘇金湖縣推出“區塊鏈+農村產權交易+抵押貸款”服務后,江蘇農村產權流轉的再創新。
這也是全國首筆基于區塊鏈技術的閑置住宅使用權流轉。通過農村閑置住宅“上鏈”流轉,破解了宅基地交易可信的難題,從而進一步盤活農村“沉睡”資產。[2021/8/4 1:32:59]
vartemp0=memory;vartemp1=msg
elseif(var0==0x70a08231){//DispatchtableentryforbalanceOf(address)var1=msg
var1=0x013a;var2=msg
elseif(var0==0x7ce7c990){//Dispatchtableentryfortransfer2(address,uint256)var1=msg
var1=0x009c;var2=msg
elseif(var0==0xa9059cbb){//Dispatchtableentryfortransfer(address,uint256)var1=msg
四川經信廳廳長:發揮清潔能源優勢 為全省全國區塊鏈提供優質算力服務:在3月12日成都第二屆區塊鏈創新與產業發展峰會上,四川省經濟和信息化廳黨組書記、廳長朱家德表示,充分發揮我省清潔能源大省優勢,規劃建設一批區塊鏈基礎設施,為全省乃至全國區塊鏈提供優質的算力服務。在碳中和政策限制火電的情況下,會有更多的區塊鏈算力從西北遷移至四川。
據國網四川電力,2020年阿壩供電公司水電消納大數據客戶容量47.5萬千伏安,位列全省第二,占全省總量的41%,水電消納增加售電量12.54億千瓦時,全年售電量首次突破100億千瓦時。行業人士預計明年水電消納將達到約180億千瓦時,其中大數據行業用電預計約120億千瓦時。(吳說區塊鏈)[2021/3/13 18:42:12]
var1=0x009c;var2=msg
elseif(var0==0xcbfc4bce){//Dispatchtableentryfor0xcbfc4bce(unknown)var1=msg
var1=0x013a;var2=msg
else{revert(memory);}}//0x66d16cc3函數空投函數??functionfunc_01DC(){memory=msg
memory=msg
福州在全國率先推進“數據就業”,涉及區塊鏈等多個熱門領域:作為國內首個提出“數據就業”的城市,福州近日在全國率先出臺《福州市加強公共數據開發利用推進數據就業工作實施方案》(以下簡稱《實施方案》),《實施方案》提出,福州將通過8項重點任務保障本地高校畢業生留榕順利就業,吸引阜外高校畢業生來榕就業創業,推動福州數字經濟高質量發展。截至目前,已向142家數字經濟企業征集超過1500個崗位需求,包括福建聯通、網龍、博思、新大陸等多家企業,涉及區塊鏈、大數據、人工智能、云計算等多個熱門領域。(福州日報)[2020/6/14]
//利潤函數:functionprofit(){memory=msg
memory=msg
memory=msg
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
聲音 | 全國社保基金原副理事長:區塊鏈“走偏”是因云平臺基礎設施服務不足:11月1日,在“第十四屆北京中國金融博覽會暨2018年中國金融年度論壇”上,全國社保基金理事會原副理事長王忠民表示,過去云平臺基礎設施服務不足以監管、跟蹤,不足以提供深度服務的時候,區塊鏈才走偏了。如果今天這個云端足以支持區塊鏈,區塊鏈的金融邏輯、商業邏輯才會搭上祥云,隨處降臨。[2018/11/1]
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就被調用發送到用戶賬戶上了。
四、總結
本次題目非常巧妙,如果后面的同學想直接查看交易日志是非常難通過一個賬戶來進行跟蹤的。并且本題目沒有公布合約,所以考驗逆向能力。但是只要逆出來后就是一道比較簡單的題目,沒有完全逆出來的同學也可以使用常規做法進行不斷轉賬來使余額滿足要求。希望本文對大家之后的研究有所幫助。歡迎討論。
作者:互鏈脈搏研究院 互鏈脈搏按:自互鏈脈搏4月3日發布《3月ICO月報:融資額僅0.15億美元》后,我們判斷,ICO融資模式幾乎走到盡頭,因此從5月開始.
1900/1/1 0:00:00根據《華爾街日報》消息,Facebook正計劃和多家金融公司和線上電子商務公司合作,準備基于其全球最大的社交網絡推出基于加密貨幣的支付系統.
1900/1/1 0:00:00當區塊鏈和加密數字資產的價值剛被市場認識到的時候,行業對這些技術在一些領域中的應用很快就形成了共識,譬如在證券行業中的交易后清算和銀行業中的轉賬清算。還有一個行業共識的應用領域就是積分.
1900/1/1 0:00:00ThunderCore(TT鏈)首發火幣PrimeLite,百萬TT空投活動展開中!為了慶祝ThunderCore(TT鏈)成為火幣PrimeLite第一個合作伙伴,我們將要開展空投活動.
1900/1/1 0:00:00據coindesk.com報道,支付公司Square今天公布了第一季度收入,其基于Cash應用比特幣銷售量強勁增長.
1900/1/1 0:00:00VVBTC官方QQ群:878910298???搶購通道:https://www.vvbtc.com區塊鏈娛樂公鏈項目DRC,自帶200萬日活用戶,即將在VVBTC交易所啟動IEO認購.
1900/1/1 0:00:00