0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

バイナリーパッチ

Last updated at Posted at 2024-06-03

リバースエンジニアリングのためにバイナリにパッチを当てるスクリプトをrubyで作ってみました。

binpatch.rb
#
# binary path for reverse engineering
#

argc = ARGV.size
if argc >= 4 && argc % 2 == 0 then
  old = ARGV[0]
  new = ARGV[1]
  p = 2
  bindata = File.binread(old)
  while 2 + p <= argc
    offset = ARGV[p].hex
    inst = ARGV[p+1].hex

    bindata[offset] =  (inst >> 24).chr
    bindata[offset + 1] =  ((inst >> 16) & 0xff).chr
    bindata[offset + 2] =  ((inst >> 8) & 0xff).chr
    bindata[offset + 3] =  (inst & 0xff).chr
    p = p + 2
  end
  File.binwrite(new, bindata)
else
  print "usage: binpatch.rb oldfile newfile offset data\n"
end

使い方は

% ruby binpatch.rb org.bin new.bin 0x100 0xffff0010

0xffff0010は置き換える32bitの値でMIPSELの命令で無限ループになります。

これでオリジナルのバイナリーにパッチを当ててどこまで進んでいるか調べようと思ったのですが、逆アセンブラを自力で流れを追って、書き換える場所を探す必要があり、条件で通らないところもあり、あまり有効な方法ではありませんでした。

パッチ当てて、イメージ作って、Flashに焼いて、実機に実装して実行して確認していたのですが、効率が非常に悪いです。

パッチはcmp -lやobjdump -Dなどで確認できます。

FreeBSDにはbspatchというコマンドがありますが、これはbsdiffで作ったバイナリ形式のdiffでパッチを当てることができて、任意のパッチは当てられないようです。

パッチは無限ループの他に、NOPや不正命令で例外を吐かせる方法なども考えられます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?