asm
暫く積読状態だった Security Warrior: Know Your Enemy を読み始め。目に付いた章、Linux Reverse Engineering (全文のPDF) から。サポートページを眺めつつ。 面白かった話題1: antidisassembly (file/objdump/gdb で扱えないバイナリを作る) ELF Kicker…
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>…
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のあるコードを書いてしまい…
ふーむ。-fcall-saved-XXX ってのは知らなかったな。「(calling conventionを)普通CPUメーカーが決める」という件についてはそうですね。x86についても「IA-32 インテル(R)アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル 上巻」の6章、「プロシ…
MSの中の人のblogとして著名な、"The Old New Thing" の2004年1月の記事に、calling convention関係のものが5つある。あとで必ず読まねば。
散々言われている事とは思うけども、仮想関数もインライン展開の対象に なる ので要注意です。 値オブジェクトのメソッドが呼ばれている場合は実行時に動的束縛する必要がないからインライン化できます。Foo::bar() が仮想関数として、 Foo f; f.bar(); はイ…
コンストラクタ、デストラクタをコンパイラに自動生成させる場合、当然かもしれませんがそれらはインライン化されます。インライン化というか何も処理が発生しないというか。 しかしもちろん、 [foo.h] class Foo { public: Foo(); ~Foo(); }; [foo.cpp] Foo…
C++/C99言語では、"inline"キーワードが正式にサポートされており、コンパイラに対して関数を「インライン化してほしい」と要求することができます。しかし、良く知られていることですがこれはあくまでヒントなので、コンパイラの気分次第でインライン化が起…
/.JのGCC-3.4リリースの話題を追っていたら、GCC3では-O2で-fstrict-aliasingが有効だから注意せよというポスト(http://slashdot.jp/comments.pl?sid=175355&cid=537217)があった。strict aliasing については、Radium Software Developmentさんが詳しい。こ…
IRCで、Linuxのkernel source中で使われている"asmlinkage"なるキーワードはなんぞや?と聞かれたので調べ物。 asmlinkage int foo(int a, int b) { /* ... */ } のように使われているらしい。で、調べたところこのキーワードは i386ファミリ向けで、extern …
プロセスがシグナルを受信し、処理がシグナルハンドラに移る時にもカーネルが似たような処理(トランポリン)を行います。 これについては、なんでも継続(http://www.shiro.dreamhost.com/scheme/docs/cont-j.html)の、「継続を渡して」のところの説明がまず…
gccでは、次のように、関数の中で関数を定義することができます(内部に書かれた関数をnested functionなどと呼びます)。 void func(void) { int x; void inner_func(void) { printf("%d\n", x); // a. } inner_func(); // b. } ここで、nested function では…
(未)
アセンブラで遊ぶ時に便利な ~/.gdbinit を紹介します。まず ~/.gdbinit を次のように記述してください。 # # ~/.gdbinit # # .so を shlib コマンドで手動で読み込む # set auto-solib-add 0 # スレッド生成時のSIG32でブレークしない handle SIG32 nostop …
g++でインラインアセンブラを使ってみることにした。g++ -S でアセンブリリストを見ることは多々あったが、思えば__asm__を自分で書いたことはなかったのでした。引数の "=r(ほげほげ..)" の意味など把握しなければならないことがたくさん。 書いてみた とり…