스마트 계약 해체
猎豹区块链安全
2018-12-03 11:51
本文约4852字,阅读全文需要约19分钟
저자와 함께 스마트 계약의 미스터리를 파헤쳐 보세요.

파트 1 머리말


당신이 1969년형 머스탱 마하를 타고 미국 서부의 도로를 빠르게 달리고 있고, 태양이 화려한 금도금 테두리를 비추고 있고, 전체 도로는 당신과 사막뿐이며, 끝없는 지평선은 당신과 당신의 추적을 목격하고 있습니다. 저무는 태양. . . . .

편안하고 행복한 기분이 들었을 때 갑자기 큰 소리가 났고 335 마력의 빠른 말이 부풀어 오르는 흰 연기에 휩싸여 순식간에 증기 기관차로 변해 길가에 멈출 수밖에 없었습니다.

무엇이 잘못되었는지 확인하려고 하지만 후드를 들어 올리면 읽을 수 없습니다. 당신은 망할 기계가 어떻게 작동하는지 전혀 모르기 때문에 전화를 들어 도움을 요청하지만 근처에 신호가 없다는 것을 알게 됩니다...



위에서 설명한 상황이 현재 하고 있는 DApp 개발과 매우 유사합니까? Dapp을 개발하는 과정에서 비유하자면 고급 자동차는 스마트 계약이고 테두리와 수정된 장소는 잘 생각한 작은 세부 사항입니다. 그리고 일단 문제가 생기면 스마트 컨트랙트 EVM 바이트코드에서 답을 찾아야 하는데, 대부분의 경우 무슨 일이 일어났는지 알 수 없습니다.

당신이 Dapp 개발자이고 위의 난처한 상황에 직면했다면 더 이상 걱정할 필요가 없습니다!

이 기사 시리즈의 목적은 간단한 Solidity 계약을 분해하고 바이트 코드를 살펴보고 인식 가능한 구조로 가장 낮은 수준으로 분해하는 것입니다. 우리는 Solidity의 스포츠카 후드를 터뜨릴 것입니다. 이 시리즈가 끝나면 EVM 바이트코드를 보거나 디버깅하는 것이 편할 것입니다. 이 시리즈는 Solidity 컴파일러에서 생성된 EVM 바이트코드를 이해하는 데 중점을 둡니다. 보기보다 훨씬 간단합니다.


다음은 분해할 때 사용할 스마트 계약 코드입니다.

pragma solidity ^0.4.24;

    contract BasicToken {


    uint256 totalSupply_;

    mapping(address => uint256) balances;

    constructor(uint256 _initialSupply) public {

    totalSupply_ = _initialSupply;

    balances[msg.sender] = _initialSupply;

    }


    function totalSupply() public view returns (uint256) {

    return totalSupply_;

    }


    function transfer(address _to, uint256 _value) public returns (bool) {

    require(_to != address(0));

    require(_value <= balances[msg.sender]);

    balances[msg.sender] = balances[msg.sender] - _value;

    balances[_to] = balances[_to] + _value;

    return true;

    }


   function balanceOf(address _owner) public view returns (uint256) {

   return balances[_owner];

   }

}

첫 번째 레벨 제목


계약 컴파일

