"Backend Engineer’s meetup ~マイクロサービスにおける認証認可基盤~"の発表資料です。 https://connpass.com/event/142624/
はじめにReturn-oriented programming(ROP)が提唱されて久しい.CTFにおいても,ROPは当たり前のように要求される技術となってきている.一方で,ROPに代わる新たな攻撃手法も模索されている.ここでは,そういったROP以後の攻撃手法を概観する. Return-oriented programmingコンセプトまずは簡単にROPをおさらいする. ROPは主にハードウェアDEPという脆弱性対策技術に対抗するために編み出された攻撃手法である.ハードウェアDEPはCPUのNX bitを有効化することで,スタック上でコードを実行する攻撃を無効化する. そこで,ROPはコード領域のretで終わる命令列(gadget)を実行することによってこれを回避する.単体のgadgetではわずかな処理しか行えないが,スタックに次のgadgetのアドレスを積むことで,gadgetを組み合わ
久しぶりです。7月一杯はテスト続きで遊べそうにありません…。8月は多少遊べるかと思いますが、9月の初旬にはまたテストがあります。ち な み に 文 系 は あ り ま せ ん 。9月の初旬のテストの後はまた一ヶ月ほど休みがあるので、その時には色々出来るかもしれません。あっ、でも免許取らないと。 とはいえ、情報科学概論Ⅰという講義を聴いている最中にふと思いついたセキュリティネタがあったので投稿します。ちょっと調べた感じだとこの手法は見つからなかったんですが、どう考えてもたいした工夫ではないので既出かもしれません。既出だったらスマソ。 return-to-libc攻撃とASLR まずreturn-to-libc攻撃について説明しましょう。知ってるという方は飛ばしてください。return-to-libcはバッファオーバーフロー攻撃の一種です。スタック上のバッファに、その大きさ以上のデータを書き込
今回はReturn-to-libcについて検証してみました。 Return-to-libcはスタック上でシェルコードの実行が禁止されていた場合の迂回策になります。 ところで管理人はよく「Return-to-libc」と「Return-into-libc」の2つを見かけるのですがどちらが正しいのでしょうか。 Return-to-libc:検索結果(217,000件) Return-into-libc:検索結果(91,600件) これだけで判断するのも愚かですが検索結果から見るとReturn-to-libcが正しいのでしょうか。本記事ではReturn-to-libcを採用したいと思います。 お膳立て ソースコード /*rtltest.c*/ #include <stdio.h> #include <string.h> void vuln(char *pass){ char buf[512];
Return-to-libcによるDEP回避では、libc内の関数を呼び出すことでシェル起動を行った。 そして連続して関数を呼び出すために、pop命令+ret命令の先頭にジャンプしてスタックを操作するということを行った。 この手法を発展させ、ret命令で終わる命令列の先頭へのジャンプを繰り返すことで、任意の命令列を実行させることができる。 これはReturn-oriented Programming (ROP) と呼ばれる。 ここでは、実際にROPを使ったシェル起動をやってみる。 環境 Ubuntu 12.04 LTS 32bit版 $ uname -a Linux vm-ubuntu32 3.11.0-15-generic #25~precise1-Ubuntu SMP Thu Jan 30 17:42:40 UTC 2014 i686 i686 i386 GNU/Linux $ lsb
Red HatやCentOSなど、Exec-Shieldと呼ばれるセキュリティモジュールが利用されているOSには、ASCII-armorと呼ばれるセキュリティ機構が存在する。 ここでは、ASCII-armorの動作を確認し、Return-to-strcpy、Return-to-pltと呼ばれる方法によるシェル起動をやってみる。 環境 CentOS 6.5 32bit版 $ uname -a Linux vm-centos32 2.6.32-431.11.2.el6.i686 #1 SMP Tue Mar 25 17:17:46 UTC 2014 i686 i686 i386 GNU/Linux $ cat /etc/redhat-release CentOS release 6.5 (Final) $ gcc --version gcc (GCC) 4.4.7 20120313 (Red
スタック上でのコード実行を禁止するようなセキュリティ機構を 回避する事が出来る方法、それが Return-into-lib(c) である。 仕組みはすごく簡単で、Stack-BOFと同じように リターンアドレスを書き換える。 そのときの書き換え先が共有ライブラリであるという点だけが違う。 共有ライブラリに処理の流れが変わるだけなので、 スタック上でコード実行を禁止していようが関係がない。 とりあえず、いつも通り 脆弱なプログラムに対して環境変数を利用した攻撃を行う。 それから少しずつ今回の攻撃手法に変えていく事にする。 $ ./vuln.o AAAAAAAAA segmentation fault $ export SHELLCODE=`cat ./shellcode` $ ./vuln.o AAAAAAAAA`printf "環境変数 SHELLCODE のアドレス"` sh-3.0.0
DEPが有効になっていると、データ領域に実行可能ビットが立たなくなるため、スタックに置いたシェルコードを実行させることができなくなる。 しかしこのような場合でも、スタックの状態を調整した上でライブラリ関数にジャンプすることで、関数を実行させることができる。 この方法はReturn-to-libcと呼ばれる。 ここでは、実際にスタックバッファオーバーフローからReturn-to-libcによりシェルを起動してみる。 環境 Ubuntu 12.04 LTS 32bit版 $ uname -a Linux vm-ubuntu32 3.11.0-15-generic #25~precise1-Ubuntu SMP Thu Jan 30 17:42:40 UTC 2014 i686 i686 i386 GNU/Linux $ lsb_release -a No LSB modules are ava
Return-to-libc攻撃とは、バッファオーバーランによってコールスタック上のリターンアドレスを別のサブルーチンへのアドレスへ書き換え、さらにスタック上の引数に当たる位置も書き換えることで、サブルーチンを呼び出させるコンピュータセキュリティの攻撃手法である。攻撃者は、悪意あるコードをプログラムに注入することなく、単に既存の関数を呼び出すだけで攻撃を行う。 Unix系システムでは、C言語ランタイムとして "libc" という共有ライブラリが使われる(Windows でも該当するライブラリが存在する)。バッファオーバーランでは攻撃者は任意のコードに戻るように細工できるが、常にリンクされていて攻撃に使い易い機能が多く存在する libc をターゲットとすることが多い(例えば、system() は引数さえ正しく指定すれば、任意のプログラムを実行できる)。このため、全く別の場所を呼び出すようにな
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く