わらばんし仄聞記

南の国で引きこもってるWeb屋さん

ELF

ELFファイルを作る part7

ELF

さて、前回のpart6でズルをする必要があったのは、分解する元のELFファイルがあり、各セクションの中身はその元のファイルのものをそのまま使用していた為である。 それ故、主に動的リンク関係のセクションについてのアドレスを全く同じになるよう調整する必…

ELFファイルを作る part6

ELF

part5からの続き 目標 ELFファイルから各セクションを抽出し、それらのセクションの情報からELFファイル全体を再構築する。 環境 opensuse12.3 ld-2.23.1 実装 元になるELFファイルや、各セクションの抽出についてはpart5を参照。やることはこの、part5で抽…

sh_addralign

ELF

ELFファイルを作る part5で取得した、セクション毎に分解されたデータを元にELFファイルを再構築していた際、出来上がったファイルをreadelf -aしたら readelf: Error: Unable to read in 0x10 bytes of version need aux (2) readelf: Error: Unable to rea…

ELFファイルを作る part5

ELF

ELFファイルを作るpart4で、ライブラリとのリンクについて詳細を追ってみる手順の案に書いていた ELFファイルを分解するプログラム、また、その分解したものから再生成するプログラム」これについて考えてみる。 まずは先だって分解をしてみる。 目標 ELFフ…

セクションとセグメントの対応 part2

part1でセクションとセグメントを対応付けしていると思われる箇所は見つけた。次は実際にどうやって対応づけているのかを見てみる。 おさらい 簡単なプログラムをコンパイルして出来上がった実行ファイルはこんな感じになる。 $ readelf -l test.out Elf fil…

セクションとセグメントの対応 part1

前回ELFファイルを作る part4にて、セクションをセグメントに割り当てる際は単純な構造ということもあって決め打ちでやってみてた。前回の様な規模ならまあいいとして、これがある程度セクションの数や種類が増えてきたらどうしようもなくなる。 これについ…

ELFファイルを作る part4

ELF

以前にELFファイルを作るpart3までで、値を直接指定してのELFファイル作成を行った。また、簡易brainf*ckコンパイラを作る part3では命令部分のコードを外部から指定し、それを実行出来る実行形式ファイルの出力を行った。 これらはいずれも外部ファイルとの…

簡易brainf*ckコンパイラを作る part3

ここまでで触れていたもので、準備は整った。本題に戻って、brainf*ckのコードをプログラムに読ませ、そのコードの実行ファイルを生成する。 具体的にどうするかを攫っておくと、 pythonでJIT(64bit版Linux環境) part3を元にして、読み込んだコードをネイ…

簡易brainf*ckコンパイラを作る part2

part1に引き続き、もう一点必要なものがある。 brainf*ckはそれぞれの命令以外に、少なくともサイズ30000のバイトの配列を持つ必要があり、これは今までgasの記法を主に使っている所で見られた .comm mem, 30000に相当する。 この領域をELFファイルに直接持…

簡易brainf*ckコンパイラを作る part1

pythonでJIT(64bit版Linux環境) part3でも軽く触れていたが、ここまでで作成していたELFファイルや、JITでやっていた事をまとめると、brainf*ckのコードを読み込ませてELFの実行ファイルを作成させる事ができる。要はbrainf*ckコンパイラを作成できる。 た…

ELFファイルを作る part3

ELF

part2では非常に単純化したELFファイルを作成しましたが、この状態から作成されるファイルに対してobjdump等を実行してもメインの実行コードについての情報が出てきません。 なので、今後進めていった際、不具合に遭遇した場合の問題解決を容易にするために…

ELFファイルを作る part2

ELF

part1では単純なELFファイルを作る際に埋め込む為の、極めて小さいアセンブラのコードを作りました。 なので、次はそのコードを入れる為の、ELFに則ったバイナリを作成する。 目標 ELFに則ったバイナリを作成し、その中にpart1で作成したコードを入れ、動作…

ELFファイルを作る part1

ELF

池袋バイナリ勉強会(7)に行ってきました。前回にも触れたように、先にJITで動作させていたバイナリ値をELFの中に組み込めればbfコンパイラが出来上がる。 というわけで、次のステップとしてELFファイルの作成へ。 目標 64bit用ELFの挙動を知るため、必要最小…