免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 思一克
打印 上一主题 下一主题

一个所谓的全局变量地址改变的例子 [复制链接]

论坛徽章:
0
1 [报告]
发表于 2010-02-01 17:51 |显示全部楼层
来个简单点的:
  1. [bobo]$ cat gotover.c
  2. #include <stdio.h>
  3. #include <string.h>

  4. int evil_code(char *s)
  5. {
  6.         printf("hi, I am here!\n");
  7.         return 0;
  8. }

  9. int main(int argc, char *argv[])
  10. {
  11.         long addr = *(long *)((long)strlen + 2);

  12.         *(long *)addr = (long)evil_code;

  13.         int len = strlen(argv[0]);

  14.         printf("len = [%d]\n", len);

  15.         return 0;
  16. }

  17. [bobo]$ gcc gotover.c -o gotover
  18. [bobo]$ ./gotover
  19. hi, I am here!
  20. len = [0]
  21. [bobo]$
复制代码

论坛徽章:
0
2 [报告]
发表于 2010-02-02 15:47 |显示全部楼层
学与思的这个很好。
能否介绍一下函数的跳转表细节?
思一克 发表于 2010-02-02 14:20


详细内容可以参考 <elf文件格式> , 还有一篇alert7写的动态库符号解析过程

大概是这样的:

对于32位的x86,调用动态库中的函数,比如 printf(); 调用的其实是plt中的一小段代码,这一小段代码如:
address + 0: jmp *0xXXXXXXXX
address + 6 : push 一个常数
jmp 0xYYYYYYYY

第一次调用printf时地址0xXXXXXXXX中的值就是address + 6, 也就是第一次jmp会跳到 address + 6的地方,然后下一个jmp进行如号解析,然后在0xXXXXXXXX中写入真实的printf函数的地址,之后再调用printf时就会直接跳到printf函数去了。
我前面那个代码就是在0xXXXXXXXX中放入evil_code()函数的地址,address + 0: jmp *0xXXXXXXXX 这条指令占用6个字节,前面两个是操作码,后面就是地址,所以有代码中"  + 2"

论坛徽章:
0
3 [报告]
发表于 2010-02-02 15:54 |显示全部楼层
[test]$ cat a.c
#include
#include

int evil_code(char *s)
{
        printf("hi, I am he ...
baicj 发表于 2010-02-02 14:47


估计是偏移有误,没有平台,不能帮你试
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP