在C中进行ASM呼叫/转接

时间:2014-06-09 17:50:33

标签: c gcc assembly

我尝试在汇编中执行一个简单的调用/ ret序列(从使用GCC编译的c代码),手动编写ret操作代码,并调用ret地址:

void *addr;
addr = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);
// Writing the ret op code
((char*)addr)[0] = 0xC3;
// Going to addr with the ret
asm volatile("call *%0" : : "r" (addr));

但是我遇到了分段错误。任何人都知道为什么,以及如何纠正?

1 个答案:

答案 0 :(得分:1)

为了能够在内存页面上执行指令,读写权限是不够的;它还需要标记为可执行文件(PROT_EXEC)。