reverse engineering of blockchain smart contracts · run the contract constructor execute once to...

60

Upload: others

Post on 06-Jun-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

16 June 2018

REcon Montreal 2018

Reverse Engineering

Of Blockchain

Smart Contracts

© QuoScient | REcon Montreal 2018

Page 2: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

Whoami

Patrick Ventuzelo

@Pat_Ventuzelo

QuoScient GmbH

► Security Researcher/Engineer

Quolab

► Threat Intel & Response Platform

► Collaborative, Decentralized

Research

► Smart contracts, WebAssembly, …

Support Intelligence Operations

► Transaction tracking

► Vulnerability analysis

© QuoScient | REcon Montreal 2018 206/16/2018

Page 3: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

Company

► Security audit

► Bytecode Optimization

Threat intelligence team

► Transaction tracking

► Analyze smart contract interactions

Users/ICO

► Due diligence

► Understand the Logic

Security researcher

► Bug hunting

► Vulnerability research

© QuoScient | REcon Montreal 2018

Smart contracts analysis for…

306/16/2018

Page 4: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

Smart contract applications

© QuoScient | REcon Montreal 2018 406/16/2018

Page 5: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

Today’s talk…

WILL NOT be about:

► Blockchain concepts (PoW/PoS/BTF/Merkle trees/Mining)

► Cryptography (SHA-3/Keccak/RIPEMD160)

► TheDAO/Parity bug/[Insert Your Hack Here]

► If you should HOLD or NOT…

WILL BE about:

► Smart contracts

► VM implementations

► Assembly language & Instructions set

► Disassembly / CFG reconstruction

► Octopus

► https://github.com/quoscient/octopus

© QuoScient | REcon Montreal 2018 506/16/2018

Page 6: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

6© QuoScient | REcon Montreal 2018 06/16/2018

0

1.

2.

3.

Page 7: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”
Page 8: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

What is Ethereum?

“Ethereum is a decentralized platform that runs smart contracts: applications that run exactly as programmed without any possibility of downtime, censorship, fraud or third-party interference.”

Create by Vitalik Buterin & Gavin Wood - 2013

► White paper: Description of the project

► Yellow paper: Ethereum's formal specification (Technical)

► Open source

Ethereum Virtual machine (EVM)

Smart contracts

► Application stored & execute on the blockchain

► ÐApps (Decentralized Application)

8© QuoScient | REcon Montreal 2018 06/16/2018

Page 9: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

© QuoScient | REcon Montreal 2018

Ethereum full node

A node is:

► Piece of Software

► Connected to other nodes

► Maintains locally a copy of the blockchain

906/16/2018

Geth

► Golang

► Major full node

► Ethereum foundation

Parity

► Rust

► Fast, secure, light

► Parity team

~ 60% ~ 35%

Page 10: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

Smart contract application - ÐApps

Fro

nt-

End

10

Back-End

WEB UI

Smart contracts

© QuoScient | REcon Montreal 2018 06/16/2018

Transactions

Page 11: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

Smart contract creation process

© QuoScient | REcon Montreal 2018 11

Development, deployment & interaction

https://doi.org/10.1016/j.future.2017.08.02006/16/2018

Page 12: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

© QuoScient | REcon Montreal 2018 12

Development languages

VyperSolidity

06/16/2018

Page 13: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

RemixOnline Web IDE for Solidity smart contracts development

13

.sol

.abi

.evm

© QuoScient | REcon Montreal 2018 06/16/2018

Page 14: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

Smart contract creation process

© QuoScient | REcon Montreal 2018 14

Development, deployment & interaction

https://doi.org/10.1016/j.future.2017.08.02006/16/2018

Page 15: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

Existing contracts on etherscan.ioOnly bytecode is mandatory to create a contract account

.sol

.abi

.evm

.evm

Page 16: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

Bytecode decomposition

Loader code

► Run the contract constructor

► Execute once to store the runtime code on the blockchain

► Can be present in “Contract creation code” on etherscan.io

Runtime code

► Stored on the blockchain

► Executed for each transaction with the contract

Swarm Hash (a.k.a. bzzhash)

► Merkle tree hash use to retrieve the content of the associated persistent storage of the contract

► Concatenated at the end of the code

► Magic number: 0x627a7a72 (bzzr)

16

