【问题标题】:error try to create function by malloc [duplicate]错误尝试通过malloc创建函数[重复]
【发布时间】:2018-05-10 15:33:27
【问题描述】:

我尝试用一​​种奇怪的方式制作一个功能,但我相信存在一种方法可以做到这一点。 我尝试创建函数 fn()=1;

int fn()
{
     return 0;
}

然后我尝试在没有 main 的情况下编译它然后反汇编

gcc -Wall -c fn.c
objdump -d ./a.out

结果是:

./fn.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <fn>:
0:  55                      push   %rbp
1:  48 89 e5                mov    %rsp,%rbp
4:  b8 01 00 00 00          mov    $0x1,%eax
9:  5d                      pop    %rbp
a:  c3                      retq 

然后我写我的程序:

#include <stdio.h>
#include <stdlib.h>
union datas{
    char * v;
    int (*d)();
}ptr;

int main()
{
    int (*f0)();

    ptr.v=(char *)malloc(11);
    ptr.v[0]=0x55;
    ptr.v[1]=0x48;
    ptr.v[2]=0x89;
    ptr.v[3]=0xe5;
    ptr.v[4]=0xb8;
    ptr.v[5]=0x01;
    ptr.v[6]=0x00;
    ptr.v[7]=0x00;
    ptr.v[8]=0x00;
    ptr.v[9]=0x5d;
    ptr.v[10]=0xc3;
printf("ok1\n");//check
    f0=ptr.d;
printf("ok2\n");//check
    printf("fn=%d\n",f0());
printf("ok3\n");//check
    return 0;
}

但结果是:

ok1
ok2
Segmentation fault (core dumped)

【问题讨论】:

  • 您为什么认为这种方法会奏效?
  • 在现代分页和受保护系统上,正常分配的内存(通过例如malloc)通常是不可执行的。
  • malloc(11) 分配不可执行内存
  • malloc() 从不可执行的堆区分配内存。
  • 使用mprotect 使页面可执行。

标签: c assembly memory-management jit


【解决方案1】:

它不起作用,因为您不能在 c(一种强类型语言)中混合指针类型。此外,c 根本不允许混合代码和数据。你想要那个?试试 lisp。

【讨论】:

  • 这不是问题; OP 正在尝试的将适用于 x86 C 实现,其中malloc 从具有读/写/执行权限的页面返回内存。 (例如,在不支持 NX 页表位的旧 CPU 或使用旧版页表格式的操作系统上),OP 不会尝试将数据视为 C代码(如 perl 或其他动态语言中的 eval)。
  • 哈哈。 :) 我不会说 C 非常适合 OP 的意图,但绝对可行。实际上,在 C 中混合指针类型非常容易,它通常是 SW 中许多错误的根源。
猜你喜欢
  • 2018-04-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2015-01-20
  • 1970-01-01
  • 1970-01-01
  • 2011-10-04
  • 2020-12-14
相关资源
最近更新 更多