Chinaunix首页 | 论坛 | 博客
  • 博客访问: 285879
  • 博文数量: 124
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 21
  • 用 户 组: 普通用户
  • 注册时间: 2016-08-20 14:44
文章分类

全部博文(124)

文章存档

2020年(1)

2018年(2)

2016年(2)

2015年(6)

2014年(10)

2013年(23)

2012年(7)

2011年(18)

2010年(15)

2009年(8)

2007年(8)

2006年(23)

2005年(1)

我的朋友

分类: C/C++

2011-09-23 16:37:14

  1. #include<stdio.h>
  2. int back;
  3. void myprint()
  4. {
  5.     char b[8];
  6. //此处的修改跟下面是类似的.
  7. //注意此处的12跟前面的8关系很紧密.实际程序编译时, 会根据此处的临时变量的大小分配空间,并且留一定的buffer;
  8. //如此处的变量需要空间的大小(size)小于等于8时,总共预留的空间是8.
  9. //大小时9~16时预留空间是24;
  10.     *(int*)(b+12)=back;
  11.     printf("hello\n");
  12. }
  13. void myfunc(int a)
  14. {
  15.     char b[8];
  16. //修改堆栈,此处b+12处记录函数的返回地址, 把他改为myprint;把原地址记录在back中.
  17.     back=*(int*)(b+12);
  18.     *(int*)(b+12)=myprint;
  19. }

  20. void main()
  21. {
  22.     int i=0;
  23.     myfunc(10);
  24.     printf("hello, I ma here\n");
  25. }
此处填入部分汇编.
  1. void myprint()
  2. {
  3. 8048388: 55       push %ebp //ebp进站, 其实在调用此函数前已经将返回地址,npc进栈了.这是call完成的.
  4. 8048389: 89 e5    mov %esp,%ebp //修改ebp,此处为临时变量的末尾地址(栈是从高往低分配).
  5. 804838b: 83 ec 08 sub $0x8,%esp //修改esp, 为临时变量准备空间.
  6. printf("hello\n");
  7. 804838e: 83 ec 0c       sub $0xc,%esp
  8. 8048391: 68 d0 84 04 08 push $0x80484d0
  9. 8048396: e8 35 ff ff ff call 80482d0
  10. 804839b: 83 c4 10 add $0x10,%esp
  11. }
阅读(1334) | 评论(0) | 转发(1) |
0

上一篇:unix 通用命令

下一篇:bpel 语法和注意点

给主人留下些什么吧!~~