checksec及其保护机制

pwn四大保护

对保护机制在稍微学习一下

NX保护

简述原理:全称为No-eXecute即不可执行的意思,在Linux中,开启nx保护后,程序载入内存后,将text保存可执行权限,stack(栈)、data(数据段)、bss(未初始化全局变量段)设置为不可执行权限

主要防护攻击:

shellcode攻击

bss栈迁移攻击

绕过方式:(但没必要,一般有很多其他方法做题)

利用mrprotect将地址段提权为可执行

开启了nx保护的权限

1732874553486

关闭nx保护的权限

1732874565675

stack、data、bss都失去了可执行权限,我们就是可以读入shellcode到这些区域,也无法执行shellcode

如果我们没开启nx保护的话,例如将shellcode读入到bss段即可,然后控制返回地址就可以执行我们读入的shellcode了,因为栈存在可执行权限

1732874574480

但如果开启了nx保护的话,光看栈的话你会觉得没什么区别,照样会正常返回,但是由于缺失了可执行权限导致后续的代码不能执行的,而上面哪些代码可以正常执行是因为在test段存在可执行权限

1732874580404

canary保护(栈保护)

简述原理:canary保护主要用于防范栈溢出漏洞,开启了canary保护后,会在程序启动的时候从fs/gs寄存器附近取到一个00结尾的随机值,一般会填充到rbp(或ebp)寄存器的上方,当函数结束时候会检查这个栈上的值(canary)是否和存进去的值一样,如果canary被修改则触发_stack_chk_fail导致程序终止。(且不同线程的canary不相同)

1732874588870

主要防范攻击:

栈溢出攻击

绕过方法:

泄露canary(格式化字符串,函数截断)

canary爆破(逐位爆破,针对于fork函数的程序)

ssp打印(ubuntu16之后不适用)

tls劫持

canary判断

1732874608111

canary报错

1732874616537

调试中的canary

1732874622987

将其覆盖掉的话就会导致后续的_stack_chk_fali检查不通过

1732874630575

1732874638821

其实对于canary来说呢,它就像是晚上必经路上的路灯,它坏了,你的路也走不下去了,我们进行栈溢出攻击的时候,你给他摘下来擦擦,安上去更亮了,你的路也好走了

PIE保护(ASLR)

简述原理: pie保护是针对于text(代码段)、data(数据段)、bss(未初始化全局变量段)等固定地址随机化的防护技术,开启pie保护后,每次加载程序时都变化加载地址,从而不能使用ROPgadget等一些工具来帮忙解题,但是程序中的相对寻址不会改变(相对于基址的偏移),如果可以获得基址的话加上偏移(一字节8个字节,低12位是不变的)我们依旧可以找到对应的程序地址、段地址

主要防范攻击:

ret2libc

rop链攻击

程序信息泄露

绕过方式:

泄露基地址(格式化字符串,函数字符串截断)

partial write(爆破低位字节)

未开启pie在ida中的地址显示

1732874653811

你可以直接在gdb中查看到代码段内容

1732874661234

开启了pie在ida中的地址显示

1732874785878

你无法直接用偏移查看内容

1732874796525

而你加上基地址就可以了

1732874807679

1732874814031

做开启pie的题的时候一般利用格式化字符串泄露地址,在减去偏移找到基地址,在加上ida中的偏移找到对应地址就可以像没开启pie一样使用了

1732874824165

其实对于pie保护的话,只是为了让你没法直接获得具体的地址,而进行的随机化,可是程序也要寻址执行函数,如果无迹可寻那是不可能的,而这个逻辑就是我们所说的地址偏移(对于基址的相对寻址),libc的寻址亦是如此

RELRO保护

简述原理:由于got表和plt表以及延迟绑定的原因,导致got.plt必须可以写,这就给了攻击者篡改got表劫持程序的可能,RELRO保护机制就是为了解决延迟绑定的安全问题,在程序启动时就解析并保定所有的动态符号,从而避免got表地址被修改

延迟绑定简述:plt(程序连链接表)存储了一个跳表,在第一次执行一个函数的时候进行跳转执行函数并往got表(全局偏移量表)中填充真实地址

详细的可以自己看看延迟绑定(pwn第三课)-优快云博客

主要防范攻击:

修改got表

绕过方式:(但是一般没必要,很多方法可以攻击)

利用mrprotect将got地址段提权为可写

这是未开启RELRO保护的情况

刚运行程序的got表情况,很多函数还并没有进行第一次调用,got表中还没存入真实地址,所以还要存在可写权限去修改

1732874840313

got地址段权限

1732874848427

这是开启了RELRO保护

程序启动got表的情况,got表中已经存入了真实地址,然后就失去了可写的权限

1732874857663

got地址段权限

1732874866434

对于RELRO保护来说,其实就是在最开始不需要执行函数就进行了got表绑定,然后将got地址段设置为了不可写(也就是后续程序不能在修改了)而防止修改got表的防御

链图片转存中…(img-JB6eV2BY-1743508235227)]

got地址段权限

[外链图片转存中…(img-QoZLaJvy-1743508235227)]

对于RELRO保护来说,其实就是在最开始不需要执行函数就进行了got表绑定,然后将got地址段设置为了不可写(也就是后续程序不能在修改了)而防止修改got表的防御

`checksec` 是一款用于检查 ELF、PE 或 Mach-O 等二进制文件安全特性的工具,它可以快速帮助开发者评估目标程序的安全状况。通过 `checksec` 我们可以方便地了解诸如 NX(No-eXecute)、PIE(Position Independent Executable)、Canary、RELRO (Relocation Read-Only)等关键防护功能是否已启用。 关于您提到的“重定向保护”,实际上对应的是 **RELRO (Read-only relocations)** 设置情况。下面详细讲解一下如何用 `checksec` 来检测这项设置: ### 检测步骤 假设我们要对名为 `example.bin` 的二进制文件进行分析,首先安装好 checksec 工具之后就可以直接运行命令: ```bash checksec --file=example.bin ``` 这会生成一份详细的报告,其中包含以下内容片段: ``` RELRO STACK CANARY NX PIE RPATH RUNPATH FILE Partial RELRO No canary found NX enabled PIE enabled No RPATH No RUNPATH example.bin ``` 从上述示例结果来看,“Partial RELRO” 表明此应用仅实现了部分重定位表只读化;理想状态下我们应该追求 "Full RELRO" ,即完整版的重定向保护。 #### 结果解释 - **Full RELRO**: 动态解析过程完成后立即把 GOT 区域置为只读,提供最强有力的防御能力。 - **Partial RELRO**: 在初始化阶段就把静态解析的部分标记成不可更改状态,不过对于剩余那些需待到运行时期再解决的地方依旧允许写入操作直至整个动态装载结束才改设限。所以相比之下 Full RELRO 更加稳妥可靠些。 ### 总结 如果希望获得更强硬的抗攻击性能的话,则务必争取做到全盘式 RELRO 加固而非仅仅满足于局部层级的实施而已。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值