PWN——GCC编译中几种保护打开和关闭的参数

博客介绍了几种常见的二进制保护机制。NX开启后不让执行栈上数据,使JMP ESP无法使用;Canary会在栈里插入cookie信息;PIE开启后实现地址随机化,还会有get_pc_thunk;RELRO对GOT表具有写权限,有不同开启程度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • NX:-z execstack / -z noexecstack (关闭 / 开启)    不让执行栈上的数据,于是JMP ESP就不能用了
  • Canary:-fno-stack-protector /-fstack-protector / -fstack-protector-all (关闭 / 开启 / 全开启)  栈里插入cookie信息
  • PIE:-no-pie / -pie (关闭 / 开启)   地址随机化,另外打开后会有get_pc_thunk
  • RELRO:-z norelro / -z lazy / -z now (关闭 / 部分开启 / 完全开启)  对GOT表具有写权限
### 格式化字符串漏洞 PWN 的利用与防御 #### 漏洞原理概述 格式化字符串漏洞源于程序未正确验证输入参数,允许攻击者通过控制传递给 `printf` 或其他格式化函数的参数来访问或修改内存中的数据[^1]。 #### 利用方式分析 1. **获取敏感信息** 攻击者可以通过格式化字符串漏洞读取堆栈上的内容,进而泄露程序内部状态或其他重要信息。例如,使用 `%x` 系列占位符可以逐字节打印堆栈中的值[^2]。 2. **覆盖目标地址** 借助特殊格式化字符(如 `%n`),攻击者能够实现对指定内存位置的写操作。具体而言,当程序调用了类似 `printf(user_input)` 而不加任何过滤时,恶意构造的输入可定位到特定变量并更改其数值[^3]。 3. **绕过保护机制** 在某些情况下,即使启用了现代防护技术(如 ASLR 地址空间布局随机化),如果存在此类型的缺陷,则仍可能被用来计算实际加载基址从而突破限制。比如通过泄漏 libc 库中某个已知偏移量对应的绝对地址反推出整个库映射范围[^4]。 #### 防护策略建议 为了有效防范上述风险,可以从以下几个方面着手: 1. **严格校验用户输入** - 对所有来自外部的数据都应进行全面检查,在将其作为格式说明符传入前确认合法性。 - 使用更安全版本的标准 I/O 函数替代原始形式;例如采用带长度限定参数的方法代替传统无界接口。 2. **启用编译器优化选项** - GCC 提供了专门针对此类问题的支持功能——开启 `-Wformat-nonliteral` `-D_FORTIFY_SOURCE=2` 编译标志可以帮助检测潜在隐患,并阻止运行期非法行为发生。 3. **隔离关键资源管理逻辑** - 将涉及敏感操作的部分单独封装起来并与其余部分保持距离,减少暴露面的同时也便于集中精力加强这部分的安全保障级别。 ```python def safe_printf(format_string, *args): try: formatted_output = format_string % args # Safe usage with explicit arguments. print(formatted_output) except TypeError as e: print(f"Error occurred while formatting string: {e}") safe_printf("%s is %d years old.", "Alice", 25) ``` 以上代码片段展示了如何以一种较为稳妥的方式运用 Python 中类似的字符串插值特性,避免直接拼接未经审查的内容进入最终呈现层。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值