如果不是我的答案不正确,我猜你使用 x86 32 位机器代码。
您的机器代码提供以下内容
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
它也不会以 a或其他东西结尾,因此它会直接运行而无需关心接下来的内容。在大多数情况下,这会崩溃。无论如何,您也可能无法执行 DATA 段中定义的代码。
如果你想执行一些 shellcode,你可以试试下面这个简单的模板。这个想法是在堆栈上创建代码并在那里执行它。给定的机器代码功能没有很好地实现,但至少是正确的,不会导致崩溃。它相当于 C 代码
void f( void ) { return; };
VC++在Debug模式下编译。
#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
。