asm

Security Warrior (§3 Linux Reverse Engineering)

暫く積読状態だった Security Warrior: Know Your Enemy を読み始め。目に付いた章、Linux Reverse Engineering (全文のPDF) から。サポートページを眺めつつ。 面白かった話題1: antidisassembly (file/objdump/gdb で扱えないバイナリを作る) ELF Kicker…

x86での分岐処理の高速化 (__builtin_expect)

asm

if/then/else hint? (http://gcc.gnu.org/ml/gcc/2004-01/msg00496.html) というgccのMLに投稿された質問より。質問者いわく、 if (<condition>) <fastpath>; else <slowpath>;というコードがあり、conditionは滅多に偽にならないんだそうだ。そういうときに、吐き出すオブジェクトコードを</slowpath></fastpath></condition>…

off-by-one error でreturn addressが上書きされるまで

Phrack Magazine (http://phrack.org/phrack/55/P55-08) の off-by-one exploit を読みました。要約しておきます。 void func(const char* sm) { char buffer[256]; for(int i=0; iこのような、1バイトだけオーバーフローするbugのあるコードを書いてしまい…

(続き) 2ちゃんねる、GCCスレより

ふーむ。-fcall-saved-XXX ってのは知らなかったな。「(calling conventionを)普通CPUメーカーが決める」という件についてはそうですね。x86についても「IA-32 インテル(R)アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル 上巻」の6章、「プロシ…

The history of calling conventions

MSの中の人のblogとして著名な、"The Old New Thing" の2004年1月の記事に、calling convention関係のものが5つある。あとで必ず読まねば。

(続き) 仮想関数のインライン化

散々言われている事とは思うけども、仮想関数もインライン展開の対象に なる ので要注意です。 値オブジェクトのメソッドが呼ばれている場合は実行時に動的束縛する必要がないからインライン化できます。Foo::bar() が仮想関数として、 Foo f; f.bar(); はイ…

(続き) ctor/dtorに関する注意

コンストラクタ、デストラクタをコンパイラに自動生成させる場合、当然かもしれませんがそれらはインライン化されます。インライン化というか何も処理が発生しないというか。 しかしもちろん、 [foo.h] class Foo { public: Foo(); ~Foo(); }; [foo.cpp] Foo…

関数のインライン化基準

C++/C99言語では、"inline"キーワードが正式にサポートされており、コンパイラに対して関数を「インライン化してほしい」と要求することができます。しかし、良く知られていることですがこれはあくまでヒントなので、コンパイラの気分次第でインライン化が起…

type punning と strict aliasing

/.JのGCC-3.4リリースの話題を追っていたら、GCC3では-O2で-fstrict-aliasingが有効だから注意せよというポスト(http://slashdot.jp/comments.pl?sid=175355&cid=537217)があった。strict aliasing については、Radium Software Developmentさんが詳しい。こ…

asmlinkage

asm

IRCで、Linuxのkernel source中で使われている"asmlinkage"なるキーワードはなんぞや?と聞かれたので調べ物。 asmlinkage int foo(int a, int b) { /* ... */ } のように使われているらしい。で、調べたところこのキーワードは i386ファミリ向けで、extern …

カーネルの生成するトランポリンコードについて(signal)

プロセスがシグナルを受信し、処理がシグナルハンドラに移る時にもカーネルが似たような処理(トランポリン)を行います。 これについては、なんでも継続(http://www.shiro.dreamhost.com/scheme/docs/cont-j.html)の、「継続を渡して」のところの説明がまず…

gccの生成するトランポリンコードについて

asm

gccでは、次のように、関数の中で関数を定義することができます(内部に書かれた関数をnested functionなどと呼びます)。 void func(void) { int x; void inner_func(void) { printf("%d\n", x); // a. } inner_func(); // b. } ここで、nested function では…

(続き) メモリバリア

asm

(未)

アセンブラで遊ぶ時に便利なgdb設定

asm

アセンブラで遊ぶ時に便利な ~/.gdbinit を紹介します。まず ~/.gdbinit を次のように記述してください。 # # ~/.gdbinit # # .so を shlib コマンドで手動で読み込む # set auto-solib-add 0 # スレッド生成時のSIG32でブレークしない handle SIG32 nostop …

__asm__ を試してみた

asm

g++でインラインアセンブラを使ってみることにした。g++ -S でアセンブリリストを見ることは多々あったが、思えば__asm__を自分で書いたことはなかったのでした。引数の "=r(ほげほげ..)" の意味など把握しなければならないことがたくさん。 書いてみた とり…