【PWN · 格式化字符串|劫持fini_array|劫持got表】[CISCN 2019西南]PWN1

格式化字符串的经典利用:劫持got表。但是遇到漏洞点只能执行一次的情况,该怎么办?


前言

如果存在格式化字符串,保护机制开的不健全,通常可以劫持got表,构造后门函数。然而,如果不存在循环、栈溢出控制rop等方式,如果格式化字符串漏洞点正常来说只能执行一次,getshell是比较困难的。

不过,linux下的二进制程序,在最后退出时,总会执行一些清扫函数,其中涉及到了fini_array这个数据结构。


一、fini_array

网上有很多优质博客,具体原理还是各位佬讲的清楚详细(注意静态链接和动态链接的区别):

通过利用fini_array部署并启动ROP攻击 | TaQini-优快云博客

简单来说,fini_array数组存放了函数指针,在退出时,会进行调用。 

因此,面临用户代码区域中之后一次漏洞机会时,可以通过劫持fini_array来实现二次利用。


二、题目

### PWN格式化字符串漏洞利用 #### 背景与原理 格式化字符串漏洞PWN题常见考点之一,主要源于程序使用了用户可控的格式化字符串作为参数传递给`printf`、`sprintf`、`fprintf`等C库中的打印函数[^1]。这种情况下攻击者可以通过精心构造输入来读取或修改内存数据。 #### 利用方式 在CTF竞赛中,格式化字符串漏洞常用于: - **泄露信息**:通过控制格式化字符串参数,可以泄漏栈上的内容或其他敏感信息。 ```python payload = "%x " * 20 # 泄露多个寄存器/内存位置的内容 ``` - **覆盖特定地址的数据**:结合`%n`操作符可实现对指定内存位置写入数值的功能,进而可能改写重要指针(如GOT项),最终达到执行任意代码的目的[^2]。 ```python from pwn import * one_gadget = ... # 假设已知的一个gadget地址 stack_addr = ... # 需要被覆写的堆栈地址 payload = (b"%{}c%13$hn".format(one_gadget & 0xffff).encode() .ljust(0x28, b'\x00') + pack(stack_addr)) ``` 上述Python脚本展示了如何构建payload以完成一次简单的格式化字符串攻击,其中`one_gadget`代目标进程中某个有用的ROP gadget偏移量,而`stack_addr`则是计划篡改的目标地址[^4]。 #### 编程实践建议 为了避免此类安全风险,在编写涉及格式化输出的应用时应遵循良好习惯,例如总是显式声明所需转换说明而非依赖默认行为,并严格验证所有来自外部源的数据[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值