智能合約安全系列文章反匯編·上篇
前言
通過上一篇反編譯文章的學習,我們對智能合于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)?{
?????????
Animoca Brands宣布成為Celo網絡驗證者:金色財經報道,據香港元宇宙游戲及數字產權公司Animoca Brands官網披露,該公司已加入低碳EVM兼容區塊鏈Celo生態系統,旨在拓展新數字經濟,并將在Celo的移動優先基礎設施和任務驅動的生態系統上擴展Web3 游戲,以及制定后續的戰略合作計劃。據悉,Animoca Brands是加入Celo生態成員中的首個游戲管理公司,同時還將成為Celo網絡驗證者以支持網絡安全,目前Celo網絡驗證者還包括 德國電信、Coinbase Ventures、a16z等。[2023/6/22 21:53:49]
?????????if?(n?<=?1)?{?return?1;?}
?????????return?n?*?self(n?-?1);
?????}
?}
合約部署后生成的opcode:
?0x6080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630dbe671f14604e5780634df7e3d0146076575b600080fd5b348015605957600080fd5b506060608a565b6040518082815260200191505060405180910390f35b348015608157600080fd5b5060886098565b005b60006094600260ab565b5090565b6000808154809291906001019190505550565b600060018211151560be576001905060cd565b60c86001830360ab565b820290505b9190505600a165627a7a7230582003f585ad588850fbfba4e8d96684e2c3fa427daf013d4a0f8e78188d4d475ee80029
已關停5年的BTC-e交易平臺曾于去年11月向2個地址發送3,299枚BTC:3月25日消息,據鏈上數據顯示,過去兩周時間內,來自已關停的 BTC-e 交易平臺的 BTC 資產一直在鏈上進行移動,最初,某匿名錢包地址被監測到于 2022 年 11 月從 BTC-e 地址收到 3,299 枚 BTC,這是 BTC-e 錢包地址自 2017 年以來發送的第一筆交易。此后該地址向兩個身份不明的收款人發送了 10,000 枚比特幣(約合 1.65 億美元)。
今年 3 月 14 日,其中一個收款地址再次開始轉移資金,經區塊鏈分析公司 Crystal Blockchain 向 Forklog 證實,3,299 枚 BTC 中的一小部分(共 3.75 枚 BTC)已被發送到交易平臺 KuCoin 和 MEXC,以及一個名為 BTC2pm 的 OTC 平臺。[2023/3/25 13:25:52]
通過在線網站OnlineSolidityDecompiler反匯編后結果如下:
反匯編分析
我們從第一部分指令label_0000開始
??0000????60??PUSH1?0x80
??0002????60??PUSH1?0x40
??0004????52??MSTORE
??0005????60??PUSH1?0x04
Aptos聯創公布2023年計劃:會有訂單簿、AMM、DEX等一系列DeFi創新:金色財經報道,Aptos首席執行官兼聯合創始人Mo Shaikh在最新采訪時公布了該項目2023年計劃,他表示Aptos將會在2023年上線中心化限價訂單薄、AMM(自動做市商)、DEX(去中心化交易所)等一系列DeFi功能。
但是Aptos會采取“階梯式”創新的方式,不會冒險將所有用戶帶入Layer 1或Layer 2,目前Aptos已經開始構建Web3創新產品,預計這些用例都會在2023年成為現實。(dailyhodl)[2022/12/29 22:14:19]
??0007????36??CALLDATASIZE
??0008????10??LT
??0009????60??PUSH1?0x49
??000B????57??*JUMPI
push指令是將字節壓入棧頂,push1-push32依次代表將1字節-32字節推壓入棧頂,這里PUSH10x80和PUSH10x40表示將0x80和0x40壓入棧頂,故目前棧的布局如下:
?1:?0x40
?0:?0x80
MSTORE指令表示從棧中依次出棧兩個值arg0和arg1,并把arg1存放在內存的arg0處。目前來說棧中已無數據,這里將0x80存放在內存0x40處。
PUSH10x04將0x04壓入棧中,CALLDATASIZE指令表示獲取msg.data調用數據,目前棧的布局如下:
美聯儲監管副主席:美聯儲正與多機構開展加密監管合作:金色財經報道,美聯儲監管副主席Michael Barr在DC金融科技周表示,加密資產相關活動需要進行監督,以及確保加密服務提供商與其他金融服務提供商受到類似的監管保障措施。
美聯儲正在與美國貨幣監理署(OCC)和美國聯邦存款保險公司(FDIC)合作,以確保銀行可能參與的加密資產相關活動受到良好監管,以保護客戶和金融機構。另外,穩定幣也可能會對金融穩定構成風險,美聯儲也在該領域與其他監管機構合作。[2022/10/13 10:33:13]
?1:?calldata
?0:?0x04
LT指令表示將兩個棧頂的值取出,如果先出棧的值小于后出棧的值則把1入棧,反之把0入棧。這里如果calldata調用數據小于0x04字節,就將1入棧;如果calldata調用數據大于等于0x04字節,就將0入棧。目前棧的布局為:0:0或0:1。
繼續分析,PUSH10x49指令將0x49壓入棧頂,目前棧的布局為:
?1:0x49
?0:?0?或者?1
下面一條指令JUMPI指令表示從棧中依次出棧兩個值arg0和arg1,如果arg1的值為真則跳轉到arg0處,否則不跳轉。如果arg1值為1,則指令會跳轉到0x49處;如果arg1值為0,則會順序執行下一條指令。具體執行過程如下:
安全團隊:NFT項目Dope Ape Club Discord服務器遭攻擊,請勿點擊釣魚鏈接:7月9日消息,據CertiK監測,NFT項目Dope Ape Club的Discord服務器遭到攻擊。聊天被鎖定,攻擊者發布了一個釣魚鏈接。請社區用戶不要點擊鏈接、鑄造或批準任何交易。[2022/7/9 2:02:21]
這里我們先來分析順序執行的內容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指令則表示并未有函數簽名匹配,從而停止執行,回滾狀態。
總結
由于反匯編內容過多,我們分為兩篇分享給大家,本篇我們對反匯編的內容進行了詳細講解,下篇我們將會繼續分析并串聯所有指令,梳理代碼邏輯。
來源:金色財經
Tags:USHPUSH0X0ARGTUSHIPUSH價格0x0.ai: AI Smart ContractCHARGED價格
導語: ???成功的路上注定是孤獨的,逆向的交易注定是被質疑的!證實自己正確與否除了時間跟結果,別無其他.
1900/1/1 0:00:00國際黃金走勢分析: 技術面,周一黃金探底回升,周二延續向上反彈,目前最高上漲到1858一線,周線級別來看,周線級別調整結構沒有改變,目前價格突破5周均線阻力,下個阻力位于10周均線1871附近.
1900/1/1 0:00:00行情分析:以太坊從30分鐘圖來看,昨日最低觸及18980一線,報收小陰線,那么形態上,我們看今日早盤跌至580一線向上反彈.
1900/1/1 0:00:00????????????????????1小時看,大餅已經突破19500位置,布林帶向上開口,漲勢明顯.
1900/1/1 0:00:00DEFI的爆發和暴富神話可以說是2020年加密貨幣市場中不可不說的一大亮點。2017年,幣圈的熱點是ICO,2018年是IEO,2019年是挖礦交易,而2020年,則是DeFi挖礦.
1900/1/1 0:00:00截止12月16日09:00時,BTC全球均價現報19360.34美元,24H漲跌幅-0.05%,日內漲跌幅-0.25% 大盤走勢 BTC凌晨震蕩上漲,突破19500USDT.
1900/1/1 0:00:00