对栈溢出的分析(未完成)

fs:[4]记录着栈顶地址。
打开OD,点击M按钮,查看内存情况。
显示堆栈区域是0x12e000~0x12efff,大小8K。
PE文件参数
SizeOfStackReserve = 100000 (1MB)
SizeOfStackCommit = 1000 (4KB)
也就是堆栈最大可为1MB大小,但是堆栈增长是以4KB为步进的。

对堆栈是否溢出,就是将指针指向堆栈底部,读取这个指针指向的内容。
然后将指针减小4K,再读取这个指针指向的内容。这样堆栈就生长了。
但堆栈生长总有个界限,就是1MB。
当读到边界的时候,触发堆栈overflow的异常。
下面是一段代码:

    __asm
    {
        mov ecx,fs:[4];//堆栈顶部
temp:
        test [ecx],eax;//经多次循环后,这里会触发异常,但不知道这里的内存是如何保护的??
        add ecx, -0x1000;
        jmp temp;

    }
此段代码参考了vc的运行时库函数_chkstk.asm

posted @ 2009-03-27 01:18  Fan Zhang  阅读(226)  评论(0编辑  收藏  举报