x86 linux内核栈溢出一则

1597阅读 2评论2012-03-08 zboom
分类:LINUX

这是前一段时间遇到的一个问题,先看这段代码:

struct result{ 
    unsigned int a;
    unsigned int b;
    unsigned int c;
};

int func()
{
    struct result temp[512];
    memset(temp,0,sizeof(struct result)*512);
    /*use temp do something...*/
    return 0;
}

  这段代码在跑在mips平台的内核运行良好,但是到x86平台上,直接挂了,没有任何堆栈打印……
经高人指点,偶可能是遇到了传说中的栈溢出,做一个简单验证,将temp数组定义放到func前面,程序又恢复了正常。

于是乎采用kmalloc代替数组,问题解决。

分析一下内核栈大小,便可知道原因:
include/asm-i386/thread_info.h THREAD_SIZE
#ifdef CONFIG_4KSTACKS
#define THREAD_SIZE            (4096)
#else
#define THREAD_SIZE             (8192)
#endif

内核配置的时候,有一个4K内核栈的选项,如果选上了,内核栈为4K;如果没有选上,内核栈是8K。

    上面的代码的内核堆栈大小是4K,却申请了6K的结构,然后memset了一下,结果可想而知,
栈被写坏了。

参考:
http://blog.chinaunix.net/space.php?uid=20357359&do=blog&id=1963624
http://hi.baidu.com/whs08/blog/item/84437202d89a35074bfb5196.html


上一篇:整数溢出漏洞的修改与分析
下一篇:通过proc获取当前进程内存使用

文章评论