608060405234801561001057600080fd5b5060405161039b380

38061039b833981018060405281019080805182019291905050

50336000806101000a81548173fffffffffffffffffffffffff

fffffffffffffff021916908373ffffffffffffffffffffffff

ffffffffffffffff16021790555080600190805190602001906

10089929190610090565b5050610135565b8280546001816001

16156101000203166002900490600052602060002090601f016

020900481019282601f106100d157805160ff19168380011785

556100ff565b828001600101855582156100ff579182015b828

111156100fe5782518255916020019190600101906100e3565b

5b50905061010c9190610110565b5090565b61013291905b808

2111561012e576000816000905550600101610116565b509056

5b90565b610257806101446000396000f300608060405260043

61061004c576000357c01000000000000000000000000000000

00000000000000000000000000900463ffffffff16806341c0e

1b514610051578063cfae321714610068575b600080fd5b3480

1561005d57600080fd5b506100666100f8565b005b348015610

07457600080fd5b5061007d610189565b604051808060200182

810382528381815181526020019150805190602001908083836

0005b838110156100bd57808201518184015260208101905061

00a2565b50505050905090810190601f1680156100ea5780820

380516001836020036101000a031916815260200191505b5092

50505060405180910390f35b6000809054906101000a900473f

fffffffffffffffffffffffffffffffffffffff1673ffffffff

ffffffffffffffffffffffffffffffff163373fffffffffffff

fffffffffffffffffffffffffff161415610187576000809054

906101000a900473fffffffffffffffffffffffffffffffffff

fffff1673ffffffffffffffffffffffffffffffffffffffff16

ff5b565b6060600180546001816001161561010002031660029

00480601f016020809104026020016040519081016040528092

919081815260200182805460018160011615610100020316600

2900480156102215780601f106101f657610100808354040283

529160200191610221565b820191906000526020600020905b8

1548152906001019060200180831161020457829003601f1682

01915b50505050509050905600a165627a7a72305820df97826

8dd1593a7bbc753bfb0404d8353b4c6ced383d8107c926d5003

e40c060029

© QuoScient | REcon Montreal 2018 06/16/2018

Page 17: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

Ethereum Virtual Machine

17

Architecture

Stack machine

Turing complete

Instruction set ~180 Opcodes

Memory type

Stack volatile byte-array (list [])

Memory volatile byte-array (list [])

Storage persistent key-value database

(dictionary {})

SSTORE

SLOAD

MSTORE

MLOADCALLDATALOAD

(user-supplied data)

© QuoScient | REcon Montreal 2018 06/16/2018

Page 18: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

EVM Instructions set

Opcodes value Family Examples

0x00 – 0x0B Stop and Arithmetic

Operations

STOP, ADD, SUB,

MUL, DIV, EXP

0x10 – 0x1A Comparison & Bitwise

Logic Operations

LT, GT, EQ, ISZERO,

AND, XOR

0x20 SHA3 SHA3

0x30 – 0x3E Environmental

Information

ADDRESS, CALLER,

CALLDATALOAD

0x40 – 0x45 Block Information BLOCKHASH,

COINBASE, NUMBER

0x50 – 0x5B Stack, Memory, Storage

and Flow Operations

POP, MSTORE, JUMP,

JUMPI, JUMPDEST

0x60 – 0x7F Push Operations PUSH1 – PUSH32

0x80 – 0x8F Duplication Operations DUP1 – DUP16

0x90 – 0x9F Exchange Operations SWAP1 – SWAP16

0xA0 – 0xA4 Logging Operations LOG0 – LOG4

0xF0 – 0xFF System operations CALL, RETURN,

DELEGATECALL

18© QuoScient | REcon Montreal 2018 06/16/2018

Page 19: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

Control flow instructions

Opcode Simplify description Basic block position

JUMP Unconditional jump Last instruction

JUMPI Conditional jump Last instruction

RETURN , STOP

INVALID

SELFDESTRUCT , REVERT

Halt execution Last instruction

JUMPDEST Marks a position within the code

that is a valid target destination

for jumps

First instruction

19

EIP 615: Subroutines and Static Jumps for the EVM By Greg Colvin

New branch opcodes: JUMPTO, JUMPIF, JUMPSUB, JUMPSUBV, ….

