0

私はCでコンパイラスイッチを備えた単純なプログラムを持っています:/ GS-

これは、EIPをマシンコード文字列の場所に変更するという概念実証にすぎません。

EIP = 0x012f5000に設定すると、EIPは次の配列のアドレスに配置されます。

char code[] = "\x00\x00\x8B\x00\x00";

これらの命令が何をするのか正確にはわかりませんが、x00の命令はおっとのようです。EIPをプログラム内の他の場所に切り替えると問題が発生するようですが、EIPをこのアレイのアドレスにポイントすると、EIPのその場所で「アクセス違反」例外が発生します。

なぜこのエラーが発生するのですか?これは、ある種のWindows保護メカニズムによるものですか?それとも、Windowsがこの文字列形式で命令を実行できないということですか?プログラムにこれらの命令を実行させるにはどうすればよいですか?

4

2 に答える 2

2

私の答えが正しくない場合は、x8632ビットマシンコードを使用していると思います。

あなたのマシンコードは以下を与えます

0000          ADD BYTE PTR DS:[EAX],AL
8B00          MOV EAX,DWORD PTR DS:[EAX]
00XX          ADD BYTE PTR ???  ; depends on the next byte

これを実行しようとすると、アドレスが何であれ、メモリにアクセスしようとしますeaxretまた、何か他のもので終わらないので、次のことを気にせずにまっすぐ進みます。ほとんどの場合、これはクラッシュします。とにかく、DATAセグメントで定義されたコードを実行できない可能性もあります。

シェルコードを実行したい場合は、次の簡単なテンプレートのように試すことができます。アイデアは、スタック上にコードを作成し、そこで実行することです。指定されたマシンコード関数は適切に実装されていませんが、少なくとも正しく、クラッシュを引き起こすことはありません。Cコードに相当します

void f( void ) { return; };

デバッグモードでVC++によってコンパイルされます。

#include <stdio.h> 

int main() 
{ 
    const char code[] = "\x55\x8B\xEC\x81\xEC\xC0\x00\x00" 
    "\x00\x53\x56\x57\x8D\xBD\x40\xFF" 
    "\xFF\xFF\xB9\x30\x00\x00\x00\xB8" 
    "\xCC\xCC\xCC\xCC\xF3\xAB\x5F\x5E" 
    "\x5B\x8B\xE5\x5D\xC3"; 

    printf("Start execution\r\n"); 
    ((void (*)())code)(); 
    printf("End execution\r\n"); 
    _getch(); 
}

上記がうまくいかない場合は、試すことができます。

#include "stdafx.h"
#include <stdio.h> 
#include <Windows.h>

int main() 
{ 
    const char code[] = "\x55\x8B\xEC\x81\xEC\xC0\x00\x00" 
    "\x00\x53\x56\x57\x8D\xBD\x40\xFF" 
    "\xFF\xFF\xB9\x30\x00\x00\x00\xB8" 
    "\xCC\xCC\xCC\xCC\xF3\xAB\x5F\x5E" 
    "\x5B\x8B\xE5\x5D\xC3"; 

    void *exec = VirtualAlloc(0, sizeof(code), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    memcpy(exec, code, sizeof(code));

    printf("Start execution\r\n"); 
    ((void(*)())exec)();
    printf("End execution\r\n"); 
    //_getch(); 
}

アイデアは、フラグが付いた割り当てられたメモリページを使用することPAGE_EXECUTE_READWRITEです。

于 2012-12-10T11:12:11.353 に答える
0

フェルマーの答えは良いですが、私はこれが少し好きです

__asm { jmp [exec] }
于 2012-12-27T05:27:29.437 に答える