当我尝试运行机器代码时,我需要帮助弄清楚为什么我在运行时崩溃了。代码在" 3"之间崩溃。和"结果=%li"。
注意:假设所有代码都已错误检查。我删除了错误检查代码,以便人们阅读此内容。
机器规格:
Windows 10 Home 64-bit
Intel(R) Core(TM) i7-4712MQ
我正在运行的代码:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main(int argc, char** argv) {
printf("Loading code\n");
LPVOID m = VirtualAlloc(NULL, 16, MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE);
printf("1\n");
unsigned char code[] = {
//return x+2;
0x55, //push %rbp
0xe5, 0x89, 0x48, //mov %rsp,%rbp
0xc8, 0x89, //movl %ecx,%eax
0x02, 0xc0, 0x83, //add $0x2,%eax
0xc9, //leaveq
0xc3, //retq
0x90 //nop
};
memcpy(m, code, sizeof(code));
printf("2\n");
PDWORD trash;
VirtualProtect(m, 16, PAGE_EXECUTE_READ, trash);
printf("3\n");
long int (*addTwo)(long int) = m;
long int answer = addTwo(2);
printf("result = %li\n", answer);
VirtualFree(m, 0, MEM_RELEASE);
return 0;
}
答案 0 :(得分:0)
您似乎在堆栈上使用内存来存储自动变量:
0x10, 0x4d, 0x89, //mov %ecx,0x10(%rbp)
0x10, 0x45, 0x8b, //mov 0x10(%rbp),%eax
但是您的偏移是错误的,将0x10
添加到%rpb
将使得到的地址指向先前的堆栈帧;要指向局部变量,你应该从BP中减去。此外,您甚至不需要使用堆栈,只需执行movl %ecx, %eax
。