GCC

C/C++の定数の型の話, C90/C99の差分のびみょーな話

Cのソースコードに m = 195; とか n = 0xffffffff; とか書いたときの定数(右辺)の型って、なんであるかご存じでしょうか? また、C90(1990年版のISO C言語規格)とC99(1999年版のそれ)ではその型が微妙に異なったりすることがあるんですが、ご存じでしょう…

__attribute__)((init_priority(N)))(で、C++のグローバル変数の初期化順序を制御する

GCC

g++の __attribute__)((init_priority(N)))( なる機能の日本語の解説が見当たらないので、いつものように紹介文を書いてみます。これは、C++のグローバル変数の初期化順序を制御するためのGCCの拡張機能(attribute)です。 ごく短い説明 動的な初期化が必要…

hello worldなELFバイナリを出力するCのプログラム(の一番単純な奴)

GCC

こちらの記事(Binary HacksのHack #25の軽い補足)は、「インラインアセンブラをちょっとだけ使って、gccに小さなhello worldバイナリを出力させる」というお話でした。一方、小さいHello Worldが欲しかったら、gccにELF実行バイナリを出力させるのではなく、…

GCCが出力した小さなバイナリからsection headerを除去したりする話

Binary Hacks に、「インラインアセンブラをちょっとだけ使って、gccに小さなhello worldバイナリを出力させる」というネタを書きました(Hack #25: glibcを使わないでHello Worldを書く)。その補足という訳でもないのですが、先日shinh先生と焼肉など食べて…

それSP戻せばできるよ(仮)

shinhさんの「ふとイヤなコードを思いつきました」にインスパイヤされてみました。...といいたいところなのですがあまりよいものはできず。 // なかなかポータブルなハローワールド main() { char _[0x40000000]; char __[0x40000000]; char ___[0x40000000]…

const char* const p = "ABC"; と const char q[] = "ABC"; はどちらがよいか、みたいな与太

GCC

諸事情あって、ふと前に読んだドキュメントに書いてあった細かいことが気になった。いやいつも細かいけど。 const char* const p = "ABC";より const char q[] = "ABC";のほうがいいのか?的な話。後者の方が良いらしいので、確認するととともに、すぐになん…

mainを一度も呼ばないばかりか蹂躙する

GCC

shinhさんの「ふとイヤなコードを思いつきました」にインスパイヤされてみました。 % cat iyana.c #include <stdio.h> #include <stdlib.h> int main; __attribute__((constructor, destructor)) static void x() { if (main) puts("world!"); else exit(main = puts("hello"));</stdlib.h></stdio.h>…

最近のglibcではatexit関数やjmp_bufを狙った攻撃は効かない (PTR_MANGLE)

GCC

小ネタ。MSの中の人のblogをなんとなく眺めていたら、 Address Space Layout Randomization in Windows Vista - Function Pointer Obfuscation http://blogs.msdn.com/michael_howard/archive/2006/05/26/608315.aspx Protecting against Pointer Subterfuge…

return into libc アタックについて

GCC

(あとで書く..と思う) Exec-Shield時代のスタンダードな攻撃だけど、日本語の資料が見当たらない(ので書く) NXでもシェル起動は簡単 Phrack Magazineの記事はおもしろい バイナリ中の任意の addl; ret; を "間借り" して、複数のcallをchainする話 都合の…

結局どうすりゃいいのさ (攻撃されないCFLAGS/LDFLAGS)

GCC

最近のエントリの総まとめ。適当なネットワークデーモンなどを手動でmakeする際におすすめのgccのオプション。ソフトウェアにbuffer overflowをはじめとするありがちな欠陥があった場合でも、攻撃者にプロセスを乗っ取られないよう、コンパイラやカーネルで…

GOTをほげほげする NX+ASLR+PIE+SSP(ProPolice) の突破デモ

GCC

これの続きです。さて、 NXあり (exec-shield) ASLRあり (exec-shield-randomize) SSPあり PIEあり RELROなし FORTIFY_SOURCEなし という条件で、 format string bug を利用して、PIEなバイナリが貼り付けられたアドレスを知り format string bug を利用して…

memo: SSP(ProPolice)を突破できるパターン?

GCC

GCCは4.1以降からデフォルトでSSP(a.k.a. ProPolice)というスタック保護の仕組みが搭載されています*1。この仕組みを使うと、スタック上に確保した配列のオーバーフローを実行時に検出できます。 % gcc -fstack-protector-all ssp_test.c % ./a.out *** stac…

補足3: .dtors overwrite をちゃんとformat string bugでやってみるか (別名 -D_FORTIFY_SOURCE=2 のすすめ)

GCC

これの続きです。 GOT overwrite でも .dtors overwrite でもなんでもいいんですけど、main関数で直接メモリを4バイト書き換えるのではなくて、ちゃんと(?) format string bug を悪用した書き換えを試してみます。リハビリです。format string bug の解説は…

補足2: .dtors overwrite について

GCC

これの続き。 前に書いたGOT overwriteとほぼ同じ手口なんですが、.dtorsセクションに登録されている(関数の)アドレスを書き換えて、お好きな関数を呼ぶという攻撃方法があります。.dtor overwrite とか呼ばれてます。この手口を、 NXあり ASLRあり RELRO…

補足: ld -z relro でどこがreadonlyになるのか (とelfutilsについて)

GCC

前に書いたrelro記事の補足です。ld -z relro すると (.got 以外は) どこがreadonlyになるのか、について。 これは、readelf -S でセクション一覧を表示して、/proc//maps の出力とセクションのアドレスを見比べる方法で知ることができますが、elfutilsを使…

ld -z relro で GOT overwrite attack から身を守る

GCC

GOT overwrite? "GOT overwrite" という、(ここでは特にLinuxの)プログラムに対する攻撃方法があります。攻撃が成功すると、そのプロセスの権限での任意コード実行等、深刻な被害を受けます。最近のGNU ld(リンカ)のオプションを用いると、この攻撃から身を…

N要素の分岐しない odd-even mergesort (GCC+Linux/x86_64用)

GCC

(こちらの記事の続き)

4要素の分岐しないソート (GCC用)

GCC

(こちらの記事の続き、おまけです) 「分岐しないソート」の、VC++向けのコードをGCC+Linux向けに修正してみました。

分岐しないソート (のジェネレータ)

GCC

分岐しない4要素のソート、GCC/Linux/x86,x86_64,arm版 こちらに、「分岐しないソート」という記事があります。短いので読んでいただくほうがよいと思いますが、文章&アセンブリ言語のコードの内容を要約すると、 4要素のソートは、頑張れば5回の比較と5回…

インラインアセンブラと \n\t

GCC

小ネタ2。 GCCで複数行からなるインラインアセンブラを書くとき、 __asm__ ("movl %0,r9\n\t" "movl %1,r10\n\t" "call _foo" :: "g" (from), "g" (to) : "r9", "r10");のように \n\t 区切りで書くひとと、\n\t のかわりにセミコロン区切りで書く*1ひとがい…

RAIIもどき in C

GCC

gccの__attribute__((cleanup(fn))) が便利すぎる件について。 C++でコードを書くときは、RAIIとか呼ばれているイディオムを使えば、ご存じの通り、ロックしたmutexを手動で開放する必要もないですし、newしたオブジェクトを手動でdeleteする必要もないです…

Java の ConTest っぽいものを、glibcの新機能(LD_AUDIT)を使って Linux + C/C++ で実現してみる

たまには何か書きます。C/C++のマルチスレッドなプログラムのユニットテストでバグを効率的に見つけるためのライブラリ?の作成について。 IBM dWのConTest はてなブックマークを眺めていたら、「ConTestを使用したマルチスレッド・ユニットのテスト - 並列テ…

GCCの-ftrapv (3)

さて、インフルエンザで寝込んでいる最中ですがここぞとばかりに更新。 以前書いたGCCの-ftrapvをそろそろ実戦投入するかと思ったんですが、3つほど注意点を見つけたのでメモ。 問題1: 3.3.x以前でちゃんとうごかない GCC 3.3.x 以前のlibgccの実装にはバグ…

シグナルハンドラを使わないでシグナルをハンドルする

「シグナルハンドラの中でできることは非常に限られているんですよ」というお話を1年半くらい前に書きましたが、この話には続きがあって、ある特定の条件下ではこの制限を緩和することができます。今回はその方法についての解説です。sigwait(3)という関数を…

GCCの-ftrapv (2)

前回、GCCの-ftrapvを使用すると、符号あり整数同士の演算におけるオーバーフローを検出し、オーバーフロー時にabort()が呼ばれることを示しました。しかし、「abortじゃ意味ないんだよねー、C++の例外をthrowするとか、せめてbacktraceを表示するとかしてく…

GCC-4.1.0 and ProPolice/SH

えとーさんに教えてもらって参加した SEA & FSIJ 合同フォーラム2005年12月 「GCC行く年来る年」で伺ったところによると、GCCの4.1でIBM東京基礎研のProPoliceがマージされて、しかもx86だけでなく、x86_64, ppc, sparc, s390, そしてshがサポートされるそう…

GCCの-ftrapv

gcc -ftrapv 最近のGCC(>=3.x)には-ftrapvというオプションがあって、これを有効にすると「符号あり整数同士の加算・減算・乗算でオーバーフロー/アンダーフローが発生したとき、プロセスをabort()」してくれます。例えば、INT_MAX + 1 とか INT_MIN - 1 と…