文章总结: 文章系统梳理checksec各开关含义与绕过思路:RELRO分三级,FullGOT只读防改写;Canary栈Cookie阻溢出,可泄露或劫持绕过;NX禁栈执行需ROP;PIE+ASLR随机化基址,地址后三字节固定可部分覆盖;RPATH/RUNPATH优先搜库可fakelib;FORTIFY用_chk函数检查长度与格式。给出gcc开关速查表,指导PWN入门者按保护组合选利用策略。 综合评分: 78 文章分类: 二进制安全,漏洞分析,渗透测试,红队,安全工具
PWN入门笔记-checksec
原创
lys lys
绿洲安全
2026年1月23日 08:01 北京
免责声明
由于传播、利用本公众号绿洲安全所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号绿洲安全及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢
checksec file
Arch
程序架构信息,判断是64位还是32位,exp编写的时候是p64还是p32
RELRO:
Relocation Read-Onl(RELRO)此项技术主要针对GOT改写的攻击方式,它分成两种,Partial RELRO和FULL RELRO
Partial (部分)RELRO容易受到攻击,例如攻击者可以atoi.got为system.plt进而输入/bin/sh\x00获得shell,完全RELRO使整个GOT只读,从而无法被覆盖,但这样会大大增加程序的启动时间,因为程序在启动之前需要解析所有的符号。
gcc -o hello test.c //默认情况下,是Partial RELROgcc -z norelro -o hello test.c // 关闭,即No RELROgcc -z lazy -o hello test.c // 部分开启,即Partial RELROgcc -z now -o hello test.c // 全部开启,即Full RELRO
Stack-canary
栈溢出保护是一种缓冲区溢出攻击缓解手段,当函数存在缓冲区溢出攻击漏洞是,攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行,当启用栈保护后,函数开始执行的时候先会往栈里插入类似cookie信息,当函数真正返回的时候会验证cookie信息是否合法,如果不合法就停止程序运行,攻击者在覆盖返回地址的时候往往会将cookie信息给覆盖掉,导致栈保护检车失败而阻止shellcode的执行,在linux中我们将cookie信息称为canary。
gcc -fno-stack-protector -o hello test.c //禁用栈保护gcc -fstack-protector -o hello test.c //启用堆栈保护,不过只为局部变量中含有char数组的函数插入保护代码gcc -fstack-protector-all -o hello test.c //启用堆栈保护,为所有函数插入保护代码
#
NX
NX enabled如果这个保护开启就是意味着栈中数据没有执行权限,如此一来,当攻击者在堆栈上部署自己的shellcode并触发时,直接造成程序的崩溃,但是可以利用rop这种方法绕过
gcc -o hello test.c // 默认情况下,开启NX保护gcc -z execstack -o hello test.c // 禁用NX保护gcc -z noexecstack -o hello test.c // 开启NX保护
PIE
PTE(Position-Independent Executable,位置无关可执行文件)技术与ASLR技术类似,ASLR将程序运行时的堆栈以及共享库的加载地址随机化,而PIE及时则在编译时将程序编译为位置无关,即程序运行时各个段(如代码但等)加载的虚拟地址也是在装载时才确定,这就意味着。在PIE和ASLR同时开启的情况下,攻击者将对程序的内存布局一无所知,传统改写GOT表项也难以进行,因为攻击者不能获得程序的.got段的虚地址。若开始一般需在攻击时歇够地址信息
如果程序开启了PIE保护的话,在每次加载程序时都变换加载地址。但是内存是以页载入机制,如果开启PIE保护的话,只能影响到单个内存页,一个内存页大小为0x1000,那么就意味着不管地址怎么变,某一条指令的后三位十六进制数的地址是始终不变的。因此我们可以通过覆盖地址的后几位来可以控制程序的流程。
新版比以前的checksec有区别,多了几个选项,建议参考官方文档
gcc -o hello test.c // 默认情况下,不开启PIEgcc -fpie -pie -o hello test.c // 开启PIE,此时强度为1gcc -fPIE -pie -o hello test.c // 开启PIE,此时为最高强度2(还与运行时系统ALSR设置有关)
RPATH/RUNPATH
程序运行是的环境变量,运行时所需要的共享库文件优先从该目录寻找,可以fake lib造成攻击,实例:攻击案例
FORTIFY
这是一个由GCC实现的源码级别的保护机制,其功能是在编译的时候检查源码以避免潜在的缓冲区溢出等错误
简单地说,加了和这个保护之后,一些敏感函数如read,fgets,memcpy,printf等等可能导致漏洞出现的函数会替换成__read_chk,__fgets_chk等。
这些带了chk的函数 会检查读取/复制的字节长度是否超过缓冲区长度,通过检查诸如%n之类的字符串位置是否位于可能被用户修改的可写地址,避免了格式化字符串跳过某些函数如直接(%7$x)等方式来避免漏洞出现,开启FORTIFT保护的程序会被checksec检出,此外,在反编译是直接查看got表也会发现chk函数的存在,这种检查是默认不开启的,可以通过。
gcc -D_FORTIFY_SOURCE=2 -O1开启fortity检查,开启后会替换strcpy等危险函数
总结
各种安全选择的编译参数如下:
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 (关闭 / 部分开启 / 完全开启)
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:绿洲安全 lys lys《PWN入门笔记-checksec》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论