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