canary_pie绕过

canary机制介绍

canary是一种用来防护栈溢出的保护机制。其原理是在一个函数的入口处,先从fs/gs寄存器中取 出一个4字节(eax)或者8字节(rax)的值存到栈上,当函数结束时会检查这个栈上的值是否和存进去 的值一致

当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等一些工具来帮助解题

绕过方法 刚刚在程序中看到的开了pie保护的程序,所有代码段的地址都只有最后三个数是已知的,这里有一点要知道的是,程序的加载地址一般都是以内存页为单位的,所以程序的基地址最后三个数字一定是0,这也就是说那些地址已知的最后三个数就是实际地址的最后三个数。知道这一点之后我们就有了绕过pie的思路,虽然我并不知完整的地址,但我知道最后三个数,那么我们是不是可以利用栈上已有的地址,只修改他们最后两个字节(最后四个数)即可。所以对于绕过PIE保护的核心思想就是partial writing(部分写地址)

posted @ 2022-01-17 22:32  vi0let  阅读(371)  评论(0编辑  收藏  举报