shellcodeテストツールの作成
2470 ワード
知らず知らずのうちにshellcodeが攻撃に成功するには、次の記事では、他のタイプのshellcodeの作成方法について説明します.これまでshellcodeアセンブリコードが完了するたびに、EIPおよびespアドレスを常にアライメントしながら、バッファオーバーフローホールを伴う以前の(または再作成)コードを見つけてテストする必要がありました.これはshellcodeの正確性をテストするのに不便で、デバッグも難しい.そのため、私たちはまずshellcodeテストツールを編纂して、後でshellcodeをテストするのに便利で、いわゆる研削刀は間違いなく薪を切る仕事です.
shellcodeテストツールsctest
バッファオーバーフロー攻撃実践 バッファオーバーフロー攻撃原理分析 初認識shellcode ローカルshellcode の作成方法 shellcodeテストツール の作成 ret 2 reg攻撃を用いてアドレス混同 を迂回する ret 2 libc攻撃法を用いてデータを迂回保護 を実行する.
shellcodeテストツールsctest
ツールの名前をsctestと呼び、shell code testの略です.
コマンドの使い方:sctest
このプログラムの実装は簡単です.
1)shellcodeバイナリをメモリに読み込む
2)shellcodeメモリをマウントする属性を実行可能にする
3)このshellcode実行にジャンプ
コードは次のとおりです.#include
#include
#include
#include
#include
#include
#include
#include
char code[4096] __attribute__((aligned(4096)));
int main(int argc, const char *argv[])
{
int fd;
int ret;
void (*func)(void);
if (argc != 2) {
fprintf(stderr, "
\tUsage: sctest
");
return 1;
}
fd = open(argv[1], O_RDONLY);
if (!fd) {
fprintf(stderr, "Unable open file %s, err = %d(%m)
", argv[1], errno);
return 2;
}
ret = read(fd, code, sizeof(code));
if (ret < 0) {
fprintf(stderr, "Unable read file %s, err = %d(%m)
", argv[1], errno);
return 3;
}
ret = mprotect(code, sizeof(code), PROT_EXEC);
if (ret < 0) {
fprintf(stderr, "Unable mprotect, err = %d(%m)
", errno);
return 4;
}
/* execute shell code */
func = (void (*)(void))code;
func();
abort();
}
コンパイル
これまでshellcodeの実行環境は32ビットアプリケーションであり、以降は64ビットアプリケーションに関連している.同じプログラムでは32ビットと64ビットの命令を混在させることができないため、2つのツール(32ビットと64ビット)をコンパイルする必要があります.
$ gcc -Wall -g -o sctest32 sctest.c -m32
$ gcc -Wall -g -o sctest sctest.c
以前のshellcodeのテスト
前回の記事では、sctest 32ツールを使用してローカルshellcodeを作成する方法について説明します.
現在のbashのpid
$ echo $$2180
テストshellcodeivan@ivan:~/exploit/tools$ ./sctest32 ../shell2
shellcodeを実行した後shのpid$echo$3178
2つのpidが異なり、shell 2が新しいshを正常に起動したことを示しています.
後述するshellcodeの説明では、脆弱性コードに依存せずにsctest 32/sctestツールを使用して独立したテストを行います.
========================
#include
#include
#include
#include
#include
#include
#include
#include
char code[4096] __attribute__((aligned(4096)));
int main(int argc, const char *argv[])
{
int fd;
int ret;
void (*func)(void);
if (argc != 2) {
fprintf(stderr, "
\tUsage: sctest
");
return 1;
}
fd = open(argv[1], O_RDONLY);
if (!fd) {
fprintf(stderr, "Unable open file %s, err = %d(%m)
", argv[1], errno);
return 2;
}
ret = read(fd, code, sizeof(code));
if (ret < 0) {
fprintf(stderr, "Unable read file %s, err = %d(%m)
", argv[1], errno);
return 3;
}
ret = mprotect(code, sizeof(code), PROT_EXEC);
if (ret < 0) {
fprintf(stderr, "Unable mprotect, err = %d(%m)
", errno);
return 4;
}
/* execute shell code */
func = (void (*)(void))code;
func();
abort();
}
これまでshellcodeの実行環境は32ビットアプリケーションであり、以降は64ビットアプリケーションに関連している.同じプログラムでは32ビットと64ビットの命令を混在させることができないため、2つのツール(32ビットと64ビット)をコンパイルする必要があります.
$ gcc -Wall -g -o sctest32 sctest.c -m32
$ gcc -Wall -g -o sctest sctest.c