elf文件分析--checksec--检查gcc安全编译配置

news/2024/6/29 11:48:51 标签: checksec, 编译器

checksec介绍

相关链接:

GitHub - slimm609/checksec.sh: Checksec.sh

checksec.sh

使用截图:

checksec源代码分析

Checksec是一个bash脚本,用于检查可执行文件的属性(例如PIE,RELRO,PaX,Canaries,ASLR,Fortify Source)。

通过阅读源码可以知道,脚本只要调用了readelf来检测二进制文件的特征;所以执行环境中要可以执行readelf,不然会报错。

然后再者bin包不是elf文件,需要解包之后,对解开的二进制文件进行扫描。

结果相关说明:

RELRO

表示对是否有对数据区域的读写进行限制。

在Linux系统安全领域数据可以写的存储区就会是攻击的目标,尤其是存储函数指针的区域。 所以在安全防护的角度来说尽量减少可写的存储区域对安全会有极大的好处.

GCC, GNU linker以及Glibc-dynamic linker一起配合实现了一种叫做relro的技术: read only relocation。大概实现就是由linker指定binary的一块经过dynamic linker处理过 relocation之后的区域为只读.

设置符号重定向表格为只读或在程序启动时就解析并绑定所有动态符号,从而减少对GOT(Global Offset Table)攻击。RELRO为” Partial RELRO”,说明我们对GOT表具有写权限。

gcc编译:

gcc -o test test.c                                // 默认情况下,是Partial RELRO

gcc -z norelro -o test test.c                        // 关闭,即No RELRO

gcc -z lazy -o test test.c                                // 部分开启,即Partial RELRO

gcc -z now -o test test.c                                // 全部开启,即Full RELRO

STACK CANARY

表示栈保护功能有没有开启。

栈溢出保护是一种缓冲区溢出攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行。当启用栈保护后,函数开始执行的时候会先往栈里插入cookie信息,当函数真正返回的时候会验证cookie信息是否合法,如果不合法就停止程序运行。攻击者在覆盖返回地址的时候往往也会将cookie信息给覆盖掉,导致栈保护检查失败而阻止shellcode的执行。在Linux中我们将cookie信息称为canary。

gcc在4.2版本中添加了-fstack-protector和-fstack-protector-all编译参数以支持栈保护功能,4.9新增了-fstack-protector-strong编译参数让保护的范围更广。

因此在编译时可以控制是否开启栈保护以及程度,例如:


gcc -o test test.c                                // 默认情况下,不开启Canary保护

gcc -fno-stack-protector -o test test.c                  //禁用栈保护

gcc -fstack-protector -o test test.c                   //启用堆栈保护,不过只为局部变量中含有 char 数组的函数插入保护代码

gcc -fstack-protector-all -o test test.c                 //启用堆栈保护,为所有函数插入保护代码

NX

表示是否对内存有进行保护。

NX即No-eXecute(不可执行)的意思,NX(DEP)的基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。

gcc编译器默认开启了NX选项,如果需要关闭NX选项,可以给gcc编译器添加-z execstack参数。

例如:


gcc -o test test.c                        // 默认情况下,开启NX保护

gcc -z execstack -o test test.c                // 禁用NX保护

gcc -z noexecstack -o test test.c                // 开启NX保护

在Windows下,类似的概念为DEP(数据执行保护),在最新版的Visual Studio中默认开启了DEP编译选项。

PIE

表示虚地址

一般情况下NX(Windows平台上称其为DEP)和地址空间分布随机化(ASLR)会同时工作。

内存地址随机化机制(address space layout randomization),有以下三种情况

0 - 表示关闭进程地址空间随机化。

1 - 表示将mmap的基址,stack和vdso页面随机化。

2 - 表示在1的基础上增加栈(heap)的随机化。

可以防范基于Ret2libc方式的针对DEP的攻击。ASLR和DEP配合使用,能有效阻止攻击者在堆栈上运行恶意代码。

Built as PIE:位置独立的可执行区域(position-independent executables)。这样使得在利用缓冲溢出和移动操作系统中存在的其他内存崩溃缺陷时采用面向返回的编程(return-oriented programming)方法变得难得多。


liunx下关闭PIE的命令如下:

sudo -s echo 0 > /proc/sys/kernel/randomize_va_space



gcc编译命令

gcc -o test test.c                        // 默认情况下,不开启PIE

gcc -fpie -pie -o test test.c                // 开启PIE,此时强度为1

gcc -fPIE -pie -o test test.c                // 开启PIE,此时为最高强度2

gcc -fpic -o test test.c                        // 开启PIC,此时强度为1,不会开启PIE

gcc -fPIC -o test test.c                        // 开启PIC,此时为最高强度2,不会开启PIE

RPATH/RUNPATH

