#Ethernautに挑戦してみた
本記事はEthernautの勉強会に参加した感想やまとめの備忘録のような記事です。
2月15日(火) 18:00~19:00にBlockbase(株)でCryptoZombiesを修了したレベルの人向けに開かれたSolidityのコードの脆弱性に関する勉強会に参加しました。勉強会で用いた資料がEthernautです。勉強会はEthernautのやり方の説明、実際の問題を参加者で考える形式で行われました。Ethernautの問題については1~3までを勉強会で進め、記事では問題1と2についてまとめました。問題3のCoin Flipについては自分の理解が足りてないため、後ほどまとめようと思ってます。勉強会に参加することは初めてでしたが、様々な方の意見が参考になり一人で勉強するよりタメになることが多いと感じました。また、いつの日かに勉強会を開くらしいので興味があれば勉強会に参加してみてください。
####Ethernautとは
Ethernautはスマートコントラクトの脆弱性をsolidityのソースコードから見つけ、その脆弱性をついた攻撃をするハッキングのゲームです。Ethernautはここからでアクセスできます。以下から実際に問題を解くまでの流れを自分なりにまとめました。
1. Fallback
Fallbackでは以下の条件 1.「契約書の所有権を主張する」、2.「契約書の残高を 0 にする」を満たせばクリアできます。言い換えるとコントラクトのオーナーのアドレスを自分のアカウントアドレスに置き換え、コントラクト内の残高を全額引き出す攻撃をします。
コントラクトのソースを見ると、receive関数内の
require(msg.value > 0 && contributions[msg.sender] > 0);
を満たした状態でreceive関数(Fallback関数)を呼び出すことでオーナーの所有権を主張できると考えられます。
先程の条件のcontributions[msg.sender] > 0);
の部分を満たすためにはcontribute関数を実行した後、recive関数(Fallback)関数を呼び出します。このようにすることで1.「契約書の所有権を主張する」を満たせます。
次にオーナーのアドレスが満たされた後widthdraw関数を実行するとコントラクト内の残高を全額引き出せ、コントラクトの残高を0にすることができます。つまり2.「契約書の残高を 0 にする」を満たせ、問題をクリアできます。
2. Fallout
2.Falloutではコントラクトの所有権を主張することで問題を解けます。ソース見てコンストラクターの名前がFal1outとなっていることに気づければ簡単にオーナーの所有権を取得できます。Fal1out関数を実行すると簡単にオーナーをトランザクション送信者のアカウントアドレスに書き換えられ、問題をクリアできます。
3. Coin Flip
この問題については後ほど深く理解してからまとめます。