pwnable.tw-2018-starbound_writeup

本文详细介绍了Pwnable.tw的starbound挑战,通过ret2libc和dl_resolve两种方法进行解题。首先,通过分析程序逻辑漏洞和栈状态,找到了利用栈溢出操控p_choice调用任意代码的途径。然后,利用ROPgadget寻找合适gadget构造payload,最终选择ret2libc策略成功执行系统命令。在解题过程中,遇到了库文件依赖、recv()错误处理、libc函数地址泄露等问题,并逐一解决。此外,文章还探讨了在dl_resolve方法中选择start地址的注意事项,强调了解题时需要考虑的多种因素。

题目:Pwnable.tw-starbound
解法1:ret2libc
1.进入程序进行观察:
在这里插入图片描述

这是一个交互小游戏,存在多处用户输入的位置,很有可能存在栈溢出漏洞。

2.查看文件保护状态:
在这里插入图片描述

3.使用IDA中查看文件内容:
在这里插入图片描述

这个文件较之平时的其他题目代码量大了很多,存在许多输入位置,但是找了一圈没有可以直接利用的栈溢出漏洞。

4.在反汇编代码中发现一个逻辑漏洞:
在这里插入图片描述

在用户输入时,程序只对输入值进行了strtol()处理,并把该值作为数组下标,也就是说对于输入的数字只要不为零都是可以利用p_choice指针调用到我们想要的指针。另外虽然我们的输入数字之后的内容都会被过滤掉,但是其内容还是可以完整地写入内存中,这可以作为后续利用的地方。

5.观察p_choice在bss段中的位置:
在这里插入图片描述
在这里插入图片描述

可以发现在p_choice的低地址方向存在着用户可控的p_playername字段,也就是说只要我们提前控制了p_playername中的内容,就可以操纵p_choice对任意代码进行调用。

6.分析调用函数时的栈状态:
在这里插入图片描述

可以看到进入被调函数时栈顶的参数对于我们来说用处不大,无法直接作为常用的pwn函数如read、gets、puts等的参数。所以我们需要寻找一段合适的ROP改变这个情况。

7.寻找可利用的ROP:
寻找过程中存在几种不同的思路,一是因为在汇编代码中可以发现read函数的写入地址由ebx决定,所以我们可以寻找能够将ebx中的地址改为一个更高的地址的gadget,这样就可以直接修改当前栈帧的ebp和返回地址;二是将ebp地址改为一个更低的地址,原理同一;三是在步骤4中我们发现输入的数字之后的内容是可控的,那我们可以将esp往高地址移动,这样就可以对ROP的返回地址或后续被调函数的参数进行控制……
根据以上思路使用ROPgadget工具寻找合适的ROP,最终确定一个合适的ROP:
在这里插入图片描述

这个ROP符合我们第三种思路,这样我们就可以通过步骤4中的逻辑漏洞控制ROP的返回地址。

8.确认攻击方法并构造payload
此时存在几种攻击思路,一是从ROP返回到puts函数执行ret2libc攻击方式;二是继续寻找能够改变寄存器值的ROP,执行ret2syscall攻击方式;三是dl_resolve……
我选择了第一种思路,构造payload如下:

from pwn import *

r = process("./starbound")
elf = ELF('./starbound')
rel_plt_addr = elf.get_section_by_name('.rel.plt').header.sh_addr   #0x80487c8
dynsym_addr =  elf.get_section_by_name('.dynsym').header.sh_addr    #0x80481dc
dynstr_addr = elf.get_section_by_name('.dynstr').header.sh_addr     #0x80484fc
resolve_plt = 0x08048940
add_addr=0x08048e48
ppp_ret_addr=0x80491ba
start=0x08057D90+0x10       #0x08057da0
align=0x8-
Java是一种具备卓越性能与广泛平台适应性的高级程序设计语言,最初由Sun Microsystems(现属Oracle公司)的James Gosling及其团队于1995年正式发布。该语言在设计上追求简洁性、稳定性、可移植性以及并发处理能力,同时具备动态执行特性。其核心特征与显著优点可归纳如下: **平台无关性**:遵循“一次编写,随处运行”的理念,Java编写的程序能够在多种操作系统与硬件环境中执行,无需针对不同平台进行修改。这一特性主要依赖于Java虚拟机(JVM)的实现,JVM作为程序与底层系统之间的中间层,负责解释并执行编译后的字节码。 **面向对象范式**:Java全面贯彻面向对象的设计原则,提供对封装、继承、多态等机制的完整支持。这种设计方式有助于构建结构清晰、模块独立的代码,提升软件的可维护性与扩展性。 **并发编程支持**:语言层面集成了多线程处理能力,允许开发者构建能够同时执行多项任务的应用程序。这一特性尤其适用于需要高并发处理的场景,例如服务器端软件、网络服务及大规模分布式系统。 **自动内存管理**:通过内置的垃圾回收机制,Java运行时环境能够自动识别并释放不再使用的对象所占用的内存空间。这不仅降低了开发者在内存管理方面的工作负担,也有效减少了因手动管理内存可能引发的内存泄漏问题。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值