内核栈溢出保护

linux内核中有个编译选项CC_STACKPROTECTOR用来开启GCC的stack-protector功能,
这个功能是在GCC4.9版本中引入,用来检测栈是否遭到溢出攻击。


目前我们用的版本中开启了这两个选项CONFIG_CC_STACKPROTECTOR、CONFIG_CC_STACKPROTECTOR_REGULAR。


编译器栈溢出保护原理:
函数栈存储结构,从栈底往上一般是形参,返回地址,控制信息(EBP),局部变量。
栈溢出往往是局部变量超过了他自身的存储位置,覆盖到了返回地址,
如果返回地址被恶意攻击者利用,就会导致执行攻击者设计的代码,造成安全隐患。
编译器对栈溢出的保护就是在控制信息前面多存储一个特殊的canary word,
函数返回时检测canary word是否有被改写,如果被改写,意味着发生了栈溢出。


以下面代码为例,看下栈溢出的过程:
int vulFunc() {
    char name[10];
    //…
    return 0;

}

图 1. 溢出前的函数栈
溢出前的函数栈
图 2. 溢出后的函数栈
溢出后的函数栈


如果能在运行时检测出这种破坏,就有可能对函数栈进行保护。目前的堆栈保护实现大多使用基于 “Canaries” 的探测技术来完成对这种破坏的检测。


GCC 4.9 中三个与堆栈保护有关的编译选项
-fstack-protector:
启用堆栈保护,不过只为局部变量中含有 char 数组的函数插入保护代码。
-fstack-protector-all:
启用堆栈保护,为所有函数插入保护代码。
-fno-stack-protector:
禁用堆栈保护。

<think>嗯,用户想了解CTF比赛中栈溢出的攻击方式和防御方法。首先,我得回忆一下栈溢出的基本原理。栈溢出通常发生在程序没有正确检查输入数据长度时,攻击者通过覆盖返回地址来控制程序流程。常见的攻击方式有覆盖返回地址、ROP链、ret2libc、canary绕过等。防御方法包括栈保护机制如Canary、DEP/NX、ASLR,以及代码层面的安全措施如安全函数和静态分析工具。 然后需要结合用户提供的引用内容。引用2提到了栈溢出和ROP,引用3讨论了ret2libc技术,这些都是攻击方法。防御方面,引用3也提到了防御机制如ASLR和DEP。需要将这些引用内容自然地融入到回答中,并在适当的位置添加引用标识。 接下来要考虑如何组织内容。先介绍栈溢出攻击的基本原理,再分点列出常见攻击方式,每个方式配合例子或代码片段。然后讨论防御方法,对应每个攻击手段给出防护措施。最后生成相关问题,引导用户进一步学习。 需要注意的是,用户希望回答结构清晰,逐步解决问题,并且保证真实可靠。因此,每个攻击和防御方法都需要准确,必要时给出代码示例,比如展示如何覆盖返回地址的Python脚本,或者ROP链的汇编示例。同时,确保使用正确的中文术语,避免翻译错误。 可能还需要检查是否有遗漏的攻击或防御技术。比如,除了提到的ROP和ret2libc,还有整数溢出、格式化字符串漏洞等,但用户问题聚焦栈溢出,所以应集中在相关部分。防御方面,除了Canary、DEP、ASLR,还有编译器选项如-fstack-protector,代码审计等。 最后生成相关问题时要围绕栈溢出的扩展内容,比如ROP的原理,如何绕过ASLR,不同保护机制的工作原理等。确保问题与主题相关,帮助用户深入理解。</think>### CTF栈溢出攻击与防御技巧 栈溢出是CTF Pwn类题目中最经典的漏洞类型,攻击者通过覆盖栈上的关键数据实现控制流劫持。以下是其核心原理及攻防要点: --- #### 一、栈溢出攻击原理 当程序未对输入数据长度做严格校验时,超出缓冲区大小的数据会覆盖栈中的其他数据,包括: - 函数返回地址(控制程序执行流) - 栈帧基指针(EBP) - 函数局部变量 - 栈保护机制(如Canary) 典型攻击场景: $$ \text{缓冲区大小} < \text{输入数据长度} \Rightarrow \text{栈空间被覆盖} $$ --- #### 二、常见攻击方式 1. **覆盖返回地址** - 原理:覆盖函数返回地址为攻击者指定的地址 - 示例代码: ```python payload = b'A'*offset + p32(target_address) # offset为到返回地址的偏移量 ``` 2. **ROP(Return-Oriented Programming)** - 原理:利用程序已有的代码片段(gadgets)构造攻击链[^2] - 示例: ```assembly pop eax; ret # 控制寄存器值 mov [ebx], eax; ret # 写入内存 ``` 3. **ret2libc** - 绕过NX保护:调用libc库函数(如system("/bin/sh"))[^3] - 关键步骤: ```python system_addr = leak_libc_address() # 泄漏libc地址 binsh_addr = find_binsh() # 查找"/bin/sh"字符串地址 ``` 4. **Canary绕过** - 方法:泄漏Canary值、覆盖特定字节、触发异常处理 --- #### 三、防御技术 1. **栈保护机制** - **Canary**:在栈帧间插入随机值,验证完整性 ```bash gcc -fstack-protector-all -o program program.c # 开启栈保护 ``` - **DEP/NX**:阻止栈空间执行代码 - **ASLR**:随机化内存地址布局(需配合PIE) 2. **代码层防护** - 使用安全函数(如`snprintf`代替`sprintf`) - 严格校验输入长度 - 静态代码分析工具(如Coverity、CodeQL) 3. **运行环境加固** - SELinux/AppArmor限制进程权限 - 内核保护机制(如SMEP/SMAP) --- #### 四、CTF实战技巧 1. **信息泄露**:通过格式化字符串漏洞泄漏Canary或libc地址 2. **偏移计算**:使用cyclic模式确定覆盖偏移量 3. **工具辅助**: - `pwntools`构造payload - `ROPgadget`搜索可用gadgets - `checksec`检查程序保护机制 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值