ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

OpenSPARC用ROMファイルを逆アセする方法

Twitterでヘッダーファイルのないテキスト領域の逆アセ方法が分からないとつぶやいたところ、バイナリアンな人達からアドバイスをもらいました。ありがとうございます。

http://twitter.com/yusk_/status/1240773710
http://shinh.skr.jp/m/?date=20090223

objdump -D -m i386 -b binary hello

OpenSPARCのROM(rom_harness.hex)を適当にバイナリファイル(rom_harness.bin)にして、試してみました。

YUKI.N>objdump -b binary -m sparc64-elf -D rom_harness.bin

rom_harness.bin:     file format binary

objdump: Can't use supplied machine sparc64-elf
YUKI.N>

YUKI.N>objdump -b binary -m elf64-sparc -D rom_harness.bin

rom_harness.bin:     file format binary

objdump: Can't use supplied machine elf64-sparc

sparc64-elfはgcc作成時に--target=で使った値、elf64-sparcはそのgccが作ったelfヘッダーに入っているフォーマットで、どちらを指定しても駄目でした。objdumpをsparc64-elf-objdumpに変更しても同じでした。

(追記)
sparc64-elf-objdump -b binary -m sparc -EB -D rom_harness.bin
で逆アセできました。

sparc64-elf-objdump -i でサポートしているターゲットの一覧を確認し、デフォルトでエンディアンが逆だったので-EBでエンディアンを指定しました。



しょうがないので、64bit SPARCのクロス環境からヘッダーだけ使う作戦を使いました。
もう以下の情報は必要無いのですが、せっかくなので残しておきます。

64bit SPARCクロス環境の構築

binutils-2.18.tar.gzとgcc-4.3.1.tar.gzをダウンロードしてきて、順に例のコマンドを打てばOKです。

YUKI.N>mkdir objdir
YUKI.N>cd objdir/
YUKI.N>../configure --target=sparc64-elf --prefix=/usr/local/sparc64-elf
YUKI.N>make
YUKI.N>make install

gccはエラーが出ますが、実行ファイルは作れました。

elfヘッダーの無いファイルを逆アセする方法

http://sources.redhat.com/ml/ecos-discuss/2001-08/msg00707.html
を参考に、arm-elf-xxxをsparc64-elf-xxxに置き換えます。

YUKI.N>echo > foo.c
YUKI.N>sparc64-elf-gcc -c -o foo.o foo.c
YUKI.N>sparc64-elf-objcopy --remove-section=.text foo.o
YUKI.N>sparc64-elf-objcopy --add-section=.text=rom_harness.bin foo.o
YUKI.N>sparc64-elf-objcopy --set-section-flags=.text=alloc,load,code,contents,readonly foo.o
YUKI.N>sparc64-elf-objdump -d foo.o

これで、foo.oの.textがrom_harness.binに置き換わったのでobjdumpが使えます。

rom_harnessの逆アセ結果

foo.o:     file format elf64-sparc

Disassembly of section .text:

