🛠️

Macしかない環境でCTFをしようとした話

2024/11/23に公開2

初めに

初めまして、神山まるごと高専2期生のもりです!
最近CTFに出会って、とりあえず始めようとしたけど、苦難の連続だった話をまとめました
同じ環境の人助けてください

CTFとは?

Catch The Flagの略称で、その名の通り、プログラムファイルやデータベースに隠されたFlagと呼ばれる文字列を探してきて戦う情報セキュリティの分野の競技です

詳しくはwikipediaのCTFのページか、マンガでわかる!CTFとはを見るといいと思う

CTFとの出会い

うちの教師の人が日本最大級のCTFの大会SECCONの初代実行委員長だったらしく、簡単なCTFの問題でいわゆるシーザー暗号の問題をだしてくれて
それで元々暗号に興味があった+Webアプリケーションを作っていてセキュリティを強化したかったのもあってCTFを始めました。

サイト

いきなりSECCONには、技量的にも、団体競技なので人数も厳しい。そのため、過去問が載っているようなサイトと短期間・一人でできるタイプのCTFのサイトを使うことにしました

https://ctf.cpaw.site/index.php
https://alpacahack.com/
https://play.picoctf.org/

イメージは、普段はcpawCTFとpicoCTFをやって、alpacahackで月一くらいで行われる大会に出るのをイメージしてます(まだ参加したことないけど)
cpawCTFとpicoCTFは良問揃いで結構おきにいりです。ただしpicoCTFは英語なのでややとっつきにくさが個人的にはあってcpawを主にやってます。

あとは、kurenaifさんの動画を見ながらちょっとづつ課題の合間に勉強を進めている感じです。
https://www.youtube.com/@kurenaif

問題発生

順調に、1問目、2問目と問題を解いていると、3問目のQ7.[Reversing] Can you execute ?が解けないのです。

fileを使うと

zsh
mori:CTF/ 2024-11-17 file exec_me
exec_me: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=663a3e0e5a079fddd0de92474688cd6812d3b550, not stripped

この問題はLinuxで実行ファイルを動かさなければいけなかった
これ以外にもにこういったLinux前提問題にぶち当たり
「なんとしてでもLinux環境を作ってやる!!!!!」
と心にきめました

これがつい二週間前

UTMで仮想環境を作る

とりあえずLinuxの仮想環境を作らなくてはいけない
そこでUTMを使うことに
https://mac.getutm.app/

UTMはMac上で別のOSを起動できる仮想環境を作るツールです
しかし、結論から言うとゴミでした
UTMは「仮想化」と「シミュレーション」の二つがあります
仮想化は普通に別のOSをアプリケーションのように動かすのだが、シミュレーションすこし違う、おそらく別のCPUアーキテクチャの挙動を1から計算しているらしい。そのため動作がもっさりしてとてもじゃないがCTFなんかができるような状態じゃない
仮想化もなぜかはわからないが遅かった。シミュレーションでUbuntuを入れようとするとセットアップに30分近くかかった。仮想化では20分くらい。あまり大差がなく、どちらもひどい遅さなので結局UTMでなんとかするという計画は失敗してしまいました

先輩のWindowsを借りる

次にやったのは、先輩のパソコンでCTFをやったことだ。同じ寮に住む先輩もCTFを始めようとしており、しかもwindows持ちだった。好都合!!
windowsはWSL2というLinuxをそのまま動かせる機能が”標準”で付いている
https://www.kagoya.jp/howto/it-glossary/develop/wsl2_linux/
この記事を参考にしながらubuntuを入れて先輩のPCで実行ファイルを動かせた!
ついに問題を解く土俵に上がれたのだ!!!!!
しかし、このPCは先輩のもの、流石に毎回毎回借りるわけにもいかないし、今回借りたのも先輩の環境構築を代わりにやった延長でちょっと触っただけだったのであきらめた...

