radare2のインストールで詰んでた話
まえがき
どうも皆さんこんにちは、よもぎです。Twitterアカウント新しく作ったので良かったらどぞ(@ctyomogi)。ちょもぎに名前を変えようかしら。
新しくパソコンを買いまして、ゲーム勉強がはかどっている日々ですが*1、おかげさまで仮想マシンを用意できる様になったぞい!やったね!
潤沢なHDD容量を手に入れ、もううはうはです。
追記 (2018/10/22)
このエントリは体験記みたいな感じになってしまいました。 手っ取り早く知りたい人はこちらをどうぞ
なぜ仮想マシンを?
SECCON beginners CTF 2018の開催が決定されたこともあり、ぼちぼちCTFのお勉強を勧めているのですが、自力でオンラインの問題で解くのは割と無理が出てきてしまいました。
そこで、CTF問題集にチャレンジしてみよう!となったのが数週間前の話。*2
針が立っていないハリネズミ本です。本の内容は実際のCTFを模して課題ファイル(あるいはURLなど)が与えられて、それを解くフローを解説していく感じです。
んで、一問目から解こうとしたら
ここで私はこう思いました。
問題自体はSelfReferenceというファイルのバイナリ解析なんですが、
$ file SelfReference SelfReference: ELF 32-bit LSB executable, Intel 80386, (略) $ ./SelfReference -bash: ./SelfReference: cannot execute binary file: Exec format error
まあ、そうなるよね。だってこのUbuntu、x86_64だもの、ELF 32-bit動かないもん。
しかし、このままでは先に進めません。何も勉強できません*3
ここで以下の2つを考えました
ここでまず手軽にできそうな1.の方法を試してみました。
こちらの方法が結構紹介されているのですが、自分のBash on Ubuntu on Windows環境じゃだめでした。(このサイトが一番簡潔にまとまっていると思います)
まあ多少古いエントリなので時代も変わってしまったのでしょう。
そこで仕方なく2.を試してみようということで、いろいろ探しました。
仮想環境@Ubuntu 32bit
調べてみると、Ubuntuさんは17.10以降は32bit版以降のイメージファイルを配布していないっぽい。そこで探すのはUbuntu 16.04 LTS の32bit版(i386)
Ubuntu 16.04.5 LTS (Xenial Xerus)
ここからisoファイルをダウンロードしました。これ見つけるのにも一苦労しました。Virtualboxを用いて順調に仮想環境を構築*4していきました。
Radare2に苦しめられて
第一章 今インストールしたのは昔のやつでーーす
さて、問題集のフローでは、Radare2というソフトウェアを用いてバイナリ解析をしていきます。CUIライクでなんとなくデバッガを動かしている感じです。
脳死で
$sudo apt-get install radare2
を実行。無事インストールできた*5
それで、$r2 ./SelfReference
を実行して、問題集のとおりにコマンドポチポチしてたら
[0x080485f0]> axt <hogehoge> XXX: This command conflicts with 'ar' Usage: ax[-cCd?] [src] [dst] axc sym.main+0x38 sym.printf ; add code ref axC sym.main sym.puts ; add call ref axd sym.main str.helloworld ; add data ref ax- sym.main str.helloworld ; remove reference
え? なんでエラー吐くんですか?
ためしにradare2 -v
でversionを確認してみると
radare2 0.9.6 @ linux-little-x86-32 git.0.9.6 commit: 1: build: 2014-04-10
一方で、本ではradare2 1.5.0を使うらしい……このversion違いで、コマンドとかが変わってくるみたい。
どうやら、Ubuntuのパッケージリストは古いものだったりするらしい。いまさっきインストールしたばっかりなのに……
第二章 やったね最新版!あれ?動かないよ?
いま出回ってる最新版は2.5.0ということで、インストールする方法を探して見たらこんなエントリが
やった! これで勝った!!! 最新版をゲットすれば、もう怖いものなしだ!
ということで、sudo apt-get install git
してから、手順に則ってradare2の最新版をインストールしていくわけです。
$ sys/install.sh
して待つこと数分……ビルド途中に時々現れるwarningの文字が気になっちゃうけど、そして
collect2: error: ld returned 1 exit status Makefile:88: ターゲット 'libr.so' のレシピで失敗しました make[3]: *** [libr.so] エラー 1 Makefile:100: ターゲット 'libr.so' のレシピで失敗しました make[2]: *** [libr.so] エラー 2 Makefile:28: ターゲット 'all' のレシピで失敗しました make[1]: *** [all] エラー 2 Makefile:55: ターゲット 'all' のレシピで失敗しました make: *** [all] エラー 2
とかでてるけどキニシナイ
で、やってみると
$ r2 ./SelfReference bash: /usr/bin/r2: そのようなファイルやディレクトリはありません
ん?? どうした? さっきインストールしたよね?
ということで、コマンド投げても反応せず……失敗
第三章 自前ビルドがだめならば非安定版からインストールすればいいじゃない
失敗しても諦めず別の方法を探すよもぎさん。たどりついたのは
でした。よし! これで試してみるぞ! とやってみたら、
$ sudo apt install radare2 Reading package lists... Done E: The velue 'stable' is invalid for APT::Default-Release as such a release is not available in the sources
だめやないかーい またしても 失敗
第四章 疲れが見え始めたブログエントリ
第二章では自前ビルドでやってみたのですが、これはver2.5.0だからなってしまうのでは? という仮説のもと、1.5.0のデータをgithubからダウンロードして、sys/install.sh
して自前ビルドをしてみました。
自分の環境では、tar.gzを解凍したときにRead onlyなんちゃらのエラーメッセージがでて、一部しか解凍できなかったので、ホストOSのWindowsでzipを解答したファイルをゲストOSのUbuntuに渡しました
まあ、第二章と同じエラーメッセージで失敗したんですけどね
最終章 結果を言うと倒しました
さて困難続きのradare2でしたが、ついに、なんとかなりました!
大体は第三章で紹介したブログエントリのやり方、つまり非安定版をインストールするってやつなのですが、99targetファイルに追加した文章を消すことでインストールができました(じっさいには#をつけてコメントアウト)
$ sudo apt-get install radare2 (略) $ r2 -v radare2 2.4.0 0 @ linux-x86-32 git.2.4.0 commit: HEAD build: 2018-03-05__09:42:17
やった! ちょっとまえのだけどインストールできました!
無事に axt
コマンドも動くことを確認しました
おわりに
長々と見ていただきありがとうございました。乱文乱筆は失礼。
"最終章"だけにこのブログの価値があるかもしれないので、だいぶいらない部分が多いですね。
問題集の方では、非自明な環境構築は端折らないでほしかった(刊行当時でもapt-getで1.5.0は導入できなかっただろうし……とはいえ自前ビルドで通ってた可能性もある)
そもそもELF 32bitLSBを動かしてみよう、とする奇特な人は過去の存在であり、
なんで32bitの環境がほしいの?(いみわからん)
みたいな反応が多かったです。つらい。まあなんとかなったので良かったです。
課題やる時間が溶けました。睡眠時間も溶けました。