2019年3月28日木曜日

ELF弄りメモ Part.0 ~事前調査編~

耳がとんがってる妖精でも爆発するやつでもない、ELFファイル弄りです。
軽く弄って闇鍋に突っ込もうと思ってたんですけど、軽く弄れなかったので別記事で書くことになった次第です。自分で解釈したこと、弄ってみたこと中心に書いていきます。

やりたいこと

既存のELF実行ファイルに共有ライブラリ参照を追加し、そのライブラリの関数を実行する。

まずELFって?

Executable and Linkable Format(実行可能でリンク可能なフォーマット)の略。LinuxだけでなくBSDとかにも使われてるらしい。Linuxの実行ファイルや共有オブジェクト(.so)の形式はこれ。

構造 

図1 ELFファイルの構造(簡略)
ELFファイルは図1のような構造をしています。詳しい構造はこのスライドサイトが参考になります。
プログラムヘッダはセグメント毎、セクションヘッダはセクション毎に構造体を持っていて、それの塊がテーブルです。構造体の定義はLinuxの場合/usr/include/linux/elf.hにあるはずです。
セクションはそれぞれ役割があります。 またセクションは増えたり減ったりするためセクションヘッダを見ないとだめそうです。

かせつ

 以下のように考えています。
.interp、.shstrtab以外をうまく弄ればできそう?
.dynstrに読み込みたいライブラリ名と関数の文字列を書き込んで、.hashと.dynsymをそれに合わせてうまく描き替える
PLT→GOTもうまくやれるようにして.textから呼び出す
最後にヘッダ類を修正する

その他の参考サイト

http://warabanshi.hatenablog.com/archive/category/ELF
https://web.archive.org/web/20170607001117/http://www.hyuki.com:80/yukiwiki/wiki.cgi?WhirlwindTutorialOnCreatingReallyTeensyElfExecutablesForLinux



0 件のコメント:

コメントを投稿