CTF-Pwn入门基础工具——Checksec

拿到pwn题的第一步大都是运行下,再拿checksec看开启了哪些保护机制,这篇文章主要介绍checksec的安装和使用要点。

checksec:x64dbg plugin to check security settings - GitCode

  • 安装
git clone https://github.com/slimm609/checksec.sh.git
cd checksec.sh
sudo ln –sf checksec /usr/bin/checksec
(gdb-peda自带老版本的checksec,最后会做对比)
  • 使用(peda内置)
checksec filename

checksec

Arch:

程序架构信息。判断是拖进64位IDA还是32位?exp编写时p64还是p32函数?

RELRO

Relocation Read-Only (RELRO) 此项技术主要针对 GOT 改写的攻击方式。它分为两种,Partial RELRO 和 Full RELRO。
部分RELRO 易受到攻击,例如攻击者可以atoi.got为system.plt,进而输入/bin/sh\x00获得shell
完全RELRO 使整个 GOT 只读,从而无法被覆盖,但这样会大大增加程序的启动时间,因为程序在启动之前需要解析所有的符号。

gcc -o hello test.c // 默认情况下,是Partial RELRO
gcc -z norelro -o hello test.c // 关闭,即No RELRO
gcc -z lazy -o hello test.c // 部分开启,即Partial RELRO
gcc -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

PIE(Position-Independent Executable, 位置无关可执行文件)技术与 ASLR 技术类似,ASLR 将程序运行时的堆栈以及共享库的加载地址随机化, 而 PIE 技术则在编译时将程序编译为位置无关, 即程序运行时各个段(如代码段等)加载的虚拟地址也是在装载时才确定。这就意味着, 在 PIE 和 ASLR 同时开启的情况下, 攻击者将对程序的内存布局一无所知, 传统的改写
GOT 表项的方法也难以进行, 因为攻击者不能获得程序的.got 段的虚地址。
若开启一般需在攻击时泄露地址信息

gcc -o hello test.c  // 默认情况下,不开启PIE
gcc -fpie -pie -o hello test.c  // 开启PIE,此时强度为1
gcc -fPIE -pie -o hello test.c  // 开启PIE,此时为最高强度2
(还与运行时系统ALSR设置有关)
新版checksec

多了几个选项,简单说一下

RPATH/RUNPATH

程序运行时的环境变量,运行时所需要的共享库文件优先从该目录寻找,可以fake lib造成攻击
实例:https://www.contextis.com/en/blog/linux-privilege-escalation-via-dynamically-linked-shared-object-library

FORTIFY

这是一个由GCC实现的源码级别的保护机制,其功能是在编译的时候检查源码以避免潜在的缓冲区溢出等错误。
简单地说,加了这个保护之后,一些敏感函数如read, fgets,memcpy, printf等等可能
导致漏洞出现的函数都会被替换成__read_chk,__fgets_chk, __memcpy_chk, __printf_chk等。
这些带了chk的函数会检查读取/复制的字节长度是否超过缓冲区长度,

通过检查诸如%n之类的字符串位置是否位于可能被用户修改的可写地址,
避免了格式化字符串跳过某些参数(如直接%7$x)等方式来避免漏洞出现。
开启了FORTIFY保护的程序会被checksec检出,此外,在反汇编时直接查看got表也会发现chk函数的存在
这种检查是默认不开启的,可以通过

gcc -D_FORTIFY_SOURCE=2 -O1
开启fortity检查,开启后会替换strcpy等危险函数。


 

### Kali Linux 中 `checksec` 命令使用教程 #### 工具简介 `checksec` 是一个用于检查二进制文件的安全特性的工具。它能够帮助安全研究人员评估目标程序是否存在常见的缓冲区溢出漏洞防护机制,如栈保护、地址空间布局随机化 (ASLR) 和可执行堆栈等。 #### 安装过程 如果遇到错误提示 "No option selected. Please select an option." ,这通常意味着未指定要分析的目标文件或选项配置不当[^3]。为了正常使用该命令,需先确认已正确安装并设置了必要的依赖项: 对于大多数现代版本的 Kali Linux,默认情况下已经预装了 `checksec.sh` 脚本作为 part of the `binutils-multiarch` package 或者可以通过其他软件包管理器获取。如果没有找到此命令,则可通过 APT 包管理器来安装: ```bash sudo apt update && sudo apt install binutils-multiarch ``` #### 使用示例 基本语法如下所示: ```bash checksec --file=<path_to_binary> ``` 这里 `<path_to_binary>` 应替换为你想要检测的实际路径名。例如,假设有一个名为 `example` 的 ELF 可执行文件位于当前目录下,那么完整的命令将是: ```bash checksec --file=./example ``` 除了直接针对单个文件外,还可以利用通配符批量处理多个文件,或是结合管道与其他命令一起工作。比如查看 `/usr/bin/` 下所有二进制文件的状态: ```bash find /usr/bin -type f -exec checksec --file={} \; ``` 另外,还支持一些额外的功能标志,如显示详细的输出信息 (`--verbose`) 或仅报告存在潜在风险的地方 (`--quick`) 等。 #### 输出解释 运行上述任一形式的命令之后,将会得到一系列关于所选二进制文件安全性特征的信息列表,其中包括但不限于: - **RELRO**: 控制数据重定位读写权限; - **Stack Canaries**: 用来防止基于栈的缓冲区溢出攻击的技术; - **NX (Non-eXecutable Stack)**: 防止恶意代码注入到内存中的非执行区域被执行; - **PIE (Position Independent Executable)**: 支持 ASLR 技术以增加预测加载地址难度; - **Fortify Source**: 编译期间启用某些库函数更严格的形式验证; 每种特性后面都会附有 Yes/No 表明其开启与否以及可能影响程度说明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值