拾い物のコンパス

まともに書いたメモ

Ubuntuでインストールできるradare2が古い時の対処法

Ubuntuapt/apt-getでインストールできるradare2が古いため、一部のコマンドが実行できないという話をブログや知り合いから聞くようになった。
初めて使うツールは動かないだけで使うのをやめてしまうことが多いだけに、割と深刻である。
というわけで、調査と対策をまとめてみた。

問題

Ubuntuは広く使われているディストリであるため、radare2を始める際にはaptで導入する人が多い(データ数は周りの4人・・・)。
しかし、現在(2017/10/6)提供されているパッケージは0.9.6と非常に古い(最新は1.6.0)。
そのため、コマンドが動かなかったり、わけわからん挙動を起こすことがある。

古いバージョンを使うことによる問題例

セキュリティコンテストのためのCTF問題集の初めにあるSelfReferenceのところでいえば、axtコマンドが使えない。

[0x0040526]> ax?
XXX: This command conflicats 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

[0x0040526]> ar?
XXX: This command conflicts with 'ax'
Usage: ar[?d-l*]
 ar addr [at] Add code ref pointing to addr (at is curseek)
 ard addr [at] Add data ref
 arj List refs in json format
 ar- [at] Clean all refs (or refs from addr)
 ar List refs
 ar* Output radare commands

コマンドが競合していると出る。
最新バージョン(1.6.0)では

[0x00201040]> ar?
|Usage: ar # Analysis Registers
| ar              Show 'gpr' registers
| ar0             Reset register arenas to 0
| ara[?]          Manage register arenas
| ar 16           Show 16 bit registers
| ar 32           Show 32 bit registers
| ar all          Show all bit registers
| ar <type>       Show all registers of given type
| arC             Display register profile comments
| arr             Show register references (telescoping)
| ar=             Show register values in columns
| ar? <reg>       Show register value
| arb <type>      Display hexdump of the given arena
| arc <name>      Conditional flag registers
| ard <name>      Show only different registers
| arn <regalias>  Get regname for pc,sp,bp,a0-3,zf,cf,of,sg
| aro             Show old (previous) register values
| arp[?] <file>   Load register profile from file
| ars             Stack register state
| art             List all register types
| arw <hexnum>    Set contents of the register arena
| .ar*            Import register values as flags
| .ar-            Unflag all registers

古いやつだとVisual Modeを使うとWebサーバが立ち上がることもあり、厄介だ。
この時はlocalhost:9090/enyo/からconsoleボタンを押せばWebページからコマンドライン操作できる。

対処策

2つ(+おまけ)考えた。

その1:ソースからビルド

機能的に最新。
どのディストリでも安定して実行できる。

$ git clone https://github.com/radare/radare2
$ cd radare2
$ sys/install.sh

その2:Ubuntuのtestingパッケージから新しいものを引っ張ってくる

unstable/testingパッケージであれば、新しいバージョンが提供されている。
Ubuntuaptで管理したいときはこれを使うとよい。
以降、作業。

まずはファイル作成。99targetはなかったら新規作成。一行書くだけ。

$ sudo vim /etc/apt/apt.conf.d/99target
[+] APT::Default-Release "stable"; 

testingをレポジトリに追加。

$ sudo vim /etc/apt/sources.list
[+] deb http://ftp.jp.debian.org/debian testing main contrib non-free
[+] deb-src http://ftp.jp.debian.org/debian testing main contrib non-free 

仕上げ。

$ sudo apt-get update

$ sudo apt-get install radare2/testing

(おまけ)ゼロバージョンって格好良いって思うんだ・・・

古いバージョン(0.9.6)のままで頑張らないといけない時もたまにある(時間やネット環境がない)。
とりあえずaxtコマンドの代替を探した話。

コマンドの違い

新旧(0.9.6/1.6.0)でコマンド体系が結構変わっているから、メモ。

version 0.9.6 ar: manage refs/xrefs
version 1.6.0 ar: like 'dr' but for the esil vm. (registers)

version 0.9.6 ax: manage code/call/data xrefs
version 1.6.0 ax: manage refs/xrefs (see also afx?)

0.9.6のarと1.6.0のaxが同じコマンドになっている(最新のarレジスタの表示)。
しかし、探してみてもrefを追加するコマンドはあるが、探すコマンドがない。
現状諦めるしかないんだろうか・・・。
古いやつでar-コマンドを使うとセグフォで落ちる。これはプログラム自体のバグでどうしようもなさそうだ。

調査結果

以降は各ディストリにおけるradare2のバージョンとかを調べた情報。
読まなくてもよい(まとめサイトへのリンクを載せているだけ)。

各ディストリにおけるバージョン情報

各ディストリが提供しているパッケージのバージョン情報はここにまとめられている(CentOSなど一部のディストリは載っていない)。
Ubuntuだけを見るのなら、16.04まではtrusty0.9.6となっている。最早江戸時代。
17.??では1.6.0と新しくなっている。
それ以前では、unstable/testingとして新しいバージョンを提供している。

Ubuntuの古いバージョン(16.xx以前)における状況

バグレポートでパッケージを新しくするよう要望とかは出ているみたいだが、返事が返ってきていないようだ。
一瞬自分でパッケージを更新しようと頑張ってみたが、やり方がわからなくて断念。知っている人がいたら教えてください。

最後に

radare2を始めた当時はIDAで十分だとかぼろくそに言われていたが、ちょっとずつ認知が進んでいるようだ。
楽しいradare2ライフを!

参考文献

Repology: versions for radare2

Debianでtestingやunstableからパッケージを借りる時の手順 - kotakのひまじめ日記

Bug #1529528 “Update the package to version 0.9.9” : Bugs : radare2 package : Ubuntu