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 入れますしいじっても問題ない、という。