アルゴリズムとかオーダーとか

仕事で勉強したことなどをまとめてます

Ethernaut CTFでぼろぼろにされた話(次のためのメモ)

先日(ブログ記事執筆時だと一昨日) OpenZeppelinが主催するEthernaut CTFが開催されていました。

ctf.openzeppelin.com

こちら、オンライン参加可能なので色々と時間もできたタイミングだしということで参加してみました。土日なので本当は近場にお出かけ予定でしたが、優勝賞金でMacBook買ってあげるからという必死の説得によって妻にも参加OKをもらいました。
最終的にはタイトルにある通り全然解けなかったです。
次に参加するためにメモとして参加した後の反省点を残そうと思います。

成績

67 / 約300 でした。ほとんどの人が最初のボーナス問題ぐらいしか解けてないっぽい。

score result

問題

全部で9問でした。当日取り組んだのは4問のみ。残りはタイムアップで全然見れてない。。。

challenge

1問目 ボーナス問題

start.exe という問題。Etherscanのリンクが貼ってあり、該当ページに飛ぶとトランザクションの詳細画面が表示される。このトランザクションに埋め込まれたFlagをencodeして取得しろって問題だった。これは簡単にクリア。

2問目 フラッシュローン問題

SpaceBank という問題。よくあるフラッシュローン問題。フラッシュローン攻撃を仕掛けるContractを作成して無事にクリア。
最初、問題への取り組み方法が全くわからずに時間がかかった。。。

challenge detail

上記画像の通り、nc コマンドがあるのでこれを実行すると問題に取り組むための環境が構築される。private chain(多分、hardhatのdev-node)と問題のContractが展開される。
Challenge Contractが回答するためのContractでこいつがtrueを返すようにすればflagが取得できる。

3問目 EVM bytecodeを解析する問題

Ailen Spaceship という問題。
攻撃対象のContractにはソースコードがない。アドレスはわかっているので、そこからbytecodeを取得し、bytecodeを解析してSpaceshipの作戦行動を阻止するという問題。
Ethernaut にある、Three Gate問題とにたようなもの。これのソースコードなし版。
作戦完了とするための条件を1つずつ解除していって、最終的に作戦完了のフラグっぽいのを立てるとクリア。

流石にbytecodeを1つずつ読むのは辛いので、以下のサイトでDecompileして取り組んでみたけどクリアできず。。。
https://app.dedaub.com/decompile?md5=b89f6bb60a9f3b5fd90a54fccac841e2

最後の1つまで解除できたけど、最後の最後の解除にはEOAからは無理。ただ、Contractから実行する場合は、権限取得しないといけないが、その権限取得はEOAしかできないように作られていた。

EXTCODEHASHをハックする方法は多分なさげ?なので、なんかうまいことstorage領域を書き換える必要がありそう。特に作戦完了フラグは他のフラグとStorage領域を共有しているので、segmentation超えて書き換えするといいんだろうけどその方法がわからず。

4問目 Solidityのコード解析問題

Wombo Combo という問題。
StakingTokenとRewardsTokenの2つのTokenがあり、Staking ContractにStakingTokenを預けるとしばらく後にRewardsTokenがもらえるというContract。
ただし、Rewardの計算を行うにはOwnerが専用のメソッドを呼び出す必要がある。なんとかして、大量のRewardsTokenをゲットしたらクリア。

大体これ系の問題はOwnerを奪うことがクリアの前提。そのための手法は大体以下の2つ。

  • Storage addressのoverflowによるstorage汚染攻撃
  • DelegatecallによるStorage上書き攻撃

ただ、今回の問題はFowarderというものが用意されており、全体的な作りはEIP-4844のような感じで擬似トランザクションによる操作が可能になっていた。ということで、おそらくだがForwarderのバグをついて、msg.senderをOwnerと誤認させることでトリガーを引けばいいんだろうと予想。

が、そのバグが見つからないままタイムアップとなってしまった。。。。

反省点

反省というか、次に参加するときに準備しとくと良さそうなもののメモ

  • dissassembler: webにも転がってるけど、プログラムで解析できるようにjson形式とかで吐けるやつがあると良さそう
  • DELEGATECALL サーチャー: 大体攻撃する時はDELEGATECALL使うので、それがあるか、またある場合攻撃に使えるか調べてくれるやつ
  • Function call emulator: 特定の位置からFunction Callがスタートするので、擬似実行してstackやmemoryの状況をアナウンス・解析できるやつ

多分Alien Spaceshipは decompiler で削ぎ落とされたcode部分に答えが潜んでそうな気がしている。が、ちょっと脳内実行のみだとstackぐらいはトレースできてもmemoryまでトレースは難しかった。。。あとシンプルに時間がかかる。。。

ということで、次回はこの辺のツール準備して挑みたいところ。

ps. だれか回答ブログみたいなの書いてくれないかしら?解き方や僕が知らない攻撃手法があるのかなどすごく気になる。

最後に、次回の福岡ブロックチェーン勉強会では久々に Ethernaut で簡単CTF練習問題やります。この記事で興味出た人は是非!(イベント開催日はまだ未定です。早く決めないとだ。。。)
gbec.connpass.com