いくつかのシェルコードを試したいのですが、Linux保護を無効にしたいと思います。
フラグを使用してコンパイルできることは知っていますが、一般的にこれらの保護を無効にする別の方法が存在することを知っています。手伝って頂けますか?
スタック保護はコンパイラーによって行われます(スタックに余分なデータを追加し、呼び出し時にいくつかを隠し、戻り時に健全性をチェックします)。再コンパイルせずにそれを無効にすることはできません。それはポイントの一部です、本当に...
フォンブランドの発言(正確には+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は再コンパイルを必要とせずに任意のプログラムで実行できますが、スタックカナリアはコンパイル時に組み込まれるため、自動的に無効にはなりません。
これをオフにするには、echo 0 > /proc/sys/kernel/randomize_va_space
。
いいえ。エクスプロイトはスタックカナリア(非常に重要なもの)を回避し、execstack
が設定されたプログラムを見つけるか、それを設定する(つまり、とにかく任意のコマンドを実行できる)か、またはより難しい手法を使用する必要があります。 libc/return指向プログラミングへの復帰として。
これらのオプションを使用して、いくつかの保護(スタックスマッシング検出およびスタックを実行可能にする)を無効にすることができます。
--z execstack
-f no-stack-protector
また、次のコマンドを使用して、BashでASLR(アドレススペースレイアウトのランダム化)をオフにすることもできます。
echo 0 > /proc/sys/kernel/randomize_va_space