2014-05-01から1ヶ月間の記事一覧

jmp espによるASLR回避

スタックバッファオーバーフローを利用してスタック上のシェルコードにジャンプするには前もってシェルコードが置かれているアドレスを知る必要があるが、ASLRが有効な場合スタック領域のベースアドレスがランダム化されてしまう。 しかしこのような場合でも…

アセンブリ命令と機械語の相互変換

アセンブリ命令(asm)と機械語(opcode)を相互に変換する方法のメモ。 GNU Binutilsを使う asmからopcodeに変換するには、asコマンドを使う。 $ echo jmp esp | as -msyntax=intel -mnaked-reg -aln -o /dev/null 1 0000 FFE4 jmp esp ここで、-msyntax=in…

ネットワークソケットを利用したシェル起動

これまでのエントリでは、バッファオーバーフローなどにより起動させたシェルはローカルの端末から操作していた。 これをリモートからネットワーク越しに操作するには、シェルの標準入出力をネットワークソケットに繋ぎ変えておく必要がある。 ここでは、い…

ヒープオーバーフローによるC++ vtable overwriteをやってみる

「ヒープオーバーフローによるGOT overwriteをやってみる」ではプログラム中にて定義した構造体を利用してヒープオーバーフローを行った。 これに関連して、C++において仮想関数をメンバ関数に持つクラスを利用すると、ヒープオーバーフローにより任意のアド…

GOT overwriteとStack pivotによるDEP回避(add esp型)

一つ前のエントリではヒープオーバーフローを利用したGOT overwriteを行い、ジャンプ時eaxレジスタにバッファのアドレスが入っていることを利用することによりStack pivotを行った。 しかし、そのようなライブラリ関数呼び出しが見つからない場合もありうる…

GOT overwriteとStack pivotによるDEP回避(xchg esp型)

一つ前のエントリではヒープオーバーフローを利用したGOT overwriteによりシェルコードの実行を行ったが、DEPが有効な場合ヒープ領域に置いたシェルコードを実行することはできなくなる。 スタックバッファオーバーフローにおいてDEPを回避する方法にはRetur…

ヒープオーバーフローによるGOT overwriteをやってみる

プログラムの実行時にデータが置かれる場所にはスタックとヒープがあり、スタックと同様ヒープについてもバッファオーバーフローが起こりうる。 ヒープ領域で起こるバッファオーバーフローは、Heap-based buffer overflowあるいはHeap overflowと呼ばれる。 …

ASCII-armorとReturn-to-plt、Return-to-strcpyによるシェル起動

Red HatやCentOSなど、Exec-Shieldと呼ばれるセキュリティモジュールが利用されているOSには、ASCII-armorと呼ばれるセキュリティ機構が存在する。 ここでは、ASCII-armorの動作を確認し、Return-to-strcpy、Return-to-pltと呼ばれる方法によるシェル起動を…

gdbの使い方のメモ

よく使いそうなものの覚書。 実行ファイルを指定して起動する $ gdb a.out 次のようにオプションを指定すると、 ライセンス表示を出さない アセンブリコードをIntel形式で表示する 停止するたびに直後の命令を表示する ようにできる。 $ gdb -q -ex 'set dis…

ASLR+PIEとformat string attackによるInformation Leak

ASLRが有効な場合、スタック領域・ヒープ領域や共有ライブラリが置かれるアドレスは一定の範囲の中でランダムに決められる。 一方、実行ファイルそのものが置かれるアドレスは基本的には固定であるが、PIE (Position-Independent Executables) となるように…