2016-07-02 4 views
1

最近私は、低レベルのプログラミング言語(アセンブリーなど)を学び、シェルコード化(例: "\ x4D ..."など)を経験しました。私はあなたがC/C++アプリケーションにShellcodeを入力して実行できることを知りました。私の質問は、既存のexeアプリケーションからShellcodeを生成し、この生成されたShellcodeをC/C++アプリケーションで使用できるかどうかです。私はシェルコーディングの可能性を誤解しましたか?多くの感謝 - 低レベルのプログラミングexeからシェルコードを生成するには?

+0

いくつかの注意:アセンブリは*機械コード*(CPUに何をするかを指示する一連の数字です)、バイナリは数値(マシンコードに固有のものではありません)を書く方法です。 "\ x4D"は16進記法で、数字を書く方法です(シェルコードに特有のものではありません)。シェルコードは、悪用のペイロードとして使用される単なるマシンコードです。 – Wyzard

答えて

0

上の非常に限られた知識を持つ人は、それが既存のexeファイルのアプリケーションからシェルコードを生成し、これはC/C++アプリケーション

回答にシェルコードを生成し使用することが可能です。いいえ。シェルコードは基本的に独立していますが、実行可能なPEファイルには膨大な量のヘッダーがあります。何らかのアクションを実行する前に実行できません。

シェルコード - 非常に大きな質問です。

最初に、カーネル32、ユーザ32のlibsなどの外部ライブラリの機能アドレスは、起動時にwindows-loaderで埋め込まれたインポートアドレステーブルに格納されていることを知る必要があります。すべてのメモリの動作は、コンパイル段階で計算されるアドレスによって行われます。だからあなたは自分でaddresesを見つける必要があります。

シェルコードから関数を呼び出すには、独自の関数アドレスのローダーが必要です。このローダは、「デルタ・オフセット」

call delta 
delta: 
pop  ebp 
sub  ebp,offset delta 
呼び出し、

あなたのシェルコードがロードされるアドレス何を知らない

は、あなたがそのようなコードからそれを知ることができ、kernel32.dllのライブラリをロードGetProcAddress関数を検索し、IATを埋めるために必要がありますあなたがした後、FASMのようなものを使用する必要があり、将来の使用のためのコードをコンパイルするには

lea eax, [variable] 
add eax, ebp; adding a delta-offset 
mov ecx, dword ptr DS:[eax] 

:ので、あなたがする必要がある関数アドレスの変数オフセットを加え、一例を取得するには、実際のaddresesにオフセットEBPで今

WinHexエディタを使用してコンパイル - >コピー - >すべてをコピー - > GREP Cソース

そして、あなたのような何かを得るだろう「\ X00 \ X28」など、あなたは/ etc JMP /コールのようなコマンドハンドラによってEIPをお使いのシェルコード配列に実行権限を設定し、変更する必要があり、それを呼び出すために

おそらくRunPEアルゴリズムを探して、こんにちは、Windowsのシステムでは世界のMessageBox

# include <stdlib.h> 
# include <stdio.h> 
# include <string.h> 

# include <windows.h> 


int 
main(void) 
{ 
    char *shellcode = "\x33\xc9\x64\x8b\x49\x30\x8b\x49\x0c\x8b" 
    "\x49\x1c\x8b\x59\x08\x8b\x41\x20\x8b\x09" 
    "\x80\x78\x0c\x33\x75\xf2\x8b\xeb\x03\x6d" 
    "\x3c\x8b\x6d\x78\x03\xeb\x8b\x45\x20\x03" 
    "\xc3\x33\xd2\x8b\x34\x90\x03\xf3\x42\x81" 
    "\x3e\x47\x65\x74\x50\x75\xf2\x81\x7e\x04" 
    "\x72\x6f\x63\x41\x75\xe9\x8b\x75\x24\x03" 
    "\xf3\x66\x8b\x14\x56\x8b\x75\x1c\x03\xf3" 
    "\x8b\x74\x96\xfc\x03\xf3\x33\xff\x57\x68" 
    "\x61\x72\x79\x41\x68\x4c\x69\x62\x72\x68" 
    "\x4c\x6f\x61\x64\x54\x53\xff\xd6\x33\xc9" 
    "\x57\x66\xb9\x33\x32\x51\x68\x75\x73\x65" 
    "\x72\x54\xff\xd0\x57\x68\x6f\x78\x41\x01" 
    "\xfe\x4c\x24\x03\x68\x61\x67\x65\x42\x68" 
    "\x4d\x65\x73\x73\x54\x50\xff\xd6\x57\x68" 
    "\x72\x6c\x64\x21\x68\x6f\x20\x57\x6f\x68" 
    "\x48\x65\x6c\x6c\x8b\xcc\x57\x57\x51\x57" 
    "\xff\xd0\x57\x68\x65\x73\x73\x01\xfe\x4c" 
    "\x24\x03\x68\x50\x72\x6f\x63\x68\x45\x78" 
    "\x69\x74\x54\x53\xff\xd6\x57\xff\xd0"; 

    DWORD why_must_this_variable; 
    BOOL ret = VirtualProtect (shellcode, strlen(shellcode), 
    PAGE_EXECUTE_READWRITE, &why_must_this_variable); 

    if (!ret) { 
    printf ("VirtualProtect\n"); 
    return EXIT_FAILURE; 
    } 

    printf("strlen(shellcode)=%d\n", strlen(shellcode)); 

    ((void (*)(void))shellcode)(); 

    return EXIT_SUCCESS; 
} 

を示し例があります。このアルゴリズムは、別のPE内でPE実行可能ファイルを実行できます。あなたは別のプロセスを開いて、セクションをコピーし、IATテーブルを記入し、新しいエントリポイントからターゲットプロセスを再開しています。それは私のマルウェアを使用して、コードの注射のテクニックです。だから私はそれを実現する方法を説明しません

-1

Shellcodeは、悪用のペイロードとして使用されるマシンコードです(buffer overflowなど)。使用されているエクスプロイトに応じて、最大長や特定のバイト値(例えばゼロ)などの制限がある可能性があります。シェルコードができるものには、どれも答えはありません。

しかし、一般的には、完全なプログラムをシェルコードに埋め込むことは可能です。新しい.exeファイルにプログラムを書き込み、それを実行するか、より洗練されたテクニックを使用してメモリ内の現在のプログラムを置き換える小さなラッパー(おそらくアセンブリで手書き)の形をとることができます。この種のシェルコードを作成するための自動化されたツールがありますが、具体的なことはわかりません。私はあなたがしてC/C++アプリケーションに入力シェルコードとは

それを実行できることが判明

しかし、あなたの質問の音は、私はあなたが重要な何かを誤解されるかもしれないと思わせます

これは機能ではなくバグです。実行中のプログラムに新しいコードを挿入できるようにすることは、プログラムがそのコードを許可することを特に意図していないため、大きなセキュリティ上の欠陥です。この種のことは、何十年にもわたり非常に多くのセキュリティ侵害の根源になっており、開発者はそれが起こらないようにするため多大な努力をしています。

シェルコードをプログラムに挿入することができれば、プログラムは壊れています。

関連する問題