0000000000000000 <.text>:
   0:	82 10 20 10 	mov  0x10, %g1
   4:	e2 f0 48 40 	stxa  %l1, [ %g1 ] (66)
   8:	a2 10 20 03 	mov  3, %l1
   c:	e2 f0 08 a0 	stxa  %l1, [ %g0 ] (69)
  10:	a3 48 00 00 	rdhpr  %hpstate, %l1
  14:	81 9c 68 20 	wrhpr  %l1, 0x820, %hpstate
  18:	82 10 20 18 	mov  0x18, %g1
  1c:	c0 f0 0a 01 	stxa  %g0, [ %g0 + %g1 ] (80)
  20:	c0 f0 0b 01 	stxa  %g0, [ %g0 + %g1 ] (88)
  24:	03 00 00 00 	sethi  %hi(0), %g1
  28:	82 10 60 00 	mov  %g1, %g1	! 0x0
  2c:	83 28 70 20 	sllx  %g1, 0x20, %g1
  30:	23 00 00 00 	sethi  %hi(0), %l1
  34:	a2 14 40 01 	or  %l1, %g1, %l1
  38:	a2 14 60 03 	or  %l1, 3, %l1
  3c:	e2 f0 09 60 	stxa  %l1, [ %g0 ] (75)
  40:	03 00 00 00 	sethi  %hi(0), %g1
  44:	82 10 60 00 	mov  %g1, %g1	! 0x0
  48:	83 28 70 20 	sllx  %g1, 0x20, %g1
  4c:	23 00 02 00 	sethi  %hi(0x80000), %l1
  50:	a2 14 40 01 	or  %l1, %g1, %l1
  54:	a2 14 60 00 	mov  %l1, %l1
  58:	8b 9d c0 00 	wrhpr  %l7, %htba
  5c:	82 10 20 30 	mov  0x30, %g1
  60:	84 10 00 00 	mov  %g0, %g2
  64:	c0 f0 4a 00 	stxa  %g0, [ %g1 ] (80)
  68:	c0 f0 8a a0 	stxa  %g0, [ %g2 ] (85)
  6c:	84 00 a0 08 	add  %g2, 8, %g2
  70:	80 a0 a2 00 	cmp  %g2, 0x200
  74:	12 bf ff fc 	bne  0x64
  78:	01 00 00 00 	nop 
  7c:	82 10 20 30 	mov  0x30, %g1	! 0x30
  80:	84 10 00 00 	mov  %g0, %g2
  84:	c0 f0 4b 00 	stxa  %g0, [ %g1 ] (88)
  88:	c0 f0 8b a0 	stxa  %g0, [ %g2 ] (93)
  8c:	84 00 a0 08 	add  %g2, 8, %g2
  90:	80 a0 a2 00 	cmp  %g2, 0x200
  94:	12 bf ff fc 	bne  0x84
  98:	01 00 00 00 	nop 
  9c:	c0 f0 0c 00 	stxa  %g0, [ %g0 ] (96)
  a0:	82 10 20 08 	mov  8, %g1
  a4:	c0 f0 0c 01 	stxa  %g0, [ %g0 + %g1 ] (96)
  a8:	a2 10 20 08 	mov  8, %l1
  ac:	c0 f4 44 20 	stxa  %g0, [ %l1 ] (33)
  b0:	a2 10 20 10 	mov  0x10, %l1
  b4:	c0 f4 44 20 	stxa  %g0, [ %l1 ] (33)
  b8:	a2 10 20 0f 	mov  0xf, %l1
  bc:	e2 f0 08 a0 	stxa  %l1, [ %g0 ] (69)
  c0:	03 00 00 00 	sethi  %hi(0), %g1
  c4:	05 00 01 00 	sethi  %hi(0x40000), %g2
  c8:	82 10 00 01 	mov  %g1, %g1
  cc:	84 10 00 02 	mov  %g2, %g2
  d0:	83 28 70 20 	sllx  %g1, 0x20, %g1
  d4:	84 10 80 01 	or  %g2, %g1, %g2
  d8:	87 48 00 00 	rdhpr  %hpstate, %g3
  dc:	8f 90 20 01 	wrpr  1, %tl
  e0:	03 00 00 00 	sethi  %hi(0), %g1
  e4:	82 10 60 00 	mov  %g1, %g1	! 0x0
  e8:	83 28 70 20 	sllx  %g1, 0x20, %g1
  ec:	23 00 00 00 	sethi  %hi(0), %l1
  f0:	a2 14 40 01 	or  %l1, %g1, %l1
  f4:	a2 14 60 00 	mov  %l1, %l1
  f8:	83 99 00 00 	wrhpr  %g4, %htstate
  fc:	8f 90 20 00 	wrpr  0, %tl
 100:	90 10 20 00 	clr  %o0
 104:	81 c0 80 00 	jmp  %g2
 108:	81 c0 80 00 	jmp  %g2
 10c:	81 c0 80 00 	jmp  %g2

rom_harness.binとACCESSES.txt中の逆アセ結果を比べました。

c:	    e2 f0 08 a0 	stxa  %l1, [ %g0 ] (69) # rom_harness.bin
00000400f0:	e2 f0 08 a0 	stxa  %l1, [ %g0 ] (69) # ACCESSES.txt

同じバイナリが同じ命令に逆アセできています。