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

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

シェルコードを試してみて、Linux保護を無効にしたいと思います。

フラグを使用してコンパイルできることを知っていますが、これらの保護を無効にする他の方法があることを知っていますが、覚えていません。助けてください?

ベストアンサー1

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.cgnuエントリでcompile()を実行すると、出力をうまく組み立てて読み取ることができます。重要なのは、関数を終了するときに次のmybadfunctionような小さなコードがあることです。

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

推測できるように、これはスタッククッキーを取得し[ebp-12]て値と比較することですgs:20。不一致?次に、glibcで関数を呼び出して__stack_chk_failプログラムを終了します。

Exploitを書いてこの問題を解決する方法はさまざまですが、シェルコードテストケースを構築する最も簡単な方法は-fno-stack-protector

実行できないページ

最新のLinuxシステムにはいくつかの異なる考慮事項があります。一般的なシェルコードテストスタブを使用する場合:

char buffer[] = {...};

typedef void (* func)(void);

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

.rodata最新のGCC / Linuxは、実行権限なしでPEファイルの読み取り専用部分をマッピングします。この機能をオフにする必要があります。次のコード例を使用してください。このブログ投稿。基本概念:mprotectシェルコードデータを含むページに必要な権限を追加できます。

実行不可能なスタック

シェルコードを使用して既存の攻撃シナリオ(たとえば、上記のエラーコード)をテストする場合は、単純なケースに対してスタックを実行できることも確認する必要があります。 PEファイル形式には、スタックが実行可能かどうかを決定するフィールドが含まれています。以下を使用してこれを照会および制御できます。実行スタック。実行可能スタックを有効にするには、次を実行します。

execstack -s /path/to/myprog

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

ボーナス: aslr:

この機能をオフにするにはecho 0 > /proc/sys/kernel/randomize_va_space

私の貴重なペンギンの使い方を誰かに教えてくれましたか?

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

おすすめ記事