一尘不染

如何调用存储在char数组中的机器代码?

linux

我正在尝试调用本机语言。到目前为止,这是我所拥有的(它会出现总线错误):

char prog[] = {'\xc3'}; // x86 ret instruction

int main()
{
    typedef double (*dfunc)();

    dfunc d = (dfunc)(&prog[0]);
    (*d)();
    return 0;
}

它确实正确调用了函数,并且到达了ret指令。但是,当它尝试执行ret指令时,会出现SIGBUS错误。是因为我在未清除执行页面之类的代码上执行代码吗?

那我在做什么错呢?


阅读 259

收藏
2020-06-07

共1个答案

一尘不染

第一个问题可能是该编数据的存储位置不可执行。

至少在Linux上,生成的二进制文件会将全局变量的内容放在“数据”段此处,这在大多数正常情况下是不可执行的。

第二个问题可能是您正在调用的代码在某种程度上无效。在C中有一个特定的过程来调用方法,称为调用约定(例如,您可能使用的是“
cdecl”)。仅被“调用”的函数可能还不够。它可能还需要进行一些堆栈清理等操作,否则程序将表现异常。一旦解决了第一个问题,这可能会证明是一个问题。

2020-06-07