2014-07-01から1ヶ月間の記事一覧
x64環境においてROPを行うには複数のレジスタをセットする必要があるが、glibcの__libc_csu_init関数を利用すると任意の3引数関数が呼び出せることが知られている。 ここでは、ROP stager + Return-to-resolveに加えてこれを利用することで、ASLR+DEPが有効…
x64環境では、x86環境とは異なり関数の引数はレジスタにセットされる。 このため、ROPにおいてはpop rdi; retなどのgadgetを使い、複数のレジスタに値をセットしてから関数にジャンプする必要がある。 また、x64ではx86に存在したpushad、popad命令がなくな…
「ROP stager + Return-to-dl-resolve + DT_DEBUG readによるASLR+DEP+RELRO回避」では、x86環境かつASLR+DEP+RELROが有効な条件下でlibcバイナリに依存しないシェル起動を行った。 ここでは、x64環境のもとで同様の方法によるASLR+DEP+RELRO回避をやってみ…
Linux x64環境において、ELF実行ファイル、共有ライブラリ、スタック領域、ヒープ領域のアドレスがどのように決まるのかについてのメモ。 環境 Ubuntu 12.04 LTS 64bit版 $ uname -a Linux vm-ubuntu64 3.11.0-15-generic #25~precise1-Ubuntu SMP Thu Jan 3…
「ROP stager + Return-to-dl-resolveによるASLR+DEP回避」では、ASLR+DEPが有効なx86環境においてlibcバイナリに依存しない形でシェル起動を行った。 ここでは、ASLR+DEPが有効なx64環境において同様のシェル起動をやってみる。 環境 Ubuntu 12.04 LTS 64bi…
一般に、ASLRはsysctlコマンドなどでカーネルパラメータを変更することにより有効化・無効化できる。 $ sudo sysctl -w kernel.randomize_va_space=2 # enable kernel.randomize_va_space = 2 $ sudo sysctl -w kernel.randomize_va_space=0 # disable kerne…
ヘッダファイルなどから構造体の定義などがわかっているとき、gdbにこれを読み込ませることでメモリ内容を構造体定義に合わせて表示させることができる。 これを行うには、gccでデバッグ情報付きのオブジェクトを作った後、gdbのadd-symbol-fileコマンドで読…
「ROP stager + Return-to-dl-resolveによるASLR+DEP回避」では、libcバイナリに依存しない形でASLR+DEPが有効な条件下におけるシェル起動を行った。 ここでは、さらにRELROが有効な場合について、DT_DEBUGシンボルを利用したシェル起動をやってみる。 環境 …
「ROP stager + Return-to-dl-resolveによるASLR+DEP回避」では、libcバイナリに依存しない形でASLR+DEPが有効な条件下におけるシェル起動を行った。 ここでは、さらに実行ファイルがPIEの場合についてブルートフォースによるシェル起動をやってみる。 環境 …
「ROP stager + read/writeによるASLR+DEP回避」では、PLT中のwrite関数を使うことでlibcのベースアドレスを特定し、system関数によるシェル起動を行った。 この方法では各ライブラリ関数のオフセットを調べておく必要があるが、このオフセットはlibcの種類…
シェルコード実行中にシェルコードが置かれているアドレスを得る方法についてのメモ。 callを使う callを実行したとき、スタックにリターンアドレスとしてcallの次の命令のアドレスが積まれることを利用する。 /* geteip_call.s */ .intel_syntax noprefix .…
「x86 alphanumeric shellcodeを書いてみる」では、主にxorを使いシェルコードを展開した。 ここで使わなかった命令としてcmp命令、jmp系命令、imul命令があるが、これらも使うとより短いalphanumeric shellcodeを作ることができる。 ここでは、ALPHA3エンコ…
「x86 alphanumeric shellcodeを書いてみる」では、アルファベットと数字のみを使ったシェルコードでシェル起動を行った。 任意のシェルコードを実行する場合も同様にしてalphanumericな形に変換すればよいが、別の方法としてshellcode stagerを使うこともで…
Linux x86環境を対象に、アルファベットと数字のみからなるシェルコードを書いてみる。 このようなシェルコードはalphanumeric shellcodeと呼ばれる。 環境 Ubuntu 12.04 LTS 32bit版 $ uname -a Linux vm-ubuntu32 3.11.0-15-generic #25~precise1-Ubuntu S…
xinetdを使うと、標準入出力を使うスクリプトなどを簡単にネットワークサーバにすることができる。 ここでは、xinetdを使ってさまざまなネットワークサーバを作ってみる。 環境 Ubuntu 12.04 LTS 32bit版 $ uname -a Linux vm-ubuntu32 3.11.0-15-generic #2…
オペコードの解釈の違いを利用し、Linux x86とLinux x64の両方で動くシェルコード(polyglot shellcode)を書いてみる。 環境 Ubuntu 12.04 LTS 32bit版および64bit版 $ uname -a Linux vm-ubuntu32 3.11.0-15-generic #25~precise1-Ubuntu SMP Thu Jan 30 1…
スタックバッファオーバーフロー脆弱性が存在する状況において、送り込む文字列と実際に書き変わったEIPを比べることで、EIPまでのオフセットを計算することができる。 ここでは、Metasploit pattern(あるいはcyclic pattern)と呼ばれる文字列を使ったオフ…
Intel x64 (x86-64) 環境のもとで、スタックバッファオーバーフローによるシェルコード実行およびROPをやってみる。 環境 Ubuntu 12.04 LTS 64bit版 $ uname -a Linux vm-ubuntu64 3.11.0-15-generic #25~precise1-Ubuntu SMP Thu Jan 30 17:39:31 UTC 2014 …
tracerouteに時間がかかる原因には、主に次の二つがある。 DNS逆引きのレスポンス待ち ICMP Time Exceededを返さないhopのレスポンス待ち したがって、DNS逆引きの無効化およびタイムアウト時間の短縮を行えば素早くtracerouteできる。 Windowsの場合 > trac…
diffの出力は標準でカラー表示されない。 カラー表示するためのコマンドとしてはcolordiffがあるが、多くの場合標準では入っていないためインストールする必要がある。 ところが、diffのカラー表示はgitを使ってもできることを知った。 git diffは比較するフ…
メッセージングアプリLINE(Android版)が行う通信をパケットキャプチャにより適当に調べてみる。 環境 Androidバージョン: 4.1.2 LINEバージョン: 4.4.1 手順 tPacketCaptureというアプリケーションを利用すると、root権限なしでパケットキャプチャができる…
buffer over-readおよびスタックバッファオーバーフローを利用し、ASLR+PIE+DEP+SSP(+RELRO)がすべて有効な条件下におけるシェル起動をやってみる。 なお、ここではGOT overwriteなどは行わないため、RELROの有無に意味はない。 環境 Ubuntu 12.04 LTS 32bit…
「ROP stagerによるシェルコード実行をやってみる」では、mmapにより動的に実行可能なメモリを確保しシェルコード実行を行った。 ROP stagerには、ほかにもmprotectなどを使いすでに存在するメモリ領域を実行可能に変更するアプローチもある。 さらに、脆弱…
DEPが有効な状況では、スタックバッファオーバーフローなどから命令を実行させるためにROPと呼ばれる手法が使われる。 さらに、ROPを使って任意の処理を実行させる方法として、実行可能なメモリ領域(stage)を動的に確保し、そこに通常のシェルコードをコピ…