智能合約安全系列文章反彙編·下篇

2020-12-25 零時科技new

前言

上篇我們詳細分析了智能合約反彙編後的代碼內容,包括多個反彙編指令的含義,數據在棧中的存儲方式,並通過上下文關聯關係梳理代碼邏輯。本篇我們將繼續分析上篇遺留的反彙編代碼,通過上篇學習我們已對反彙編指令在棧和內存存儲的有了一定了解,該篇我們將重點來分析反彙編指令表示的代碼邏輯。

反彙編內容

合約原始碼

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) {

if (n <= 1) { return 1; }

return n * self(n - 1);

}

}

上篇文章中,我們對下圖中藍色框中的內容進行了詳細分析,本篇我們分析紅色框中的內容以及之後的反彙編指令。

反彙編分析

我們從label_004E開始分析,從反彙編上篇文章中可知,執行0x4e是上一步中判斷後證明該函數籤名是為a()函數,接下來我們來看0x4e中指令的主要含義:

(CALLVALUE)獲取交易中的轉帳金額,(DUP1)複製轉帳金額值到棧頂,(ISZERO)把棧頂轉帳金額值出棧,如果該值是0則把1入棧,否則把0入棧。(JUMPI)這裡如果轉帳金額值為0,(PUSH1 0x59)該段指令就會跳轉到0x59;如果轉帳金額不為0,則順序執行下一行指令。由此可知該段指令主要是為了判斷a()函數是否存在轉帳操作。

執行完後,目前棧中就只存在一條數據:轉帳金額值

這裡我們先來看label_004E順序執行:

通過上圖0055部分可以看出,PUSH1 0x00和DUP1指令在這裡均無實際意義,這部分最終結果為停止執行,回滾狀態。

接下來,我們來看跳轉後0059指令內容:(pop)把棧頂值出棧,也就是轉帳金額值;(PUSH1 0x60和PUSH1 0x8a)將0x60和0x8a依次壓入棧中;(JUMP)跳轉到棧頂0x8a位置。

如圖008a指令處,依次壓入0x00,0x94,0x02,0xab,目前棧中布局如下:

4:0xab

3:0x02

2:0x94

1:0x00

0:0x60

之後JUMP指令將跳轉至00AB,如上圖。該段指令中:(PUSH1 0x00,PUSH1 0x01)依次將0x00和0x01壓入棧;(DUP3)複製當前棧中第三個值0x02放入棧頂;(GT)把棧頂兩個值出棧,先出棧的值0x02大於後出棧的值0x01,把1入棧;(ISZERO)把棧頂值1出棧,該值不是0把0入棧;繼續(ISZERO)把棧頂值1出棧,該值是0把1入棧;(JUMPI)這裡棧頂值為1,(PUSH1 0xbe)跳轉到0xbe。

這裡注意壓入的0x02就是a()函數中調用self(2)函數傳入的值。

接下來我們對a()函數的內部操作進行一個全面的梳理

下圖為a()函數調用self()函數並賦值後的反彙編指令代碼邏輯圖:

上圖的反彙編指令操作數值在棧中的布局如下所示:

以上兩張圖中指令執行邏輯均已進行標註,對於每個指令的操作含義就不一一介紹,我們直接來看分析之後,重點的指令操作。通過008A段中PUSH1 0x02將2壓入棧中;00AB段中DUP3將2複製到棧頂,並利用GT指令將2和1進行了對比;00BE段中DUP4將2複製到棧頂,並利用SUB指令達到(2-1),最終得到相減的數值後繼續跳轉到00AB中對該值和1進行對比;接下來00B7段和00CD段沒有實際意義,只是對一些數值進行調整;繼續看00C8段中DUP3將複製到棧頂,並利用MUL指令將2和1(也就是2-1的值)進行相乘,並將所得值壓入棧中,之後的0094段和0060段含義是將棧中數值進行調整,並將計算偏移量最終輸出返回值。

故此我們可以得出a()函數的輸入值後的代碼邏輯為以下:

function a() public returns (uint256) { self(2); }

function self(uint n) internal returns (uint256) {

if (n <= 1) { return 1; }

return n * self(n - 1);

}

由於彙編指令較多,這裡就不進行全面分析,需要深入學習的同學可移步反彙編二:反彙編2

總結

本篇文章我們分享了如何通過反彙編指令分析得到智能合約原始碼邏輯,看似一段簡單的智能合約代碼,但反彙編出來的彙編指令卻非常多。我們在之前的文章中也分享了通過分析反編譯代碼得到智能合約原始碼邏輯,所以對於智能合約編譯部署後的opcode,建議大家選擇適合自己的逆向方式。

