zoukankan      html  css  js  c++  java
  • ELF保护机制

    通过工具checksec可以查看ELF文件保护机制

    gcc编译参数

    NX:-z execstack / -z noexecstack (关闭 / 开启)
    Canary:-fno-stack-protector /-fstack-protector / -fstack-protector-all (关闭 / 开启 / 全开启)
    PIE:-no-pie / -pie (关闭 / 开启)
    RELRO:-z norelro / -z lazy / -z now (关闭 / 部分开启 / 完全开启)
    

    RELRO (RELocation Read Only)

    重定位表只读,重定位表即为.got.plt两个表。此项技术针对对GOT(Global Offset Table)的攻击。linux下RELRO有Partial RELROFull RELRO两种模式 。区别于:Partial RELRO模式下,GOT的非plt部分是只读的,而got.plt可写; Full RELRO模式下 ,整个GOT被标记为只读。

    Canary(栈保护)

    Canary 的意思是金丝雀,来源于英国矿井工人用来探查井下气体是否有毒的金丝雀笼子。工人们每次下井都会带上一只金丝雀。如果井下的气体有毒,金丝雀由于对毒性敏感就会停止鸣叫甚至死亡,从而使工人们得到预警。在技术上表示最先的测试。
    程序在初始化时会生成一个随机值(以x00结尾),并将其插入到返回值之前,函数返回前程序会检测该值是否有改动。如果发生栈溢出,canary的值被覆盖,程序就会崩溃。

    NX(Non-Executable Memory)(windows 下为DEP)

    NX是一项用于CPU的技术,可以确保数据、堆栈所在的内存页等不可执行,其他区域(如代码段)则不可写入。
    启用NX后,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。绕过保护最常见的方法为ROP(Return-Oriented Programming) 。

    ASLR(Address space layout randomization)

    地址空间布局随机化,通过随机化关键数据区域的地址(堆、栈、libc库等)来防止攻击者定位攻击代码位置,迫使其不得不泄露相同的地址来计算基址。但是地址随机化不是对所有模块和内存区都进行随机化,虽然libc、栈、堆的加载位置被随机化,但主镜像不会,这也是绕过的关键手段。

    PIE(Position-Independent Executable)

    位置无关可执行文件。与ASLR类似,将基址随机化, 程序运行时的各个段加载的虚地址在装载时才确定。
    在PIE和ASLR同时开启的情况下, 攻击者将对程序的内存布局一无所知, 传统的改写GOT表项的方法也难以进行, 因为攻击者不能获得程序的.got段的虚地址。

    FORTIFY

    用于检测对内存和字符串执行操作的各种函数中的缓冲区溢出。加了这个保护之后,一些敏感函数如read, fgets,memcpy, printf等等可能导致漏洞出现的函数都会被替换成 _read_chk,_fgets_chk_memcpy_chk,_printf_chk等。
    这些带了chk的函数会检查读取/复制的字节长度是否超过缓冲区长度,通过检查诸如%n之类的字符串位置是否位于可能被用户修改的可写地址,避免了格式化字符串跳过某些参数(如直接%7$x)等方式来避免漏洞出现。
    提供保护的函数还有memcpy, mempcpy, memmove, memset, strcpy, stpcpy, strncpy, strcat, strncat, sprintf, vsprintf, snprintf, vsnprintf, gets。

    参考文章:

    https://www.redhat.com/en/blog/hardening-elf-binaries-using-relocation-read-only-relro
    http://ggb0n.cool/2020/05/13/入坑二进制/#more
    https://blog.csdn.net/weixin_44932880/article/details/104092620
    https://ctf-wiki.github.io/ctf-wiki/pwn/linux/mitigation/canary/
    https://access.redhat.com/blogs/766093/posts/1976213

  • 相关阅读:
    MyBatis 处理sql中的 大于,小于,大于等于,小于等于
    以当前日期为时间轴 计算15 天的日期 和15 天后的日期
    java 常用时间操作类,计算到期提醒,N年后,N月后的日期
    用户号已经存在是否覆盖解决办
    List<bean> 转换成List<Map>
    feig中调用其他微服务接口无反应
    从实体类中取值 ,获取修改记录信息,保存修改记录信息
    java遍历实体类的属性和值
    从数据库将数据导出到excel表格
    树同构模板
  • 原文地址:https://www.cnblogs.com/pluie/p/13053033.html
Copyright © 2011-2022 走看看