© QuoScient | REcon Montreal 2018 06/16/2018

Page 20: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

Static analysis only works if:

► Jump target offset is pushed on the stack

► Just before the JUMP/I

And fails if:

► Stack operations are used to put the jump target on top of the stack

© QuoScient | REcon Montreal 2018 20

Static analysis vs dynamic analysis

Edges identifications

???

Stack

operations

06/16/2018

Page 21: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

Control Flow Graph (CFG) reconstruction

Static analysis Dynamic analysis (stack evaluation)

21© QuoScient | REcon Montreal 2018 06/16/2018

Page 22: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

Simplify visualization of the smart contract CFG

22© QuoScient | REcon Montreal 2018 06/16/2018

Page 23: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

Dispatcher function

Runtime code entry point is usually a Dispatcher function

► Switch on the first 4 bytes of the transaction payload

► execute the associated code of the given function signature.

Two functions signatures here:

► 41c0e1b5

► cfae3217

23

FUNC_OFFSET

FUNC_HASH

© QuoScient | REcon Montreal 2018 06/16/2018

Page 24: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

Functions identification - Depth First SearchDispatcher function & 7 callable functions

24© QuoScient | REcon Montreal 2018 06/16/2018

Page 25: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

Transaction payload

Function signatures/identifiers: First 4 bytes of the sha3 (keccak256) of the function prototype text

Composition :

► Signature (function ID)

► Argument #1 (address)

► Argument #2 (uint)

Arguments size: 256-bits words

© QuoScient | REcon Montreal 2018 25

Function prototype string 4-bytes signature

“kill()” 0x41c0e1b5

“greet()” 0xcfae3217

“attack(address,uint)” 0x6ebb6d80

06/16/2018

Page 26: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

Functions name & arguments type recovery

© QuoScient | REcon Montreal 2018 26

Function signature reverse lookup database - https://www.4byte.directory/signatures/

06/16/2018

Two functions signatures here:

► 0x41c0e1b5 - “kill()”

► 0xcfae3217 - “greet()”

Page 27: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

EVM Disassembler available

© QuoScient | REcon Montreal 2018

Quolab

► Octopus/IDA/BinaryNinja integrate

Capstone

► Support EVM

Etherscan.io

► ByteCode To Opcode Disassembler

Ethersplay

► Binary ninja plugin

evmdis

ethdasm

IDA-EVM

► IDA Processor Module for the Ethereum Virtual Machine (EVM)

2706/16/2018

Page 28: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

Decompilation & IR SSA

Porosity by Comae

Decompiler

Github

EthRays by Ret2

Decompiler

Octopus by QuoScient

IR SSA (WIP)

Quolab or Github

Rattle by Trail of bits

IR SSA

© QuoScient | REcon Montreal 2018 2806/16/2018

Page 29: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

Simplify your analysis with IR

Static single assignment (SSA)

► IR (Intermediate representation)

► each variable is assigned once

► each variable is defined before being used

Ryan will give you more detail on that ;)

© QuoScient | REcon Montreal 2018 29

Instruction SSA Optimize SSA

PUSH1 0x03 %0 = #0x03

PUSH1 0x05 %1 = #0x05

