CコンパイラフラグなしでバッファオーバーフローのUbuntuでスタック保護を無効にする


10

いくつかのシェルコードを試したいのですが、Linux保護を無効にしたいと思います。

フラグを使用してコンパイルできることは知っていますが、一般的にこれらの保護を無効にする別の方法が存在することを知っています。手伝って頂けますか?

回答:


6

スタック保護はコンパイラーによって行われます(スタックに余分なデータを追加し、呼び出し時にいくつかを隠し、戻り時に健全性をチェックします)。再コンパイルせずにそれを無効にすることはできません。それはポイントの一部です、本当に...


6
ASLRでは、実行時にOSがそれを行う必要があります。NXビットにはシステムサポートも必要です。実行時に無効にできない部分は何ですか?
ジェフファーランド2013年

25

vonbrandの発言(正確には+1)をさらに詳しく説明するために、Linuxのスタック保護には2つの部分があります。

カナリアスタック

スタックカナリアは、vonbrandが参照するコンパイラ強制機能です。これらは、再コンパイルせずに無効にすることはできません。

これを自分で証明し、その動作を確認するには、次のコードを使用します。

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

int mybadfunction(char* a_bad_idea)
{
    char what[100];
    strcpy(what, a_bad_idea);
    printf("You passed %s\n", what);
}

int main(int argc, char** argv)
{
    printf("Tralalalaala\n");
    mybadfunction(argv[1]);
}

次にgcc -fstack-protector -masm=intel -S test.c、出力をアセンブルして読みやすいように、その()を何かgnuにコンパイルします。重要な点は、mybadfunction関数の終了時に、次の小さなコードがあるということです。

    mov edx, DWORD PTR [ebp-12]
    xor edx, DWORD PTR gs:20
    je  .L2
    call    __stack_chk_fail

ご想像のとおり、これはスタックCookieを取得し、[ebp-12]それをの値と比較していますgs:20。一致しませんか?次に__stack_chk_fail、glibcの関数を呼び出して、プログラムをすぐに強制終了します。

エクスプロイトの記述に関してこれを回避する方法はいくつかありますが、シェルコードテストケースの構築という点で簡単な方法は、でプログラムをコンパイルすること-fno-stack-protectorです。

実行不可能なページ

最近のLinuxシステムには他にもいくつかの考慮事項があります。通常のシェルコードテストスタブを使用する場合:

char buffer[] = {...};

typedef void (* func)(void);

int main(int argc, char** argv)
{
    func f = (func) buffer;
    f();
    return 0;
}

最新のGCC / Linuxは.rodata、実行権限のない読み取り専用のPEファイルのセクションをマップします。これをオフにする必要があります。これはこのブログ投稿のコードサンプルを使用して行うことができます。基本的な考え方:mprotectシェルコードデータが存在するページに必要な権限を追加するために使用します。

実行不可能なスタック

シェルコードを使用して従来のエクスプロイトシナリオ(上記の私の悪いコードなど)をテストする場合は、単純なケースでもスタックが実行可能であることを確認する必要があります。PEファイル形式には、スタックが実行可能かどうかを判別するためのフィールドが含まれています。これをexecstackで照会および制御できます。実行可能スタックを有効にするには、次を実行します

execstack -s /path/to/myprog

これ、再コンパイルを必要とせずに任意のプログラムで実行できますが、スタックカナリアはコンパイル時に組み込まれるため、自動的には無効になりません。

追加ボーナス:aslr:

、それをオフにしますecho 0 > /proc/sys/kernel/randomize_va_space

私の大切なペンギンを利用する方法を誰かに話しましたか?

いいえ。エクスプロイトはスタックカナリア(非常に重要)を回避し、execstacksetを使用してプログラムを見つけるか、それを設定する(つまり、とにかく任意のコマンドを実行できる)か、またはlibc / returnに戻るなどのより困難な手法を使用する必要があります。指向プログラミング。


0

これらのオプションを使用して、いくつかの保護(スタックスマッシング検出およびスタック実行可能にする)を無効にすることができます。

--z execstack
-f no-stack-protector

次のコマンドを使用して、BashでASLR(アドレススペースレイアウトのランダム化)をオフにすることもできます。

echo 0 > /proc/sys/kernel/randomize_va_space
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.