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

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

相关文章:

  • 2022-02-14
  • 2021-09-21
  • 2021-05-19
  • 2021-07-18
  • 2022-01-15
猜你喜欢
  • 2022-12-23
  • 2021-04-26
  • 2021-10-07
  • 2021-08-16
  • 2021-10-05
  • 2021-09-12
相关资源
相似解决方案