317316abcd 发表于 2009-09-16 00:11

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

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

emmoblin 发表于 2009-09-17 00:12

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

accessory 发表于 2009-09-18 23:15

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

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

cjaizss 发表于 2009-09-19 09:28

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

$ cat 3.c
#include <stdio.h>
int main()
{
      char s;
      int i;
      int j;
      printf("Input a number:\n");
      scanf("%d",&i);
      printf("The number is %d\n\n",i);
      j=i;
      printf("Input a string:\n");
      scanf("%s",s);
      printf("The string is \"%s\"\n\n",s);
      if(i==j)
                printf("OK\n");
      else
                printf("Fuck\n");
      return 0;

}
$ gcc 3.c
$ ./a.out
Input a number:
1
The number is 1

Input a string:
abc
The string is "abc"

OK
$ ./a.out
Input a number:
1
The number is 1

Input a string:
abcdefghijk
The string is "abcdefghijk"

Fuck
$ ./a.out
Input a number:
1
The number is 1

Input a string:
abcdefghijklmnop
The string is "abcdefghijklmnop"

Fuck
Segmentation fault

317316abcd 发表于 2009-09-20 00:08

谢谢 但我想知道的是原理

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

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

cjaizss 发表于 2009-09-21 16:26

原帖由 317316abcd 于 2009-9-20 00:08 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
谢谢 但我想知道的是原理

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

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

vxasm 发表于 2009-09-21 17:53

原帖由 317316abcd 于 2009-9-20 00:08 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
谢谢 但我想知道的是原理

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

网上说可以利用 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 编辑 ]

accessory 发表于 2009-09-25 05:17

another link:

http://www.phrack.org/issues.html?issue=57&id=9#article

317316abcd 发表于 2009-09-25 09:01

好啊 谢谢各位了! :em09: :em09:
页: [1]
查看完整版本: 请教堆缓冲区溢出 利用malloc,free来攻击的原理