【发布时间】: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