TryHackMe 歴1ヵ月半が参加する Advent of Cyber 2022 [Day 8]

8日目。

[Day 8] Last Christmas I gave you my ETH

分野は Smart Contracts。contract ってなんぞ~。契約です

世の中は実は目に見えない「契約」が多数存在しており、契約に対する「条件」をみたすことで「取引」が成立する。それらを定義し、プログラムで自動化したのがスマートコントラクト、といったところか。買い物の自動化みたいなイメージが浮かんだので自販機とかまさにそうだなぁと。ただ自販機だと身近すぎてすごさがいまいちよくわかんない……。

If not already completed, download the zip folder attached to this task, and open Remix in your preferred browser.

No answer needed

What flag is found after attacking the provided EtherStore Contract?

ファイルをロードした後はまずコンパイル。忘れずにファイルが開かれていることを確認してコンパイルへ移行する。

解説通りコンパイラ0.8.10+commit.fcxxxxxx を選択して与えられた両ファイルをコンパイルする。コンパイルが終わったら左端の Deploy & run transactions アイコンを押して実行環境へ。

まず CONTRACT(Compiled by Remix)で EtherStore - EtherStore.sol を選択して Deploy する。Attack - Attack.sol は Deployed Contracts にある ETHERSTORE のアドレスをコピーして貼り付けてから Deploy する。

これで下方にある Deployed Contracts には ETHERSTORE と ATTACK が Deploy される。これらを開くと各関数が見える。

あとは上方の VALUE の値を 1 に、単位を Ether にして下方の ATTACK にある赤い attack をクリックして実行する。

実行後、攻撃が成功すると右下のコンソールログにフラグが現れる。

別解: EtherStore.sol をよく覗くと何かが見えてくるかもしれない……。

Are you up for a little challenge to celebrate Day 8? Try your hand at these easy challenge rooms: Quotient and Agent T!

No answer needed

解説

……で、これは結局何をやっているんだ!?となるわけである。スマートコントラクトにおける Re-entrancy Attack については日本語でも解説してあるサイトがある。

recruit.gmo.jp

今回のコードを見ると EtherStore.sol の32行目で攻撃者側の Fallback 関数を呼んでいて、これがループするということはなんとなくわかる。ループを抜けるとその回数分フラグが表示されるのもなんとなくわかる。しかし、withdraw 関数のループだけで EtherStore の残高が減って攻撃者の手持ちが増える理屈がよくわからない……。

感想

なんだかよくわからないまま終わってしまってモヤモヤが残る。だれかこの猿でもわかる丁寧な解説をくれと願うばかりである(できれば日本語で)。