2006-01-01から1年間の記事一覧

Binary2.0 Conference 2006 発表資料

b2con 2006の発表資料を置きました。 "Hello, binary world!" (PDF, アニメなし) ご来場頂いた皆様、主催者の皆様、どうもありがとうございました。わたし自身もとても楽しめました。IRCの様子が会場でも見られたのはよかったと思います*1。他のスピーカーの…

BF2ELF

ELF

先日書いた、適当にELFなバイナリを吐くプログラムに関して、ある人に「スタックを使うためにはプログラムヘッダに何か書かないといけないのか?と聞かれました」。えーっと、不要です*1。カーネルが勝手に確保してくれます。確保量というか最大サイズは、se…

C++ で SICP

計算機プログラムの構造と解釈 の問題を、Schemeで一問一問解いてゆくのが流行りな2006年でした(師走気分)。このSICPをHaskellやCleanで解いている方はいますが、意外にもC++で解いている人が見当たらないので(注: あたりまえ)、C++のテンプレートはさっ…

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先生と焼肉など食べて…

zshで16進→10進変換

これは便利。bashでも使えます。 % echo $((0x12)) 18 % $((0x12)) zsh: command not found: 18Binary Hacksの校正フェストの際に教えてもらいました。知らなかった〜。さっそく愛用しています。

それ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";のほうがいいのか?的な話。後者の方が良いらしいので、確認するととともに、すぐになん…

ASLR, setarch -RL, prelink, PIE and LD_USE_LOAD_BIAS

独り言です。(慣れないkernelの)コードをざーっと調べて、あまりまじめには検証しないで書いてます。FC5限定なので細かい記述の賞味期間はあと30日くらいでしょうか。 ASLR 私の使っているFC5のkernel/glibcには、一般にASLR(address space layout randomiza…

(補足)

最初のいちばんオーソドックスな奴、一応解説としてbacktraceを貼っておきます。 % gdb ./a.out (gdb) b x if main>0 Breakpoint 1 at 0x80483ba: file iyara.c, line 1. (gdb) r Breakpoint 1, x () at iyara.c:1 1 main;__attribute((constructor,destruct…

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を使…

プログラムを書くのと一緒で、攻撃方法についても定期的に手を動かさないと忘れるので、休日使ってリハビリしてまーす(趣味)。

SUSv3検索プラグイン

mozdev.org に、The Single UNIX Specification, Version 3*1 を検索するためのプラグインがありました。Windowsはもちろん、FC5(x86_64)のfirefoxでも無事動きました。 (デフォルトで)firefoxのウィンドウの右上にある検索窓からSUSv3全体を検索できるって…

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

GCC

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

ふつケル

書くのが2日遅れになってしまいましたが、ふつケル写経会、第4回目も参加。3章の練習問題から4章の終わりまで。RubyCocoaの藤本さんとペアで写本しました(ありがとうございました、理解が進みました)。この進捗具合だと、結構早い時期に読み終わってしまう…

IPA

IPAからテクニカルエンジニア(情報セキュリティ)の合格証書が送られてきました。Webで成績を調べたら、745-625-715点とのこと。午後Iがギリギリだけど(想定外...)、他は上位5%以内でした。2001年の情報セキュリティアドミニストレータ試験も新設後初回試験…

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ひとがい…

はてな/ふつける

昨日は はてな を見学させていただき、今日はふつける写経会に参加。両方とも刺激的でした。id:mizuno_takaaki さん、あまの id:beakmark さん、どうもありがとうございました。