2013-10-01から1ヶ月間の記事一覧

【ELF形式】.dynstr セクション

前回見たように、.dynstrセクションは、.dynsymセクションヘッダのsh_nameが参照する文字列(シンボル名)を格納しています。 # # .dynstr セクションヘッダ # $ od -x -A x -j0x123c -N0x28 sample 00123c 0056 0000 0003 0000 0002 0000 820c 0804 00124c …

【ELF形式】.dynsym セクション

セクションヘッダおよびセクションの内容をダンプしてみます。 # # .dynsym # # セクションヘッダ $ od -x -A x -j0x1214 -N0x28 sample 001214 004e 0000 000b 0000 0002 0000 81cc 0804 001224 01cc 0000 0040 0000 0006 0000 0001 0000 001234 0004 0000 …

【ELF形式】.gnu.hash セクション

セクションヘッダの内容をダンプしてみます。 # # .gnu.hash # # セクションヘッダ $ od -x -A x -j0x11ec -N0x28 sample 0011ec 0044 0000 fff6 6fff 0002 0000 81ac 0804 0011fc 01ac 0000 0020 0000 0005 0000 0000 0000 00120c 0004 0000 0004 0000 0012…

【ELF形式】.note.gnu.build-id セクション

「.note.*」セクションは、「注釈セクション」というものらしいです。「ORACLE Documentation リンカーとライブラリ 第7章オブジェクトファイル 注釈セクション」 http://docs.oracle.com/cd/E19620-01/805-5821/6j5ga47bq/index.html#chapter6-18048オブジ…

【ELF形式】.note.ABI-tagセクション

徹夜でやってて、たまに寝落ちが入ってきたので、そろそろ投げやりモードですが(笑)セクションヘッダのダンプ。 $ od -x -A x -w16 -j0x119c -N0x28 sample 00119c 0023 0000 0007 0000 0002 0000 8168 0804 0011ac 0168 0000 0020 0000 0000 0000 0000 00…

【ELF形式】ELFヘッダ(1)

ELF形式について、徹底的に調べ尽くしてみます。ELFヘッダの構造体の定義は、「/usr/include/elf.h」に、データ型の定義は「/usr/include/stdint.h」でそれぞれ定義されています。 /* /usr/include/elf.h */ 26 /* Standard ELF types. */ 27 28 #include <stdint.h> 2</stdint.h>…

【ELF形式】.interpセクション

前回は、.shstrtabセクションからセクション名を抽出し、セクションヘッダ一覧に代入しました。 オフセット 内容 サイズ 管理セクション名 0x0000114c セクションヘッダ0 28h(40d)バイト "\0" 0x00001174 セクションヘッダ1 28h(40d)バイト ".interp" 0x0000…

【ELF形式】セクションヘッダとセクションの関係

今回、セクションヘッダが30個あるという情報を、ELF形式ファイルの先頭から48(0x30)バイト目の位置にある2バイトの情報(e_shnum)から取得しましたが、これはつまり、セクション実体が30個あるということでもあります。セクションヘッダとは、それに対応…

【ELF形式】ELFヘッダ(2)

今回は、以下のソースコードをコンパイルして、そのバイナリを解析します。 /* sample.c */ 1 #include <stdio.h> 2 3 int main(void) 4 { 5 return 0; 6 } まずコンパイル。 $ gcc sample.c -o sample -Wallodコマンドで、実行ファイルの先頭にあるELFヘッダ(52バイ</stdio.h>…

関数の動的書き換え(1)

関数の内容を動的に書き換えることをやってみます。 サンプルソースは、「リンカ・ローダ実践開発テクニック」(p139)より。 /* overwrite.c */ 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 5 int value; 6 char buffer[100]; 7 8 void func1() { value += 1; }</stdlib.h></string.h></stdio.h>…

関数の動的書き換え(2)

前回は、関数の動的書き換えを行うプログラムを実行したところ、書き込み禁止領域に対して書き込もうとするため保護違反が発生し、プログラムはSIG_SEGVで終了しました。そこで、func1()が.textセクションではなく、.dataセクションに配置されるように、リン…

おすすめ本

・『C言語ポインタ完全制覇 (標準プログラマーズライブラリ)』(前橋 和弥/技術評論社)「ポインタでつまづく」ほどの初心者段階は卒業しており、ポインタ配列、配列へのポインタ、多次元配列は「C言語ユーザー」として一応使えてはいるが、この記述がコン…

-128〜127、0〜255のビットの動き

char、unsigned charの表現可能な数値の範囲は、 -128 0 127 255 CHAR +++++++++++------------- UCHAR -------------+++++++++++++charの0〜127がunsigned charの0〜127とビット列を共有しているのは当然ですが、 charの-128〜-1は、unsigned charの128〜25…