私の答えが正しくない場合は、x8632ビットマシンコードを使用していると思います。
あなたのマシンコードは以下を与えます
0000 ADD BYTE PTR DS:[EAX],AL
8B00 MOV EAX,DWORD PTR DS:[EAX]
00XX ADD BYTE PTR ??? ; depends on the next byte
これを実行しようとすると、アドレスが何であれ、メモリにアクセスしようとしますeax
。ret
また、何か他のもので終わらないので、次のことを気にせずにまっすぐ進みます。ほとんどの場合、これはクラッシュします。とにかく、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
です。