solidity智能合約逆向工具推薦:

https://ethervm.io/decompile

https://contract-library.com/

https://github.com/crytic/ida-evm

https://github.com/comaeio/porosity

https://github.com/meyer9/ethdasm

相關焦點

  • 零時科技 | 智能合約安全系列文章反彙編·上篇
    前言通過上一篇反編譯文章的學習
  • CTF技能寶典之智能合約 重入漏洞
    前言近年來,各個大型CTF(Capture The Flag,中文一般譯作奪旗賽,在網絡安全領域中指的是網絡安全技術人員之間進行技術競技的一種比賽形式)比賽中都有了區塊鏈攻防的身影,而且出現的題目絕大多數都是區塊鏈智能合約攻防。此系列文章我們主要以智能合約攻防為中心,來剖析智能合約攻防的要點,前兩篇我們分享了合約反編譯,反彙編的基礎內容。
  • 零時科技丨CTF技能寶典之智能合約 整數溢出漏洞
    前言近年來,各個大型CTF(Capture The Flag,中文一般譯作奪旗賽,在網絡安全領域中指的是網絡安全技術人員之間進行技術競技的一種比賽形式)比賽中都有了區塊鏈攻防的身影,而且出現的題目絕大多數都是區塊鏈智能合約攻防。此系列文章我們主要以智能合約攻防為中心,來剖析智能合約攻防的要點,前兩篇我們分享了合約反編譯,反彙編的基礎內容。
  • 常見的三種智能合約攻擊手法介紹
    面對頻頻爆發的安全事件,慢霧特推出區塊鏈安全入門筆記系列,向大家介紹區塊鏈安全相關名詞,讓新手們更快適應區塊鏈危機四伏的安全攻防世界。 隨著區塊鏈智能合約數量的與日俱增,隨之暴露出來的安全問題也越來越多,攻擊者常能利用漏洞入侵系統對智能合約用戶造成巨大損失,據 SlowMist Hacked 統計,截止目前僅 ETH、EOS、TRON 三條鏈上因智能合約被攻擊而導致的損失就高達 $126,883,725.92,具有相同攻擊特徵的手法更是呈現出多次得手且跨公鏈的趨勢,接下來我們將為大家介紹近年來一些常見的智能合約攻擊手法
  • Hardcore|以太坊中智能合約攻擊和漏洞百科全書
    無限操作在這種情況下,區塊氣限額可能是一個問題,即向一系列地址發送資金。即使沒有任何惡意,這也很容易出錯。僅僅是因為有太多的用戶需要付費,就可以最大限度地超出氣體的限額,並阻止交易的成功。這種情況也可能導致攻擊。假設一個壞的參與者決定創建大量的地址,每個地址從智能合約中支付少量資金。
  • Hardcore | 以太坊中智能合約攻擊和漏洞百科全書
    無限操作在這種情況下,區塊氣限額可能是一個問題,即向一系列地址發送資金。即使沒有任何惡意,這也很容易出錯。僅僅是因為有太多的用戶需要付費,就可以最大限度地超出氣體的限額,並阻止交易的成功。這種情況也可能導致攻擊。假設一個壞的參與者決定創建大量的地址,每個地址從智能合約中支付少量資金。如果有效地執行,則可以無限期地阻止事務,甚至可能阻止進一步的事務處理。
  • 智能合約開發必讀:這 10 個 Solidity 常見安全問題值得關注...
    文章僅代表作者觀點,不代表火星財經官方立場。小編:記得關注哦來源:登鏈社區原文標題:智能合約開發必讀:這 10 個 Solidity 常見安全問題值得關注智能合約安全堪憂,了解 2020 年 Solidity 常見的 10 個安全問題。
  • 各種開源彙編、反彙編引擎的非專業比較
    如果要對彙編指令進行分析和操作,要麼自己研究Intel指令集寫一個,要麼就用現成的開源引擎。自己寫太浪費時間,又是苦力活,還容易出錯,所以還是使用現成的好一點。  這裡對我曾使用過的比較流行的反彙編引擎做個比較,我使用過的反彙編引擎有:  1.
  • 什麼是智能合約?什麼是DAPP?
    程式設計師可以在以太坊區塊鏈上寫下「智能合約」,這些以太坊智能合約會根據代碼自動執行。以太坊是什麼?以太坊經常與比特幣相提並論,但情況卻有所不同。比特幣是一種加密貨幣和分布式支付網絡,允許比特幣在用戶之間轉移。以太坊項目有更大的目標。正如Ethereum網站所說,「以太坊是一個運行智能合約的分布式平臺」。
  • 研報丨硬核解析智能合約漏洞原理
    撰文:Chen Bo Yu、Hsu Tzu Hsiu智能合約基礎介紹在探討智能合約漏洞解析之前,我們先從一個基本的範例來了解一個智能合約會具備哪些元素。DASP(Decentralized Application Security Project)收錄了十種智能合約漏洞,下面我們整理了其中最常見的合約漏洞以及新型態的攻擊模式。
  • 首發| SushiSwap仿盤 YUNO與KIMCHI智能合約漏洞或存安全隱患
    北京時間8月31日和9月1日,CertiK安全研究團隊發現Sushiswap仿盤的兩個項目YUNo Finance (YUNO)與KIMCHI.finance (KIMCHI),其智能合約均存在漏洞。如果利用該漏洞,智能合約擁有者可以無限制地增發項目對應的代幣數目,導致項目金融進度通脹並最終崩潰。
  • TRONCOIN波場幣智能合約怎麼樣
    目前市面上有很多智能合約的盤: troncoin波場幣智能合約跟其他項目如何對比 ①合約佔比率:就是手續費能量消耗的那個合約佔比率,一般很多的智能合約,能量消耗的:合約佔比率0%,或者是只有1%。而用戶佔比率100%,甚至99%‼️ 第一點:為什麼查詢合約地址,我們要先看這一點呢?
  • 如何寫一個Solidity智能合約
    如何寫一個Solidity智能合約 鏈三豐 發表於 2019-09-05 11:17:50 想像一下,你正在寫一個Solidity智能合約,其中一個屬性可以被描述為類型或狀態
  • 兩大智能合約籤名驗證漏洞分析
    可重入(Reentrancy)或整數溢出漏洞,是大多數開發人員知道或者至少聽說過的,關於智能合約當中容易出現的安全問題。另一方面,在考慮智能合約的安全性時,你可能不會立即想到針對密碼籤名實現的攻擊方式。它們通常是與網絡協議相關聯的。
  • 如何開發一個屬於自己的Chainlink智能合約
    如何開發一個屬於自己的Chainlink智能合約 Chainlink 發表於 2019-09-06 10:37:10 Chainlink是領先的區塊鏈項目之一,它構建了第一個為智能合約提供外部數據的去中心化預言機網絡
  • 美國安全審計公司CERTIK完成去中心化借貸協議TLC智能合約代碼審計
    CERTIK官網公告信息:美國當地時間11月6日,美國區塊鏈安全審計公司CERTIK完成Super Trister去中心化借貸協議TLC智能合約代碼審計,並發布安全審計報告,審計結果未發現重大或關鍵或主要漏洞。
  • TRONCOIN波場智能合約制度是什麼
    波場COIN智能合約是什麼?波場COIN主要是交易所購買波場幣存入波場智能合約公鏈上的一個平臺。在波場公鏈上完全智能化,去中心,無任何人操控。動靜收益達到3.1倍回報,然後出局。復而投獲得繼續的回報。公鏈上隨時提取,數據透明。制度控制完美彰顯長久之勢!希望各位小夥伴來鑑賞鑑別波場COIN!
  • 美國安全審計公司CERTIK完成去中心化借貸協議TLC智能合約代碼審計...
    CERTIK官網公告信息:美國當地時間11月6日,美國區塊鏈安全審計公司CERTIK完成Super Trister去中心化借貸協議TLC智能合約代碼審計,並發布安全審計報告,審計結果未發現重大或關鍵或主要漏洞。
  • Nervos聯合Cardano技術開發公司IOHK,以打造更安全的智能合約
    律動 BlockBeats 消息,12 月 16 日,公鏈項目 Nervos 宣布與全球區塊鏈公司、Cardano 區塊鏈的技術開發公司 IOHK 達成長期合作關係,共同致力於降低智能合約給不斷增長的 DeFi 領域帶來的安全風險。
  • 深度分析DeFi智能合約的數據質量問題
    在DeFi應用價值飛速增長的同時,發展創新型DeFi生態系統並且提升其安全和可靠性也成為了一項重要工作。 區塊鏈的「預言機問題」備受關注,有許多文章專門研究了這一課題。然而,關於預言機「數據質量」的問題卻存在許多未知和誤解,這種誤解源自於許多人覺得預言機可以傳輸鏈下數據,也可以自己產生高質量的數據。