堆栈储存结构,以及溢出原理简介

栈:栈(先进后出)是一段连续的向低位地址延展的内存空间,由系统自动删除,释放。分配的空间一般是固定大小的。

堆:堆(先进先出)是一段不连续的向高位延展的内存空间,由程序员手动删除释放。堆分为已分配堆块和空闲空间块,当函数申请内存空间时,需要系统遍历空闲空间块中大于等于此内存空间需求的空闲块,将下一块的头指针指向匹配空闲内存前一块的尾部指针(指向下一个空间块的指针)。如果空间有剩余,将剩余空间重新放入空闲块链表。

溢出:
栈的溢出:栈分为链栈和顺序栈,链栈一般不会溢出,顺序栈容易出现溢出。栈的溢出一般是将大于栈块的数据储存进内存从而覆盖后面的内存空间的指针等,从而达到控制指针返回的地址,在篡改后返回地址的空间里存放shellcode。第二种为利用抛出异常进行攻击,(当执行除0操作等死循环的语句时系统会将系统指向一个异常处理体(SEH),此模块中包含了程序员自定义的异常处理方法和系统自带的处理方法【一般位于内存空间底部,所以从分配的内存空间到异常处理体指针之间存在很大的内存空间】。对此模块进行遍历,匹配能处理此异常的方法。如果用大量的数据填充空余空间并长到可以覆盖异常处理体指针,让其指向攻击者安排好的shellcode的地址空间在故意触发异常,就可以进行任意代码执行)

堆溢出:(我也是懵的,求大神路过指点)

GS栈溢出防御手法:将变量至于栈的底部(先进后出结构相当于头部)在变量和指针中间添加一个随机的cookie代码,溢出是会先覆盖cookie在覆盖指针,系统根据判断cookie是否改变来选择是否跳入指针所指地址。
GS绕过:通过SEH在系统检查cookie之前抛出异常,进入SEH中进行跳转绕过cookie检查。

posted on 2021-02-22 15:35  飞子的宝石  阅读(381)  评论(0编辑  收藏  举报

导航