canary_pie绕过
canary是一种用来防护栈溢出的保护机制。其原理是在一个函数的入口处,先从fs/gs寄存器中取
当canary被纂改时,触发__Stack_chk_fail。
canary bypass
格式化字符串绕过canary
-
通过格式化字符串读取canary的值
Canary爆破(针对有fork函数的程序)
-
fork作用相当于自我复制,每一次复制出来的程序,内存布局都是一样的,当然canary值也一样。那我们就可以逐位爆破,如果程序崩溃了就说明这一位不对,如果程序正常就可以接着跑下一位,直到跑出正确的canary
Stack smashing(故意触发canary_ssp leak)
劫持__stack_chk_fail
-
修改got表中__stack_chk_fail函数的地址,在栈溢出后执行该函数,但由于该函数的地址被修改,所以程序会跳转到我们想要执行的地址
格式化字符串简介
在c语言中,我们要输出一串字符,通常会采用printf函数,一般代码如下: Printf(“%s”,str); Str变量中的内容就会被打印出来。而这里的%s就是我们所说的格式化字符串,将变量中内容按照格式化字符串的规定打印出来。而这里就会出现我们可以利用的东西在c语言课上,应该讲过%s就是把一串字符串打印出来,而判断字符串结束的依据是结尾的\x00,所以如果我们把输入的内容和canary连在一起,那么打印的时候就会将canary一起打印出来。需要注意的是canary的最后一位一定是\x00,用于防止连带输出,所以我们改的时候要把canary最后一位也改了
PIE机制介绍
PIE PIE技术是一个针对代码段(.text)、数据段(.data)、未初始化全局变量段(.bss)等固定地址的一个防护技术,如果程序开启了PIE保护的话,在每次加载程序时都变换加载地址,从而不能通过ROPgadget等一些工具来帮助解题
绕过方法