はじめに
CpawCTFや「詳解セキュリティコンテスト」でリバースエンジニアリングの学習をしようとしたところ、ほとんどの問題でx86_64アーキテクチャの実習環境が前提となっていました。対してM1,M2 Macはarm64アーキテクチャが採用されているため、解析対象のバイナリファイルなどがそのまま実行できません。
今回は仮想化ツールのUTMを用いて、M2 Mac上にx86_64なUbuntuの仮想環境を構築したので、アーキテクチャの知識も含めて紹介しようと思います。
CPU アーキテクチャ
2つのCPUアーキテクチャ(ARM,x86)と、それぞれ実装される命令セットの特徴をまとめてみました。この章を読まなくても環境構築に支障はないので、急ぎの方は読み飛ばしてください。
ちなみに命令セット(ISA) とはCPUを動作させるための命令語の体系です。
命令そのものの仕様の他に、レジスタの数や種類、割り込みや例外処理の方式、メインメモリの番地の指定の仕方など、プロセッサ内部の基礎的な設計や仕組みなども定義します。
この命令セットが同じであれば、異なる内部設計のプロセッサでも同じ機械語プログラム(バイナリコード)をそのまま動作させることができます。
ARM
イギリスのARM社が設計・ライセンスを行っているアーキテクチャで、PCだけでなく組み込み機器やスマホ、タブレットに広く使われています。
命令セットはRISC(Reduced Instruction Set Computer)と呼ばれるシンプルな仕様が特徴で、固定長の少数の単純な命令のみを備え、実行効率を向上させることを目的としています。
x86 / x64
米インテル(Intel)社がパソコン向けに開発・製造を行っているアーキテクチャで、現在のPCはほとんどx86かx64が使用されています。x86が32bit、x64(x86_64)が64bitのマイクロプロセッサの名称となります。
命令セットはCISC(Complex Instruction Set Computer)と呼ばれ、複雑で高度な機能を持つ命令語を多く用意しており、一つの命令で複合的な処理や複雑な処理を行うことができます。
1. UTMをダウンロードする
https://mac.getutm.app/ から「Download」を選択すると、UTMを無料でインストールして利用することができます。Mac App Storeで有料版も公開されていますが、無料版でもかなり使い勝手が良いと感じます。
2. Ubuntuのisoファイルをダウンロードする
https://jp.ubuntu.com/download からUbuntuのisoファイルをダウンロードします。Ubuntu Desktop 22.04.1 LTSを選択してください。
この画面を下にスクロールすると、ARM版のUbuntuサーバーをインストールできる項目もあります。Apple Silicon Macでは本来そちらを使う方が高速で処理が行えるので、x86_64アーキテクチャにこだわらない場合はそちらを選択してください。
3.UTMでUbuntuをインストール
UTMを開いて「新規仮想マシンを作成」を選択すると、下のような画面が表示されます。説明にあるように「仮想化」はネイティブのCPUアーキテクチャなら利用することができ、高速に処理を行うことができます。今回はx86_64版のUbuntuを利用したいので、「エミュレート」を選択します。
※追記
「仮想化」がサクサク動くのに対して「エミュレート」はかなり重いので気をつけてください。(; - ;)
メモリやCPUのコア数を好みの値に設定し、「続ける」をクリックします。
同様にストレージも好みの値に設定し、「続ける」をクリックします。
ゲストとホストで共有できるディレクトリを指定することができます。
ここでは設定せずに、「続ける」をクリックします。
名前を「Ubuntu(x86_64)」に変更し、「保存」をクリックします。
3.Ubuntu(x86_64)を起動する
左側にUbuntu(x86_64)が追加されたので、再生ボタンのマークをクリックして起動します。
次のような画面が表示されたら
言語を設定し、「Ubuntu」をインストールを選択します。
Macを利用しているので、キーボードのレイアウトはJapanese(Macintosh)を選択します。
次のような画面が表示されたら、「通常のインストール」を選択します。こだわりのない場合はサードパーティ製のソフトウェアもインストールしておきます。
次のような画面が表示されたら、「ディスクを削除してUbuntuをインストール」を選択します。
お疲れ様です。インストールが終わるまで気長に待ってください。
おまけ:バイナリファイルを開いてみる
CpawCTFのレベル1にある「Can you execute ?」という問題を解いてみます。
fileコマンドを使って与えられたファイルがどの環境で実行できるのかを調べます。
~$ 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
出力からx86_64アーキテクチャのLinuxで実行できるバイナリファイルだということがわかります。試しにARMの環境で実行しようとしてみると、以下のように実行環境によるエラーが起きます。
~$ ./exec_me
bash: ./exec_me: cannot execute binary file: Exec format error
今回構築したx86_64のUbuntu上で実行したところ、無事にFLAGをゲットできました。
~$ ./exec_me
cpaw{Do_you_know_ELF_file?}
おわりに
今回はUTMを使うことで、Apple Silicon Macの上にx86_64アーキテクチャのLinux環境を構築しました。異なるCPUアーキテクチャを動かすには多くの処理が必要になるため、ネイティブに比べてかなり重くなるようです。