スマートコントラクトの解体
猎豹区块链安全
2018-12-03 11:51
本文约4852字,阅读全文需要约19分钟
著者と一緒にスマート コントラクトの謎を解き明かしましょう

第 1 部 序文


あなたが 1969 年製のマスタング マッハを米国西部の道路で高速で運転しているところを想像してみてください。太陽の光が豪華な金メッキのリムを照らし、道路全体にはあなたと砂漠だけがあり、果てしなく続く地平線があなたとあなたの追跡を目撃しています。夕日。。。

リラックスして幸せな気持ちになっていると、突然大きな音が鳴り響き、335 馬力の快走馬は立ち上る白煙に巻き込まれ、たちまち蒸気機関車と化し、路肩に停車せざるを得なくなりました。

何が問題なのかを確認しようとしていますが、ボンネットを上げるとそれが読めません。このいまいましい機械がどのように機能するのか全く分からず、助けを呼ぼうと電話を手にとったところ、近くに電波が届かないことに気づきました...



上記の状況は、あなたが行っている DApp 開発と非常によく似ていますか? Dapp の開発プロセスでは、たとえて言えば、高級車がスマート コントラクトであり、リムや変更された箇所はよく考えられた細部に相当します。問題が発生すると、スマート コントラクトの EVM バイトコードから答えを見つける必要がありますが、ほとんどの場合、何が起こったのかわかりません。

あなたが Dapp 開発者で、上記の恥ずかしい状況に遭遇したことがあっても、もう心配する必要はありません。

なぜなら、この一連の記事の目的は、単純な Solidity コントラクトを分解し、そのバイトコードを確認し、それを最下位レベルまで認識可能な構造に分解することだからです。 Solidity のスポーツカーのボンネットを開けてみます。このシリーズが終わる頃には、EVM バイトコードの表示やデバッグに慣れてくるはずです。このシリーズは、Solidity コンパイラーによって生成された EVM バイトコードの謎を解くことに焦点を当てています。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 ”。

これら 2 つの詳細は非常に重要です。そうでないと、この記事で説明するバイトコードを表示できなくなります。

次に、[コンパイル] オプションに移動して [詳細] ボタンをクリックすると、Solidity コンパイラーによって生成されたすべての内容がポップアップ表示されます。そのうちの 1 つは、「オブジェクト」プロパティを持つ BYTECODE という JSON オブジェクトです。はコンパイルされたコントラクト コードであり、そのコードは次のとおりです。

608060405234801561001057600080fd5b5060405160208061021783398101604090815290516000818155338152600160205291909120556101d1806100466000396000f3006080604052600436106100565763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166318160ddd811461005b57806370a0823114610082578063a9059cbb146100b0575b600080fd5b34801561006757600080fd5b506100706100f5565b60408051918252519081900360200190f35b34801561008e57600080fd5b5061007073ffffffffffffffffffffffffffffffffffffffff600435166100fb565b3480156100bc57600080fd5b506100e173ffffffffffffffffffffffffffffffffffffffff60043516602435610123565b604080519115158252519081900360200190f35b60005490565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205490565b600073ffffffffffffffffffffffffffffffffffffffff8316151561014757600080fd5b3360009081526001602052604090205482111561016357600080fd5b503360009081526001602081905260408083208054859003905573ffffffffffffffffffffffffffffffffffffffff85168352909120805483019055929150505600a165627a7a72305820a5d999f4459642872a29be93a490575d345e40fc91a7cccb2cf29c88bcdaf3be0029

最初のレベルのタイトル


デプロイ契約

次に、Remix の Run セクションに移動します。まず、JavaScript VM を使用していることを確認してください。これは基本的に組み込み Javascript EVM + ネットワークであり、イーサリアムの理想的なトレーニングの場です。 ComboBox で BasicToken が選択されていることを確認し、Deploy 入力ボックスに数値 10000 を入力します。次に「デプロイ」ボタンをクリックしてデプロイします。これにより、作成した BasicToken スマート コントラクトのインスタンスがデプロイされ、ComboBox アカウントの最上部で現在選択されているアカウントが所有する 10,000 トークンの初期供給が行われ、設定したすべてのトークン供給が保持されます。

