Canary:
在系统中插入一个"Canary"值,即一个特定的随机数或标记。这个Canary值被放置在缓冲区(buffer)的末尾,用于检测缓冲区溢出(buffer overflow)攻击。
当攻击者试图修改缓冲区以达到控制系统的目的时,他们通常会尝试覆盖Canary值。由于Canary值是随机生成的,攻击者不知道正确的值是什么,所以如果Canary值被修改,系统就会立即检测到,并采取相应的防御措施,例如终止程序或警报管理员。
Canary bypass:
PIE:
PIE技术是一个针对代码段(.text)、数据段(.data)、未初始化全局变量段(.bss)
等固定地址的一个防护技术,如果程序开启了PIE保护的话,在每次加载程序时都变
换加载地址,从而不能通过ROPgadget等一些工具来帮助解题
PIE bypass:
如图为开了pie保护的程序,所有代码段的地址都只有最后三个数是已知的(代表了实际地址与程序加载地址的偏移量),这里有一点要知道的是,程序的加载地址一般都是以内存页为单位的,所以程序的基地址最后三个数字一定是0,这也就是说那些地址已知的最后三个数就是实际地址的最后三个数。知道这一点之后我们就有了绕过pie的思路,虽然我并不知完整的地址,但我知道最后三个数,那么我们是不是可以利用栈上已有的地址,只修改他们最后两个字节(最后四个数)即可。
所以对于绕过PIE保护的核心思想就是partial writing(部分写地址)
NX:
堆栈不可执行,即注入的SHELLCODE无法执行
NX bypass:
目前主要的是ROP(Return Oriented Programming)其主要思想是在栈缓冲区溢出的基础上,利用程序中已有的小片段(gadgets)来改变
某些寄存器或者变量的值,从而控制程序的执行流程。所谓gadgets就是以ret结尾的指令序列,通过这些指令序列,我们可以修改某些地址的内容,方便控制程序的执行流程。
之所以称之为ROP,是因为核心在于利用了指令集中的ret指令,改变了指令流的执行顺序ROP攻击一般得满足如下条件:
1.程序存在溢出,并且可以控制返回地址。
2.可以找到满足条件的gadgets以及相应gadgets的地址。
如果gadgets每次的地址是不固定的,那我们就需要想办法动态获取对应的地址了
ret2text即控制程序执行程序本身已有的的代码(.text)。其实,这种攻击方法是一种笼统的描述。我们控制
执行程序已有的代码的时候也可以控制程序执行好几段不相邻的程序已有的代码(也就是gadgets),这就
是我们所要说的ROP。