계약을 컴파일하기 위해 Remix(주소: https://remix.ethereum.org)를 사용합니다.

Remix 컴파일러를 열면 파일 브라우저 영역 위 왼쪽 상단의 + 버튼을 클릭하여 새로운 스마트 계약을 생성합니다. 파일 이름을 BasicToken.sol로 설정합니다. 생성되면 위의 코드를 편집기에 붙여넣습니다.

오른쪽에서 "설정" 옵션으로 이동하여 "개인 모드 활성화"가 선택되어 있는지 확인합니다. 또한 선택한 Solidity 컴파일러 버전은

“ version:0.4.24 +commit.e67f0147.Emscripten.clang ”。

이 두 가지 세부 사항은 매우 중요합니다. 그렇지 않으면 이 문서에서 설명하는 바이트 코드를 볼 수 없습니다.

다음으로 Compile 옵션으로 이동하여 Details 버튼을 클릭하면 Solidity 컴파일러에 의해 생성된 모든 항목이 포함된 팝업이 표시됩니다. 그 중 하나는 "개체" 속성이 있는 BYTECODE라는 JSON 개체입니다. 컴파일된 계약 코드이며 코드는 다음과 같습니다.

608060405234801561001057600080fd5b5060405160208061021783398101604090815290516000818155338152600160205291909120556101d1806100466000396000f3006080604052600436106100565763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166318160ddd811461005b57806370a0823114610082578063a9059cbb146100b0575b600080fd5b34801561006757600080fd5b506100706100f5565b60408051918252519081900360200190f35b34801561008e57600080fd5b5061007073ffffffffffffffffffffffffffffffffffffffff600435166100fb565b3480156100bc57600080fd5b506100e173ffffffffffffffffffffffffffffffffffffffff60043516602435610123565b604080519115158252519081900360200190f35b60005490565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205490565b600073ffffffffffffffffffffffffffffffffffffffff8316151561014757600080fd5b3360009081526001602052604090205482111561016357600080fd5b503360009081526001602081905260408083208054859003905573ffffffffffffffffffffffffffffffffffffffff85168352909120805483019055929150505600a165627a7a72305820a5d999f4459642872a29be93a490575d345e40fc91a7cccb2cf29c88bcdaf3be0029

첫 번째 레벨 제목


계약 전개

그런 다음 Remix의 실행 섹션으로 이동합니다. 먼저 Javascript VM을 사용하고 있는지 확인하세요. 이것은 기본적으로 임베디드 Javascript EVM + 네트워크, 이상적인 이더리움 훈련장입니다. ComboBox에서 BasicToken이 선택되었는지 확인하고 Deploy 입력 상자에 숫자 10000을 입력합니다. 그런 다음 "배포" 버튼을 클릭하여 배포합니다. 이것은 우리가 설정한 모든 토큰 공급을 보유하고 있는 ComboBox 계정의 상단에서 현재 선택된 계정이 소유한 10,000개 토큰의 초기 공급과 함께 우리가 만든 BasicToken 스마트 계약의 인스턴스를 배포합니다.

"실행" 탭의 "배포된 계약"에서 계약과 상호 작용하는 세 가지 필드(transfer, balanceOf 및 totalSupply)가 포함된 배포된 스마트 계약을 볼 수 있습니다. 여기에서 방금 배포한 스마트 계약 인스턴스와 상호 작용할 수 있습니다.

그러나 그 전에 계약의 "배포"가 실제로 무엇을 의미하는지 살펴보겠습니다.

페이지 하단의 콘솔 영역에서 "BasicToken 생성 대기 중 ..." 로그와 from, to, value, data, logs 및 hash와 같은 다양한 필드가 포함된 트랜잭션 항목을 볼 수 있습니다. 이 항목을 클릭하여 트랜잭션 정보를 확장하면 위에서 언급한 트랜잭션 날짜, 입력 및 바이트 코드가 표시되어야 합니다. 따라서 자체 주소와 코드를 포함할 스마트 계약 인스턴스를 생성합니다.

첫 번째 레벨 제목


바이트코드 분해

콘솔 중앙의 트랜잭션 상자 오른쪽에는 "디버그" 버튼이 있습니다. 이 버튼을 클릭하면 Remix의 오른쪽 영역에서 Debugger 옵션이 활성화됩니다. 지침 섹션을 함께 볼 수 있으며 아래로 스크롤하면 다음과 같이 나타납니다.

000 PUSH1 80

002 PUSH1 40

004 MSTORE

005 CALLVALUE

006 DUP1

007 ISZERO

008 PUSH2 0010

011 JUMPI

012 PUSH1 00

014 DUP1

015 REVERT

016 JUMPDEST

017 POP

018 PUSH1 40

020 MLOAD

021 PUSH1 20

023 DUP1

024 PUSH2 0217

027 DUP4

028 CODECOPY

029 DUP2

030 ADD

031 PUSH1 40

033 SWAP1

034 DUP2

035 MSTORE

036 SWAP1

037 MLOAD

038 PUSH1 00

040 DUP2

041 DUP2

042 SSTORE

043 CALLER

044 DUP2

045 MSTORE

046 PUSH1 01

048 PUSH1 20

050 MSTORE

051 SWAP2

...(약어)

잘못되지 않았는지 확인하려면 실행 중인 Remix 컴파일러에 표시되는 내용을 위와 비교하십시오.

이것은 실제로 컨트랙트의 디스어셈블된 바이트코드입니다. 원시 바이트 코드를 바이트 단위로(한 번에 두 문자) 스캔하면 EVM은 특정 작업과 관련된 특정 opcode를 인식합니다. 예를 들어:

0x60 => PUSH

0x01 => ADD

0x02 => MUL

0x00 => STOP

...

첫 번째 레벨 제목


Opcode

스마트 계약 코드를 해체하기 전에 PUSH, ADD, SWAP, DUP 등의 opcode와 같은 단일 opcode를 이해하기 위한 기본 도구 세트가 필요합니다. 결국 각 작업은 EVM의 스택에서만 액세스할 수 있습니다. , 메모리 또는 소속 항목을 푸시하거나 계약의 저장소에서 항목을 소비합니다.

EVM이 처리할 수 있는 사용 가능한 모든 opcode를 보려면 opcode 목록을 표시하는 Pyethereum을 확인할 수 있습니다. 각 opcode가 어떻게 작동하는지 이해하려면 Solidity의 공식 어셈블리 문서도 좋은 참고 자료입니다. 원시 opcode와의 일대일 대응은 아니지만 꽤 가깝습니다(실제로는 Solidity와 EVM 바이트코드 사이의 중간 언어인 Yul입니다). 기술 문서를 읽을 수 있으면 Ethereum Yellow Paper를 읽을 수 있습니다.. 사실 위의 내용으로 모두 요약됩니다.

모든 사람에게 권장되는 문서가 너무 많지만 지금은 이러한 리소스를 처음부터 끝까지 읽을 필요가 없습니다. 그러한 자료가 있다는 것을 기억하고 필요할 때 사용할 것입니다.

지침

위의 디스어셈블리의 각 라인은 EVM에 의해 실행되는 작업 명령이며 각 명령에는 opcode가 포함되어 있습니다. 예를 들어 이러한 명령 중 하나인 명령 88은 숫자 4를 스택에 푸시합니다. 이 특정 디스어셈블러는 다음을 설명합니다.

88 PUSH1 0x04

| | |

| | Hex value for push.

| Opcode

Instruction number

전략


전략

처음에는 불가능해 보이는 어떤 작업도 지속적인 해체를 통해 실제로 해결할 수 있는 작업으로 분해될 수 있으며, 우리가 직면하는 문제도 예외는 아닙니다.

우리는 디스어셈블된 코드의 분기점을 찾고 매우 작은 덩어리로 분해될 때까지 점진적으로 분해할 수 있습니다. Remix의 디버거에서 단계별로 수행할 것입니다.

아래 이미지에서 디스어셈블된 코드의 첫 번째 분할을 볼 수 있습니다(다음 게시물에서 완전히 분석할 예정임).


Cheetah 블록체인 보안은 인공 지능, nlp 및 기타 기술과 결합된 Kingsoft Internet Security의 기술을 기반으로 블록체인 사용자에게 계약 감사 및 감정 분석과 같은 생태 보안 서비스를 제공합니다.

*이 기사는 Alejandro Santander가 매체에 처음 게시했으며 Cheetah Blockchain에서 번역 및 구성했습니다.*

Cheetah 블록체인 보안은 인공 지능, nlp 및 기타 기술과 결합된 Kingsoft Internet Security의 기술을 기반으로 블록체인 사용자에게 계약 감사 및 감정 분석과 같은 생태 보안 서비스를 제공합니다.

Ratingtoken의 공식 웹 사이트를 방문할 수 있습니다.더 알아보기


猎豹区块链安全
作者文库