「自分自身の持つデバイスでLinuxを動かす」これを達成したい、、、
その一心で色々と考えていった

AndroidはLinuxベース

そこで思いついたのが手持ちのAndroidだ。Androidはよくわかんなかったけど、LinuxベースらしいのでアプリでLinuxが使える!!

とりあえずTermuxっていうLinuxが使えるアプリをダウンロード
https://play.google.com/store/apps/details?id=com.termux&hl=ja&pli=1
なんだけど、どうやらGoogle Playにあるバージョンが古いらしく、
https://f-droid.org/
このF-Droidっていうオープンソースのアプリを入れられるサイト?で最新版があるらしくそれをダウンロードしてきた。
Google Playは一応Googleのチェックが入っているのでウイルスとかが怖い人はやらなくてもいいと思う。

やってみるとこんな感じ
https://x.com/mori_kamiyama/status/1856640399420670197

あとは、こいつにssh接続すればOK
https://qiita.com/Maki-HamarukiLab/items/05ccabba68703a7d7892
この記事を参考にしよう

スマホ側で接続すると

zsh
ssh -p 8022 username@<TermuxのIPアドレス>

https://x.com/mori_kamiyama/status/1856659410564837626
こんな感じでわかりずらいけどPCからアクセスできるよ

しかし、問題が起こる

スマホのCPUはArm

このタイトルでわかると思う。
実はスマホのCPUは大体QualcommのArmベースのCPUが使われている。
Snapdragonとかはよく聞くんじゃないかな?
このArmアーキテクチャは低消費電力でスマホでよく使われるんだけど、色々なCPUの命令がパソコンで使われるx86と異なる。
つまり、CTFに出てくるようなPCのLinuxで動かす前提の実行ファイルは、x86アーキテクチャ用の実行ファイルで、Termuxでも実行できないのだ!!!!

悲しい

MacもArmベースだから、UTMがめっちゃ遅かった、つまり今までの大体の問題はArmのせいだったのだ。
正直、世界がArm中心に回って、CTFの問題がArmアーキテクチャの実行ファイルならいいのだが、多分あと数年は無理だろう。

MicrosoftのAI搭載PCが世界のスタンダードになって、Armアーキテクチャが世界の中心になることを願うしかない
辛い
https://www.microsoft.com/ja-jp/atlife/copilotpluspc

というわけで、MacしかないやつはCTFを諦めるしかない
それか、MicrosoftのAI搭載PCを買って世界をArm中心にしよう

Discussion

sankantsusankantsu

はじめまして
私も M2 Macbook (Arm64) 環境で数ヶ月前 CTF を始めようとした際、 環境構築の方針に苦労しました。
ネイティブ (or WSL) の x86_64 linux 環境を持っていないとなかなか大変ですよね...
現在は Macbook 上の QEMU による x86_64 エミュレーション環境で pwn 系の問題を解いています (おそらく UTM でもできるんじゃないかなとは思います、きちんと試してないですが)。
CPU レベルのエミュレーションなので遅いには遅いですが、Desktoop 環境をつけずに CUI 環境のみで使えば一応実用には耐える速度かなと思っています。
以前記事にまとめましたのでもしご参考になれば幸いに思います。
https://zenn.dev/sankantsu/articles/e213afb3eb76c7

だめぽだめぽ

こんにちは。

Arm64 Linuxの上でQEMU user mode emulationを使えばx86_64をエミュレーションする部分が最小限(ユーザーランドだけ)になって速度的にマシになるかもしれません。(私はCTFについては詳しくないので、カーネルもx86_64じゃないとダメな問題があったらごめんなさい。)

Arm64 LinuxはUTMやQEMUを使うなり、あるいはCanonicalが出しているMultipassというツールを使うとサクッと用意できます。私の感覚では仮想化(Arm64 MacでArm64 Linuxを動かす)だけなら極端に遅いということはない気がするので、コア数やメモリの割り当てを見直してみると良いかもしれません。