对保护机制在稍微学习一下
NX保护
简述原理:全称为No-eXecute即不可执行的意思,在Linux中,开启nx保护后,程序载入内存后,将text保存可执行权限,stack(栈)、data(数据段)、bss(未初始化全局变量段)设置为不可执行权限
主要防护攻击:
shellcode攻击
bss栈迁移攻击
绕过方式:(但没必要,一般有很多其他方法做题)
利用mrprotect将地址段提权为可执行
开启了nx保护的权限
关闭nx保护的权限
stack、data、bss都失去了可执行权限,我们就是可以读入shellcode到这些区域,也无法执行shellcode
如果我们没开启nx保护的话,例如将shellcode读入到bss段即可,然后控制返回地址就可以执行我们读入的shellcode了,因为栈存在可执行权限
但如果开启了nx保护的话,光看栈的话你会觉得没什么区别,照样会正常返回,但是由于缺失了可执行权限导致后续的代码不能执行的,而上面哪些代码可以正常执行是因为在test段存在可执行权限
canary保护(栈保护)
简述原理:canary保护主要用于防范栈溢出漏洞,开启了canary保护后,会在程序启动的时候从fs/gs寄存器附近取到一个00结尾的随机值,一般会填充到rbp(或ebp)寄存器的上方,当函数结束时候会检查这个栈上的值(canary)是否和存进去的值一样,如果canary被修改则触发_stack_chk_fail导致程序终止。(且不同线程的canary不相同)
图
主要防范攻击:
栈溢出攻击
绕过方法:
泄露canary(格式化字符串,函数截断)
canary爆破(逐位爆破,针对于fork函数的程序)
ssp打印(ubuntu16之后不适用)
tls劫持
canary判断
canary报错
调试中的canary
将其覆盖掉的话就会导致后续的_stack_chk_fali检查不通过
其实对于canary来说呢,它就像是晚上必经路上的路灯,它坏了,你的路也走不下去了,我们进行栈溢出攻击的时候,你给他摘下来擦擦,安上去更亮了,你的路也好走了
PIE保护(ASLR)
简述原理: pie保护是针对于text(代码段)、data(数据段)、bss(未初始化全局变量段)等固定地址随机化的防护技术,开启pie保护后,每次加载程序时都变化加载地址,从而不能使用ROPgadget等一些工具来帮忙解题,但是程序中的相对寻址不会改变(相对于基址的偏移),如果可以获得基址的话加上偏移(一字节8个字节,低12位是不变的)我们依旧可以找到对应的程序地址、段地址
主要防范攻击:
ret2libc
rop链攻击
程序信息泄露
绕过方式:
泄露基地址(格式化字符串,函数字符串截断)
partial write(爆破低位字节)
未开启pie在ida中的地址显示
你可以直接在gdb中查看到代码段内容
开启了pie在ida中的地址显示
你无法直接用偏移查看内容
而你加上基地址就可以了
做开启pie的题的时候一般利用格式化字符串泄露地址,在减去偏移找到基地址,在加上ida中的偏移找到对应地址就可以像没开启pie一样使用了
其实对于pie保护的话,只是为了让你没法直接获得具体的地址,而进行的随机化,可是程序也要寻址执行函数,如果无迹可寻那是不可能的,而这个逻辑就是我们所说的地址偏移(对于基址的相对寻址),libc的寻址亦是如此
RELRO保护
简述原理:由于got表和plt表以及延迟绑定的原因,导致got.plt必须可以写,这就给了攻击者篡改got表劫持程序的可能,RELRO保护机制就是为了解决延迟绑定的安全问题,在程序启动时就解析并保定所有的动态符号,从而避免got表地址被修改
延迟绑定简述:plt(程序连链接表)存储了一个跳表,在第一次执行一个函数的时候进行跳转执行函数并往got表(全局偏移量表)中填充真实地址
详细的可以自己看看延迟绑定(pwn第三课)-CSDN博客
主要防范攻击:
修改got表
绕过方式:(但是一般没必要,很多方法可以攻击)
利用mrprotect将got地址段提权为可写
这是未开启RELRO保护的情况
刚运行程序的got表情况,很多函数还并没有进行第一次调用,got表中还没存入真实地址,所以还要存在可写权限去修改
got地址段权限
这是开启了RELRO保护
程序启动got表的情况,got表中已经存入了真实地址,然后就失去了可写的权限
got地址段权限
对于RELRO保护来说,其实就是在最开始不需要执行函数就进行了got表绑定,然后将got地址段设置为了不可写(也就是后续程序不能在修改了)而防止修改got表的防御
- 本文作者: NEWYM
- 本文链接: http://example.com/2024/11/29/checksec及其保护机制/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!