免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4513 | 回复: 8
打印 上一主题 下一主题

请教堆缓冲区溢出 利用malloc,free来攻击的原理 [复制链接]

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-08-03 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-16 00:11 |只看该作者 |倒序浏览
网上资料比较少, 有些写得不太清楚。。。
希望大侠指导。

论坛徽章:
0
2 [报告]
发表于 2009-09-17 00:12 |只看该作者
缓冲区溢出,一句两句不好说明白。
建议看一下 如何写安全的代码。
好像是这本书。有电子版的。里边说的非常详细

论坛徽章:
0
3 [报告]
发表于 2009-09-18 23:15 |只看该作者
原理很简单:比如你在C里,定义了一个CHAR BUF[10]; 但是你又用MEMCPY, STRCPY 向里面COPY了20或者更多的数据,那么就是缓冲区溢出。后果呢,轻的程序跑飞,重的则是程序完全被黑客控制。

HEAP也是类似的原理。但是具体做起来就有很多技巧了。去找书吧。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
4 [报告]
发表于 2009-09-19 09:28 |只看该作者
给你一个关于缓冲区溢出最简单的例子

  1. $ cat 3.c
  2. #include <stdio.h>
  3. int main()
  4. {
  5.         char s[10];
  6.         int i;
  7.         int j;
  8.         printf("Input a number:\n");
  9.         scanf("%d",&i);
  10.         printf("The number is %d\n\n",i);
  11.         j=i;
  12.         printf("Input a string:\n");
  13.         scanf("%s",s);
  14.         printf("The string is \"%s\"\n\n",s);
  15.         if(i==j)
  16.                 printf("OK\n");
  17.         else
  18.                 printf("Fuck\n");
  19.         return 0;

  20. }
  21. $ gcc 3.c
  22. $ ./a.out
  23. Input a number:
  24. 1
  25. The number is 1

  26. Input a string:
  27. abc
  28. The string is "abc"

  29. OK
  30. $ ./a.out
  31. Input a number:
  32. 1
  33. The number is 1

  34. Input a string:
  35. abcdefghijk
  36. The string is "abcdefghijk"

  37. Fuck
  38. $ ./a.out
  39. Input a number:
  40. 1
  41. The number is 1

  42. Input a string:
  43. abcdefghijklmnop
  44. The string is "abcdefghijklmnop"

  45. Fuck
  46. Segmentation fault
复制代码

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-08-03 06:20:00
5 [报告]
发表于 2009-09-20 00:08 |只看该作者
谢谢 但我想知道的是原理  

而且是堆的溢出 而不是栈的溢出

网上说可以利用 free() 中的unlink来处理 但怎么都不明白

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
6 [报告]
发表于 2009-09-21 16:26 |只看该作者
原帖由 317316abcd 于 2009-9-20 00:08 发表
谢谢 但我想知道的是原理  

而且是堆的溢出 而不是栈的溢出

网上说可以利用 free() 中的unlink来处理 但怎么都不明白

一样的道理。

论坛徽章:
0
7 [报告]
发表于 2009-09-21 17:53 |只看该作者
原帖由 317316abcd 于 2009-9-20 00:08 发表
谢谢 但我想知道的是原理  

而且是堆的溢出 而不是栈的溢出

网上说可以利用 free() 中的unlink来处理 但怎么都不明白


相对来说,堆溢出比栈溢出难些,我以最简单的情况来说明下基本原理。

通常把malloc分配得到的数据称为堆块,每一个堆块包括块首和块身,malloc函数返回的指针就是指向块身地址,而在块身之前还有8字节的空间,称为块首。当块空闲时,里面包括了一些该块的信息及标志;而块被使用后,块首里面放的就是个链表指针了,指向前一个堆块和后一个堆块,它们统一由系统中的堆表来维护。

链表的结构如下:

struct list {
   struct list next;
   struct list prev;
};

当进行free堆块操作的时候,就会把该堆块从链表中卸下,假设指针v指向该堆块,则操作类似于:

v->next->prev = v->prev;
v->prev->next = v->next;

现在假设我们连续2次调用malloc(100),则这2个堆块通常是连续的,也就是说,第1个堆块的块身后紧接着是第2个堆块的块首。第1个堆块的空间只有100个字节,如果我们往里面复制了108个字节,则不就是正好覆盖了第2个堆块的块首吗?而这108个字节的内容是我们可以控制的,所以当free操作的时候,我们就得到了一个向任意内存地址写入任意数据的机会。

如果利用的好,就可以改变某个内存变量的值,甚至是堆栈中保存的函数返回地址,系统中接下来要调用的某个指针函数。这样,就达到了利用堆溢出来改变程序流向,进行攻击的目的。

如果LZ对安全感兴趣的话,我建议你看 王清 的《0DAY安全:软件漏洞分析技术》一书。

[ 本帖最后由 vxasm 于 2009-9-21 17:55 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2009-09-25 05:17 |只看该作者

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-08-03 06:20:00
9 [报告]
发表于 2009-09-25 09:01 |只看该作者
好啊 谢谢各位了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP