irb とか

irb はバイナリどうこうするツールとして便利…というような話をスライド中の

irb(main):020:0> [0x00210001^0x6C4D6549].pack"L"
=> "Hell"

の部分で少ししたのですが、もっと色々できるように、ということでとりあえず機械語を命令に変換できるように .irbrc になんか書きました。

require 'tempfile'
def disasm(b, arch = 'i386')
  tmp = Tempfile.new('irb_disasm', '/tmp')
  if b.class == Array
    tmp.print(b.pack("C*"))
  else
    raise "type mismatch (#{b.class})"
  end
  tmp.close
  print `objdump -m #{arch} -b binary -D #{tmp.path}`
  nil
end

例えば別に push で fall through せんでもいい、と言った e_type, e_machine あたりは逆アセすると、

irb(main):001:0> disasm([2,0,3,0])

/tmp/irb_disasm18351.0:     ファイル形式 binary

セクション .data の逆アセンブル:

0000000000000000 <.data>:
   0:   02 00                   add    (%eax),%al
   2:   03 00                   add    (%eax),%eax
=> nil

って感じみたいです。 EAX はどうせ後で 4 入れますしいじっても問題ない、という。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h