「実行」タブの「デプロイされたコントラクト」では、デプロイされたスマート コントラクトを確認できます。これには、コントラクトと対話するための 3 つのフィールド (transfer、balanceOf、totalSupply) が含まれています。ここで、デプロイしたばかりのスマート コントラクト インスタンスと対話できるようになります。

その前に、コントラクトの「デプロイ」が実際に何を意味するのかを見てみましょう。

ページ下部のコンソール領域には、「BasicToken の作成が保留中です...」というログが表示され、その後に from、to、value、data、log、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 コンパイラーで表示される内容と上記のものを比較してください。

これは実際にはコントラクトの逆アセンブルされたバイトコードです。生のバイトコードをバイトごとに (一度に 2 文字ずつ) スキャンすると、EVM は特定の操作に関連付けられた特定のオペコードを認識します。例えば:

0x60 => PUSH

0x01 => ADD

0x02 => MUL

0x00 => STOP

...

最初のレベルのタイトル


Opcode

スマート コントラクト コードの分解を開始する前に、PUSH、ADD、SWAP、DUP などの単一のオペコードを理解するための基本的なツールセットが必要です。最終的に、各操作には EVM のスタックからのみアクセスできます。 、メモリ、または所属 アイテムをプッシュするか、コントラクトのストレージからアイテムを消費します。

EVM が処理できるすべての利用可能なオペコードを確認するには、オペコードのリストを表示する Pyethereum を確認してください。各オペコードがどのように機能するかを理解するには、Solidity の公式アセンブリ ドキュメントも参考になります。生のオペコードと 1 対 1 の対応ではありませんが、かなり近いものです (実際には、Solidity と EVM バイトコードの間の中間言語である Yul です)。技術文書が読める方はイーサリアムイエローペーパーを読んでみてください、実は上記の内容に集約されます。

誰にでもお勧めできる資料はたくさんありますが、今からこれらのリソースを最初から最後まで読むことに意味はありません。そのような資料があることを覚えておいてください。必要なときに使用します。

命令

上記の逆アセンブリの各行は、EVM によって実行される演算命令です。各命令にはオペコードが含まれています。たとえば、命令の 1 つである命令 88 を考えてみましょう。これは、数字の 4 をスタックにプッシュします。この特定の逆アセンブラは次のことを説明します。

88 PUSH1 0x04

| | |

| | Hex value for push.

| Opcode

Instruction number

戦略


戦略

初めは不可能に思えた課題も、解体を続けることで実は解決可能な課題に分解できるものであり、私たちが遭遇する問題も例外ではありません。

逆アセンブルされたコードの分岐点を見つけて、非常に小さなチャンクに分割するまで徐々に分解していきます。これを Remix のデバッガで段階的に実行します。

下の画像では、逆アセンブルされたコードの最初の分割を確認できます (これについては次の投稿で完全に分析します)。


Cheetah ブロックチェーン セキュリティは、Kingsoft Internet Security のテクノロジーに基づいており、人工知能、NLP、その他のテクノロジーと組み合わせて、ブロックチェーン ユーザーに契約監査やセンチメント分析などのエコロジカル セキュリティ サービスを提供します。

*この記事は、Alejandro Santander によって媒体上で最初に公開され、Cheetah Blockchain によって翻訳および整理されました*

Cheetah ブロックチェーン セキュリティは、Kingsoft Internet Security のテクノロジーに基づいており、人工知能、NLP、その他のテクノロジーと組み合わせて、ブロックチェーン ユーザーに契約監査やセンチメント分析などのエコロジカル セキュリティ サービスを提供します。

Ratingtoken の公式 Web サイトにアクセスできます。もっと詳しく知る


猎豹区块链安全
作者文库