程序运行时的环境变量,运行时所需要的共享库文件优先从该目录寻找,可以fake lib造成攻击。

Linux Privilege Escalation via Dynamically Linked Shared Object Library | Context Information Security

新增:

FORTIFY

用于检查是否存在缓冲区溢出的错误。适用情形是程序采用大量的字符串或者内存操作函数,如memcpy,memset,stpcpy,strcpy,strncpy,strcat,strncat,sprintf,snprintf,vsprintf,vsnprintf,gets以及宽字符的变体。

_FORTIFY_SOURCE设为1,并且将编译器设置为优化1(gcc -O1),以及出现上述情形,那么程序编译时就会进行检查但又不会改变程序功能

_FORTIFY_SOURCE设为2,有些检查功能会加入,但是这可能导致程序崩溃。


gcc -D_FORTIFY_SOURCE=1 仅仅只会在编译时进行检查 (特别像某些头文件 #include <string.h>)

gcc -D_FORTIFY_SOURCE=2 程序执行时也会有检查 (如果检查到缓冲区溢出,就终止程序)



gcc -D_FORTIFY_SOURCE=1 -o test test.c                // 较弱的检查

gcc -D_FORTIFY_SOURCE=2 -o test test.c                // 较强的检查

参考:

checksec及其包含的保护机制 | YungGong

PWN-最新checksec的安装和使用_GitCloud的博客-CSDN博客_checksec

GCC

GCC 参数详解 | 菜鸟教程

GCC编译器30分钟入门教程

GCC 安全编译选项


http://www.niftyadmin.cn/n/1489549.html

相关文章

硬件设备固件静态分析

IDA静态分析 识别固件加载地址&#xff08;待填&#xff09; 多工具合集扫描 参考之前的文章描述&#xff1a;智能硬件固件分析_samli的博客-CSDN博客 静态分析&#xff0c;分析完成后&#xff0c;简单写个脚本&#xff1a; #!/bin/bashFileName$1echo "-----------------…

一文了解智能门锁的功能选购和安全性

最近临近双十一&#xff0c;如果大家有要购买智能门锁的需求&#xff0c;可以看这篇文章&#xff0c;如果暂时没有需求&#xff0c;也可以看看这篇文章&#xff0c;了解一下当前智能门锁的功能和安全性&#xff1b; 先通过消费者需要购买智能门锁的视角来看&#xff1b; 购物…

APP动态分析-AndroidStudio调试+IDA 我来了

历史文章了&#xff0c;补发上来 0x00 前言 动态分析&#xff08;dynamic analysis&#xff09;是指在严格控制的环境&#xff08;沙盒&#xff09;中执行恶意软件&#xff0c;并使用系统检测实用工具记录其所有行为 静态分析&#xff08;static analysis&#xff09;通过浏览程…

APP动态分析-Eclipse调试

0x00 开篇 这篇也是历史文章&#xff0c;来迁移的&#xff1b; 之前说过&#xff0c;用Android Studio和Eclipse对应用进行动态调试的机会会很少&#xff0c;但是最近接触一个项目就需要用到动态调试的技术&#xff0c;而之前已经讲过Android Studio对smali的动态调试了&#x…

UPnP和DLNA协议

前言 没有情情爱爱&#xff0c;只有技术相伴&#xff0c;给大家分享一下UPnP和DLNA协议&#xff1b; UPnP的概念 通用即插即用&#xff08;英语&#xff1a;Universal Plug and Play&#xff0c;简称UPnP&#xff09;是由“通用即插即用论坛”&#xff08;UPnP™ Forum&…

智能调试设备动态分析-gdb

开篇 在《智能硬件固件分析》中讲了关于固件静态分析部分&#xff0c;从常见的固件获取方式&#xff0c;以及拿到固件后如何分析&#xff0c;涉及到的相关工具&#xff0c;并最后完成自己的静态分析脚本&#xff1b;然后静态分析的弊端也是非常明显&#xff0c;具体可以看以前…

Miracast协议

Miracast Miracast是由Wi-Fi联盟于2012年所制定&#xff0c;以Wi-Fi直连&#xff08;Wi-Fi Direct&#xff09;为基础的无线显示标准。支持此标准的消费性电子产品&#xff08;又称3C设备&#xff09;可透过无线方式分享视频画面&#xff0c;例如手机可透过Miracast将影片或照片…

墨者学院在线靶场writeup

入门 WEB页面源代码查看 打开是一个HTML页面&#xff0c;鼠标右键被禁用&#xff0c;直接F12&#xff0c;控制台点Elements看源代码,就发现key了 WEB页面分析 打开靶场F12&#xff0c;看到注释&#xff0c;按照注释方法构造url,index.php?urllogin.php,跳转拿到key 服务器…