x86 asm崩溃的应用程序

2 c x86

char program[3] = { 0x6a,  0x0a, 0xC3 }; //push 10; ret;
char (*p)(void) = program;
printf("char = %c \n", p());
Run Code Online (Sandbox Code Playgroud)

这段代码崩溃了.为什么?

以下代码可以正常工作:

char program[3] = { 0x90,  0x90, 0xC3 }; //nop; nop; ret
void (*p)(void) = program;
p();
Run Code Online (Sandbox Code Playgroud)

Nic*_*eon 5

因为您需要通过弹出来清理堆栈.阅读更多关于ret指令 - 它将使用堆栈中的值加载cs:ip!