智能合約安全系列文章反匯編·上篇
前言
通過上一篇反編譯文章的學習,我們對智能合于opcode的反編譯有了基礎的學習,對于初學者來說,要想熟練運用還得多加練習。本篇我們來一塊學習智能合約反匯編,同樣使用的是OnlineSolidityDecompiler在線網站,智能合約反匯編對于初學者來說,較難理解,但對于智能合約代碼來說,只要能讀懂智能合約反匯編,就可以非常清晰的了解到合約的代碼邏輯,對審計合約和CTF智能合約都有非常大的幫助
反匯編內容
由于solidity智能合約的opcode經過反匯編后,指令較多,我們本篇分析簡明要義,以一段簡單合約代碼來分析其反匯編后的指令內容
合約源碼如下:
?pragma?solidity?^0.4.24;
?contract?Tee?{
?????
?????uint256?private?c;
?????function?a()?public?returns?(uint256)?{?self(2);?}
?????
?????function?b()?public?{?c++;?}
?????function?self(uint?n)?internal?returns?(uint256)?{
?????????
PancakeSwap集成ENS,支持用戶查看.eth域名:5月11日消息,去中心化交易平臺 PancakeSwap 宣布與以太坊域名 ENS 集成,超 69 萬用戶現可在 PancakeSwap 上查看 .eth 域名,用戶可點擊右上角的錢包或個人資料查看。[2023/5/11 14:57:47]
?????????if?(n?<=?1)?{?return?1;?}
?????????return?n?*?self(n?-?1);
?????}
?}
合約部署后生成的opcode:
?0x6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630dbe671f14604e5780634df7e3d0146076575b600080fd5b348015605957600080fd5b506060608a565b6040518082815260200191505060405180910390f35b348015608157600080fd5b5060886098565b005b60006094600260ab565b5090565b6000808154809291906001019190505550565b600060018211151560be576001905060cd565b60c86001830360ab565b820290505b9190505600a165627a7a7230582003f585ad588850fbfba4e8d96684e2c3fa427daf013d4a0f8e78188d4d475ee80029
與V神相關的Gitcoin Presents NFT系列24小時交易量位列OpenSea榜首:金色財經報道,由區塊鏈融資公司Gitcoin和 NFT 平臺Metalabel合作推出的Gitcoin Presents NFT 系列在其公開鑄幣結束后價值飆升,交易量位列 OpenSea 榜首,根據OpenSea 的數據,該系列的24小時交易量為 8084 ETH,截至發稿時時價值超過 1500 萬美元。
該NFT系列旨在紀念 2018 年一篇關于 Quadratic Funding 的論文,是由以太坊基金會創始人 Vitalik Buterin、哈佛經濟學家 Zo? Hitzig 和社會活動組織 RadicalxChange 創始人 Glen Weyl 撰寫的公共籌款機制。購買 NFT 可向收藏者贈送該論文的數字副本,以及 Gitcoin 創始人評論融資機制成功的兩篇文章。[2023/3/10 12:53:12]
通過在線網站OnlineSolidityDecompiler反匯編后結果如下:
反匯編分析
我們從第一部分指令label_0000開始
??0000????60??PUSH1?0x80
??0002????60??PUSH1?0x40
??0004????52??MSTORE
Linux基金會成立開放元宇宙基金會,將協調開發元宇宙開源軟件和標準:1月19日消息,據官方博客,Linux基金會宣布成立開放元宇宙基金會(Open Metaverse Foundation,OMF),旨在為不同行業提供一個協作空間,致力于為元宇宙開發開源軟件和標準,目前ChainHub基金會、Cloud Native Computing Foundation、Futurewei、GenXP等已成為創始成員。
OMF具體分為八個基本興趣小組(FIG),分別為用戶、交易、數字資產、模擬和虛擬世界、人工智能、聯網、安全和隱私、法律和政策,將提供有針對性的資源和論壇,用于識別新想法、完成工作和招募新的貢獻者,他們由來自特定學科的成員組成,致力于推進其主題中的項目或可擴展技術,并確保解決和管理項目的每個可識別子部分(例如GitHub.org、存儲庫、子目錄、API、測試、問題、PR)的代碼所有權。[2023/1/19 11:20:15]
??0005????60??PUSH1?0x04
??0007????36??CALLDATASIZE
??0008????10??LT
??0009????60??PUSH1?0x49
??000B????57??*JUMPI
push指令是將字節壓入棧頂,push1-push32依次代表將1字節-32字節推壓入棧頂,這里PUSH10x80和PUSH10x40表示將0x80和0x40壓入棧頂,故目前棧的布局如下:
因2000萬美元在FTX上被凍結,Auros在英屬維爾京群島申請破產保護:金色財經報道,法院文件顯示,做市商公司Auros申請在英屬維爾京群島開始破產程序。據Auros稱,11月11日,當FTX在美國申請第11章破產保護時,在大約2000萬美元的公司資產在FTX上被凍結,由于這些資產被凍結,Auros實際上已經資不抵債。Auros現在尋求法院清算令,并提議Interpath Advisory作為其清算人。[2022/12/20 21:56:15]
?1:?0x40
?0:?0x80
MSTORE指令表示從棧中依次出棧兩個值arg0和arg1,并把arg1存放在內存的arg0處。目前來說棧中已無數據,這里將0x80存放在內存0x40處。
PUSH10x04將0x04壓入棧中,CALLDATASIZE指令表示獲取msg.data調用數據,目前棧的布局如下:
?1:?calldata
?0:?0x04
LT指令表示將兩個棧頂的值取出,如果先出棧的值小于后出棧的值則把1入棧,反之把0入棧。這里如果calldata調用數據小于0x04字節,就將1入棧;如果calldata調用數據大于等于0x04字節,就將0入棧。目前棧的布局為:0:0或0:1。
繼續分析,PUSH10x49指令將0x49壓入棧頂,目前棧的布局為:
?1:0x49
?0:?0?或者?1
奇點未來科技公司宣布收到納斯達克退市通知和請求聽證的意向:金色財經報道,美股上市公司奇點未來(SGLY)宣布,2022年10月3日公司收到納斯達克股票市場上市資格部門的通知,通知稱除非公司及時要求納斯達克聽證會,否則公司的證券將被除名。因此,本公司打算及時要求聽證會。聽證請求將在2022年10月25日之前暫停任何退市或暫停行動。
據悉,奇點未來由于延遲提交截至2022年3月31日的10-Q表格季度報告而不符合納斯達克上市規則5250(c)(1),并被要求在60天內提交一份計劃以重新獲得遵守。根據對合規計劃的審查,以及與公司外部律師和公司董事會特別委員會律師的電話交談,納斯達克工作人員確定,公司沒有提供明確的計劃,證明其有能力在工作人員根據納斯達克上市規則可利用的180個日歷日期限內提交截至2022年3月31日的10-Q表季度報告和截至2022年6月30日的10-K表年度報告。[2022/10/13 10:33:00]
下面一條指令JUMPI指令表示從棧中依次出棧兩個值arg0和arg1,如果arg1的值為真則跳轉到arg0處,否則不跳轉。如果arg1值為1,則指令會跳轉到0x49處;如果arg1值為0,則會順序執行下一條指令。具體執行過程如下:
這里我們先來分析順序執行的內容label_000C,指令如下
??000C????60??PUSH1?0x00
??000E????35??CALLDATALOAD
??000F????7C??PUSH29?0x0100000000000000000000000000000000000000000000000000000000
??002D????90??SWAP1
??002E????04??DIV
??002F????63??PUSH4?0xffffffff
??0034????16??AND
??0035????80??DUP1
??0036????63??PUSH4?0x0dbe671f
??003B????14??EQ
??003C????60??PUSH1?0x4e
??003E????57??*JUMPI
目前經過上一步運算棧中布局為空,PUSH10x00指令將0壓入棧中。CALLDATALOAD指令接受一個參數,該參數可以作為發往智能合約的calldata數據的索引,然后從該索引處再讀取32字節數,由于前一個指令傳入的索引值為0,所以這一步指令會彈出棧中的0,將calldata32字節壓入棧中。PUSH29指令將29個字節壓入棧中。目前棧的布局如下:
?1:0x0100000000000000000000000000000000000000000000000000000000
?0:calldata值
SWAP1指令表示將堆棧頂部元素與之后的第一個元素進行交換,也就是0x0100000000000000000000000000000000000000000000000000000000和calldata值進行交換。接下來DIV指令表示取a//b的值,這里也就是calldata的32字節除29字節,由于除法的運算關系,這里進行除法運算后的字節為4位,估計大家也可以想到,這就是函數標識符4字節。那么目前棧的布局如下:
0:函數標識符4字節
PUSH4指令將0xffffffff壓入棧中。AND指令表示將取棧中前兩個參數進行AND運算,也就是函數標識符前四位0xffffffff進行AND操作,最終得到前四位的函數標識符及后28位為空補0的數值。下一條指令DUP1表示復制當前棧中第一個值到棧頂,目前棧中布局如下:
1:調用參數中的函數標識符?0:調用參數中的函數標識符
下一個指令PUSH4指令繼續將函數標識符0x0dbe671f壓入棧中,這里的標識符為a()函數,函數標識符我們可以在https://www.4byte.directory/在線網站查看。目前棧中布局如下:
2:0x0dbe671f?1:調用參數中的函數標識符?0:調用參數中的函數標識符
EQ指令表示取兩個棧頂值,如果兩值相等就將1入棧,反之將0入棧。下一步PUSH1將0x4e壓入棧頂。之后JUMPI指令從棧中依次出棧兩個值arg0和arg1,如果arg1的值為真則跳轉到arg0處,否則不跳轉。目前棧中布局如下:
2:0x4e?1:1?或?0??0:調用參數中的函數標識符
從前面三個指令可看出,EQ對函數標識符進行判斷后,下一步壓入0x4e是為了JUMPI進行判斷并跳轉。也就是說如果EQ判斷a()函數標識符相等,JUMPI執行后就會跳轉到0x4e的偏移位置;反之如果EQ判斷a()函數標識符不相等,JUMPI執行后就會順序執行下一條語句。目前棧中布局如下:
0:調用參數中的函數標識符
具體執行過程如下:
目前我們對label_0000和label_000C已進行分析,從上圖來看,該流程中除了順序執行外,label_0000處0x49,label_003F處0x76和label_000C處0x4e都有相應的跳轉條件。本篇我們繼續分析順序執行部分指令。首先來看第一部分label_003F:
?003F????80??DUP1?0040????63??PUSH4?0x4df7e3d0?0045????14??EQ?0046????60??PUSH1?0x76?0048????57??*JUMPI
由于目前棧中只有一條數據
DUP1指令表示復制棧中第一個值到棧頂。PUSH4指令將0x4df7e3d0函數標識符壓入棧頂,這里函數標識符代表b()函數,故目前棧中布局如下:
2:0x4df7e3d0?1:調用參數中的函數標識符?0:調用參數中的函數標識符
接下來三個指令會進行棧中值進行運算和偏移量跳轉設置,EQ指令把棧頂的兩個值出棧,如果0x4df7e3d0和調用參數中的函數標識符相等則把1入棧,否則把0入棧。PUSH1指令將偏移量0x76壓入棧中。JUMPI指令從棧中依次出棧兩個值:0x76和EQ指令判斷的值,如果EQ指令判斷的值為真則跳轉到0x76處,否則按順序執行不跳轉。故目前棧中布局如下:
2:0x76?1:1?或?0??0:調用參數中的函數標識符
我們假設EQ指令判斷的值為0,那么通過JUMPI指令條件判斷后,會按照順序繼續執行下一條指令。執行后,棧中依然只有一條指令。
我們繼續進行順序執行,label_0049:
?0049????5B??JUMPDEST?004A????60??PUSH1?0x00?004C????80??DUP1?004D????FD??*REVERT
JUMPDEST指令在該上下文中表示跳轉回來,也就是label_0000處0x49的跳轉。之后的兩條指令PUSH1和DUP1總體意思為將0壓入棧頂并復制,沒有實際意義。REVERT指令則表示并未有函數簽名匹配,從而停止執行,回滾狀態。
總結
由于反匯編內容過多,我們分為兩篇分享給大家,本篇我們對反匯編的內容進行了詳細講解,下篇我們將會繼續分析并串聯所有指令,梳理代碼邏輯。
來源:金色財經
2020-12-16??星期三?農歷冬月初二?大家好,我是你們的老朋友張氏說幣,專注幣圈主流貨幣走勢分析.
1900/1/1 0:00:00CompoundFinance創始人表示,CeFi必將擁抱DeFi,并且有跡象表明這正在發生。全球DeFi和區塊鏈虛擬峰會REDeFiNETOMORROW在泰國曼谷舉行,Leshner在峰會上發.
1900/1/1 0:00:00幣圈麗姐:比特幣高位震蕩關鍵點位多空爭奪昨天的漲跌無法代表今天的多空,今天的眼淚也帶不走昨天的不快,唯一不落后的辦法,就是不斷加強,千萬條江河為了自己的理想徹夜不停的奔流.
1900/1/1 0:00:002020年,隨著居民健康意識的覺醒,催生了健康產業的飛速發展。而醫療衛生領域面對最大的問題之一,是不同的機構持有多個以及分散的患者健康記錄,變相增加了醫療環節中的重復工作、成本逐年攀高、個人信息.
1900/1/1 0:00:00比特幣長期持有者向交易平臺發送比特幣占比僅為0.004%,凸現其對近期監管指控保持冷靜態度:6月11日消息,據Glassnode提供數據顯示.
1900/1/1 0:00:00以太坊昨日行情多次插針試探下方支撐,遲遲未破,迅速反彈,昨日幣價最低回踩到579一線位置也是斐波那契擴展線78.9后迅速向上反彈.
1900/1/1 0:00:00