ADD %2 = ADD(%1, %0) %0 = ADD(#0x05, #0x03)

PUSH1 0x09 %3 = #0x08

MUL %4 = EQ(%3, %2) %1 = EQ(#0x08, %0)

06/16/2018

Page 30: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

© QuoScient | REcon Montreal 2018 3006/16/2018

Octopus - Ethereum

Page 31: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”
Page 32: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

Beginning of Neo

AntShares (ANS) in 2014.

► Founded by Da Hongfei and Erik Zhang

► Rebranded as Neo in 2017.

► Often named as:

► “China’s first blockchain platform”

► “Chinese Ethereum”

Smart Economy

► Digital assets

► Digital identity

► Smart contracts

Ðapps – Decentralized application

► http://ndapp.org/

© QuoScient | REcon Montreal 2018 3206/16/2018

City Of Zion

Open-Source CommunityThe Neo Project

Official Neo project

Page 33: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

© QuoScient | REcon Montreal 2018 3306/16/2018

Page 34: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

NeoVM implementations & architecture

© QuoScient | REcon Montreal 2018 3406/16/2018

Neo-vm

► Official NEO Virtual Machine

► The Neo project

Neo-python

► Python Node and SDK

► City Of Zion

Page 35: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

Compilation to AVM bytecode

neon

neoj

neo-boa

© QuoScient | REcon Montreal 2018 3506/16/2018

Page 36: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

Neo

bytecode

(.avm)

Page 37: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

Neo Virtual Machine #1Execution engine & Stacks

Architecture

Stack machine

Turing complete

Instruction sets ~180 Opcodes

4 type of Memory

Evaluation Stack

(Compute stack)

volatile array (list [])

Alt Stack

(Standby stack)

volatile array (list [])

Invocation Stack

(Call stack)

volatile array (list [])

Storage persistent key-value database

(dictionary {})

© QuoScient | REcon Montreal 2018 3706/16/2018

Page 38: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

AVM Instructions set

Opcodes value Family Examples

0x00 – 0x60 Constants PUSH0, PUSHBYTES1 – PUSHBYTES75,

PUSH1 – PUS16

0x61 – 0x69 Flow control NOP, JMP, JMPIF, JMPIFNOT, CALL, RET,

SYSCALL

0x6A - 0x7D Stack DUPFROMALTSTACK, TOALTSTACK, DROP,

DUP, ROLL, SWAP

0x7E – 0x82 Splice CAT, SUBSTR, LEFT, RIGHT, SIZE

0x83 – 0x8A Bitwise logic INVERT, AND, OR, XOR, EQUAL

0x8B – 0xA5 Arithmetic INC, DEC, SUB, MUL, SHL, SHR, BOOLAND, LT,

GT, MAX, MIN

0xA6 – 0xAE Crypto SHA256, HASH160, CHECKSIG

0xC0 – 0xCB Array ARRAYSIZE, UNPACK, SETITEM, APPEND

0xF0 – 0xF1 Exceptions THROW, THROWIFNOT

Really similar to Bitcoin Script with Turing completeness

38

Neo-VM source code: https://github.com/neo-project/neo-vm/blob/master/src/neo-vm/OpCode.cs

© QuoScient | REcon Montreal 2018 06/16/2018

Page 39: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

Neo Virtual Machine #2

SYSCALL opcode with API name as parameter

► used to communicates with the outside

NEO namespace: ~60 API methods

► Query the blockchain

► Neo.Blockchain.GetHeight

► Neo.Transaction.GetHash

► Manipulate the persistent store (Storage)

► Neo.Storage.Get, Neo.Storage.Put

System namespace: ~4 API methods

► access of the execution environment

► System.ExecutionEngine.GetEntryScriptHash

Interactive Service Layer

© QuoScient | REcon Montreal 2018 3906/16/2018

Page 40: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

Disassembling

40© QuoScient | REcon Montreal 2018 06/16/2018

neo-debugger-tools (C#)

► CLI-Disassembler

Octopus (Python)

► NeoDisassembler Class

► Quolab or github

Page 41: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

Decomposition into basic blocks & functions

Opcode Simplify

description

Role

JMP Unconditional

jump

Last instruction

JMPIF,

JMPIFNOT

Conditional jump Last instruction

RET Halt execution Last instruction

THROW,

THROWIFNOT

Halt execution Last instruction

41© QuoScient | REcon Montreal 2018 06/16/2018

Page 42: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

CFG using static analysis

AVM functions

► First function is the Main function

► Other function are following

Function code

► Linear list of instructions.

► End with RET instruction

42© QuoScient | REcon Montreal 2018 06/16/2018

Main function

Entry point

Page 43: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

© QuoScient | REcon Montreal 2018 4306/16/2018

Octopus - Neo

Page 44: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

EOS

Page 45: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

What’s EOS?

“The Most Powerful Infrastructure for Decentralized Applications”

► Open source smart contract platform

► Mainnet will be launch *soon*

Created by Daniel Larimer

► White paper in 2017

Smart contract

► Written in C++

► Compiled to WebAssembly

© QuoScient | REcon Montreal 2018 4506/16/2018

Page 46: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

WebAssembly (Wasm)

“WebAssembly (abbreviated Wasm) is a low-level assembly-like language with a compact binary format that runs with near-native performance and provides languages with low-level memory models such as C++ and Rust with a compilation target so that they can run on the web.”

WebAssembly goals:

► Be fast, efficient, and portable (near-native speed)

► Easily readable and debuggable (Wast)

► Keep secure (safe, sandboxed execution environment)

► Don't break the web

Supported by LLVM

► LLVM Backend

© QuoScient | REcon Montreal 2018 4606/16/2018

Page 47: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

© QuoScient | REcon Montreal 2018 47

Virtual machine specification

Stack machine

Compiled code is immutable at runtime

Abnormal behavior triggers traps

Linear memory

► Bounds-checked array

Functions

► Calls specify by index using static index table

► Type signature check at runtime

Control-flow integrity (CFI)

► Direct/Indirect call targets are valid functions

► Branches point to a valid destination

06/16/2018

Page 48: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

WebAssembly third-party libraries in EOS

Binaryen

► compiler infrastructure and toolchain library for WebAssembly

WAVM

► standalone VM for WebAssembly

© QuoScient | REcon Montreal 2018 4806/16/2018

Page 49: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

EOS Node RCE Vulnerability by Qihoo 360

EOS WASM Contract Function Table Array Out of Bounds

► http://blogs.360.cn/blog/eos-node-remote-code-execution-vulnerability/

assert() only works in Debug build but doesn’t work in a Release build.

© QuoScient | REcon Montreal 2018 49

Date: 05/29/18

Out Of Bound Write

06/16/2018

Page 50: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

More than 12 bugs in one week by guido

© QuoScient | REcon Montreal 2018 50

Date: 06/04/18

06/16/2018

Page 51: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

© QuoScient | REcon Montreal 2018 51

Source code / Wasm / Wast

Source code

► Eosio standard library

Wasm module

► Magic number ‘\0asm’

► Binary format

► Compact

► Easy to verify

► 11 different sections

Wast

► Text format

► Body of a function (Text column) is a linear list of low-level instructions.

06/16/2018

Page 52: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

Decode & Disassembly

Wasm decoder & disassembler library

► Python module

► Octopus

► EosDisassembler class

WABT: The WebAssemblyBinary Toolkit

► wasm-objdump

► Wasmcodeexplorer

► Simple WebAssembly binary file explorer

► Available online

© QuoScient | REcon Montreal 2018 52

Convert .wasm to .wast

06/16/2018

Page 53: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

EOS module text representation - sections

© QuoScient | REcon Montreal 2018 5306/16/2018

Page 54: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

EOS module text representation – function codes

© QuoScient | REcon Montreal 2018 5406/16/2018

Page 55: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

Function body

► Linear list of instructions

Parameters & return types

► type_sec[func_sec[func_id]]

► Only one return value ATM

Call flow

► call <func_id>

© QuoScient | REcon Montreal 2018 5506/16/2018

Name, parameters & return types, call flow

Function analysis

CALL

Name Arg & return types Type

Half (i32, i32) i32 Imported function

??? () () Start function (Internal)

double (i32, i32) i32 Exported function

Page 56: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

CFG reconstruction

© QuoScient | REcon Montreal 2018 5606/16/2018

Page 57: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

Security of WebAssembly

Natalie Silvanovich – Google Project Zero

Justin Engler & Tyler Lukasiewicz – NCC Group

WebAssembly security documentation: https://webassembly.org/docs/security/

© QuoScient | REcon Montreal 2018 5706/16/2018

Page 58: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

Conclusion

Analysis of Blockchain Smart contracts is a good way:

► to understand how blockchain work in general

► to discover new languages & ASM

► to start vulnerability research on blockchain nodes/VMs

Future of Octopus:

► IDA plugin

► SSA for all platforms

► ETH Symbolic Execution

► Decompilation

Just choose one to play with…

© QuoScient | REcon Montreal 2018 5806/16/2018

Page 59: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

Thanks & Question

Patrick Ventuzelo / @Pat_Ventuzelo / [email protected]

Octopus - https://github.com/quoscient/octopus

© QuoScient | REcon Montreal 2018 5906/16/2018

Page 60: Reverse Engineering Of Blockchain Smart Contracts · Run the contract constructor Execute once to store the runtime code on the blockchain Can be present in “Contract creation code”

Radilostrasse 43

60489 Frankfurt

Germany

+49 69 33 99 79 38

[email protected]

www.quoscient.io

QuoScient

CONTACT