web-dev-qa-db-ja.com

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

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

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

10
Phate

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

6
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

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

エクスプロイトの記述に関してこれを回避する方法はいくつかありますが、シェルコードテストケースの構築という点で簡単な方法は、-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は、実行権限なしで読み取り専用のPEファイルの.rodataセクションをマップします。これをオフにする必要があります。これは このブログ投稿 のコードサンプルを使用して実行できます。基本的な考え方:mprotectを使用して、シェルコードデータが存在するページに必要な権限を追加します。

実行不可能なスタック

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

execstack -s /path/to/myprog

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

追加ボーナス:aslr:

これをオフにするには、echo 0 > /proc/sys/kernel/randomize_va_space

誰かに私の貴重なペンギンを利用する方法を教えましたか?

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

25
user119

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

--z execstack
-f no-stack-protector

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

echo 0 > /proc/sys/kernel/randomize_va_space
0
gotoat