shellcodeテストツールの作成


知らず知らずのうちにshellcodeが攻撃に成功するには、次の記事では、他のタイプのshellcodeの作成方法について説明します.これまでshellcodeアセンブリコードが完了するたびに、EIPおよびespアドレスを常にアライメントしながら、バッファオーバーフローホールを伴う以前の(または再作成)コードを見つけてテストする必要がありました.これはshellcodeの正確性をテストするのに不便で、デバッグも難しい.そのため、私たちはまずshellcodeテストツールを編纂して、後でshellcodeをテストするのに便利で、いわゆる研削刀は間違いなく薪を切る仕事です.

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ツールを使用して独立したテストを行います.
========================
  • バッファオーバーフロー攻撃実践
  • バッファオーバーフロー攻撃原理分析
  • 初認識shellcode
  • ローカルshellcode
  • の作成方法
  • shellcodeテストツール
  • の作成
  • ret 2 reg攻撃を用いてアドレス混同
  • を迂回する
  • ret 2 libc攻撃法を用いてデータを迂回保護
  • を実行する.