请教堆缓冲区溢出 利用malloc,free来攻击的原理

发布于 2022-09-18 03:20:58 字数 151 浏览 10 评论 0

网上资料比较少, 有些写得不太清楚。。。
希望大侠指导。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

巡山小妖精 2022-09-25 03:20:59

原帖由 317316abcd 于 2009-9-20 00:08 发表
谢谢 但我想知道的是原理  

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

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

一样的道理。

鸵鸟症 2022-09-25 03:20:59

原帖由 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 编辑 ]

伤痕我心 2022-09-25 03:20:59

好啊 谢谢各位了!

别理我 2022-09-25 03:20:58

缓冲区溢出,一句两句不好说明白。
建议看一下 如何写安全的代码。
好像是这本书。有电子版的。里边说的非常详细

独行侠 2022-09-25 03:20:58

原理很简单:比如你在C里,定义了一个CHAR BUF[10]; 但是你又用MEMCPY, STRCPY 向里面COPY了20或者更多的数据,那么就是缓冲区溢出。后果呢,轻的程序跑飞,重的则是程序完全被黑客控制。

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

同展鸳鸯锦 2022-09-25 03:20:58

给你一个关于缓冲区溢出最简单的例子

  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

复制代码

陌上青苔 2022-09-25 03:20:58

谢谢 但我想知道的是原理  

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文