有兴趣的看一下

虫鸣 2010-04-07 04:44:09
我的环境Fedora 12
#include<stdio.h>
int i;
void pf(void){
printf("i get it.\n");
}
int main(){
unsigned char buffer[256];
unsigned char* ptopf=(unsigned char*)pf;
void (*ptob)()=buffer;
for(i=;i,i<256;i++){
buffer[i]=*(ptopf+i);
if(buffer[i]==0xc3)
break;

}

ptob();
return 0;

}
执行结果:
段错误

有兴趣的交流一下,
请有兴趣的高手指点一下……
谢谢!
...全文
158 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
虫鸣 2010-06-23
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 duanius 的回复:]
引用 1 楼 louyong0571 的回复:

这都行?!第一次看见函数都可以拷来拷去的。
我觉得,函数在代码段,你的buffer在数据段,这样在数据段做函数操作,是不是就是段错误啊!


函数当然可以拷贝来拷贝去 比如在arm系统休眠前,dram的时钟源会从高频改成低频的时钟,同时本身进入自刷新,这时就无法使用dram了,在休眠唤醒最核心的部分,就要把函数拷贝到sram中去 ,再跳……
[/Quote]
这个原因可能是系统设置了exec-shield,堆栈段不能执行,可以通过别的方法突破,但我还没找到,也不是我这样水平的人能解决的,要是有兴趣可以共同探讨一下……
虫鸣 2010-06-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zigzag_xiang 的回复:]
buffer[i]==0xc3
-----这是个什么判断条件???
[/Quote]
汇编ret的机器码……也就是程序结束时候返回的指令……
duanius 2010-05-05
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zigzag_xiang 的回复:]

buffer[i]==0xc3
-----这是个什么判断条件???
[/Quote]
ret = 0xc3
zigzag_xiang 2010-05-05
  • 打赏
  • 举报
回复
buffer[i]==0xc3
-----这是个什么判断条件???
duanius 2010-05-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 louyong0571 的回复:]

这都行?!第一次看见函数都可以拷来拷去的。
我觉得,函数在代码段,你的buffer在数据段,这样在数据段做函数操作,是不是就是段错误啊!
[/Quote]

函数当然可以拷贝来拷贝去 比如在arm系统休眠前,dram的时钟源会从高频改成低频的时钟,同时本身进入自刷新,这时就无法使用dram了,在休眠唤醒最核心的部分,就要把函数拷贝到sram中去 ,再跳过去执行。

而这个程序段错误的原因我认为是搬移过的函数,再去执行printf,这个时候相对地址已经不对了 指向了无效的地址。楼主把printf函数改成一个简单的赋值再看看行不行
zigzag_xiang 2010-05-05
  • 打赏
  • 举报
回复
RT,顶起
Apple_Demo 2010-04-30
  • 打赏
  • 举报
回复
这程序都能编译通过?
jianmin09 2010-04-30
  • 打赏
  • 举报
回复
mark
zigzag_xiang 2010-04-30
  • 打赏
  • 举报
回复
buffer[i]==0xc3
-----这是个什么判断条件???
louyong0571 2010-04-08
  • 打赏
  • 举报
回复
这都行?!第一次看见函数都可以拷来拷去的。
我觉得,函数在代码段,你的buffer在数据段,这样在数据段做函数操作,是不是就是段错误啊!
虫鸣 2010-04-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 deep_pro 的回复:]
我知道的就是百度搜 绕过 exec-shield
得到的结果,没有尝试过
[/Quote]
谢谢大侠……以后还要多向哥哥你请教问题呀,呵呵……小弟这里先谢过了……
deep_pro 2010-04-08
  • 打赏
  • 举报
回复
我知道的就是百度搜 绕过 exec-shield
得到的结果,没有尝试过
虫鸣 2010-04-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 deep_pro 的回复:]
这里需要的是栈的执行权限 ,不是数据段的执行权限

白道好说,关闭exec-shield 即可
黑道就麻烦了
不过也有hacker实现了,lz搜搜就知道了
[/Quote]大侠,高人呀,搜了很长时间了,还是不得要领呀,还请大侠指点一二呀,哪有相关的文章?
yanjinbin0 2010-04-08
  • 打赏
  • 举报
回复
学习了。
deep_pro 2010-04-08
  • 打赏
  • 举报
回复
这里需要的是栈的执行权限 ,不是数据段的执行权限

白道好说,关闭exec-shield 即可
黑道就麻烦了
不过也有hacker实现了,lz搜搜就知道了
虫鸣 2010-04-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 louyong0571 的回复:]
这都行?!第一次看见函数都可以拷来拷去的。
我觉得,函数在代码段,你的buffer在数据段,这样在数据段做函数操作,是不是就是段错误啊!
[/Quote]
嗯,大侠说的有道理,原来在Linux2.4的时代是可以的,但现在是2.6了,不能执行,高手有没有办法绕过这个限制?

23,127

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