攻防世界-PWN进阶区-1000levevls(XCTF 3rd-BCTF-2017)

本文详细解析了一道六星PWN题,涉及PIE保护、栈溢出、系统调用、vsyscall和one_gadget利用。通过分析代码和汇编,揭示了如何在开启PIE的情况下,利用栈溢出修改返回地址,结合vsyscall和one_gadget获取shell。
摘要由CSDN通过智能技术生成

这道题是攻防世界上面一道六星的pwn题,比起之前的还是挺有难度,做完也有很大收获

题目分析

首先checksec查看开启的保护
在这里插入图片描述
可以看到这题比之前的题目多了一个PIE保护,下面就简单介绍一下什么是PIE

PIE全称是position-independent executable,中文解释为地址无关可执行文件,该技术是一个针对代码段(.text)、数据段(.data)、未初始化全局变量段(.bss)等固定地址的一个防护技术,如果程序开启了PIE保护的话,在每次加载程序时都变换加载地址,从而不能通过ROPgadget等一些工具来帮助解题

下面接着对源文件进行分析

main函数
在这里插入图片描述
hint函数
在这里插入图片描述
go函数
在这里插入图片描述
在go函数中我们可以发现如果v2<=0的话,v5是不会被初始化的,而之前的hint函数中出现了system函数的地址,这个地址会不会在栈上保存呢?
接下来我们看一下hint函数的汇编代码:
在这里插入图片描述
可以看到system函数的地址被放到了rbp-110h的地方,而go函数中v5变量的位置正好就是rbp-110h
这里就出现了一个可利用的地方,如果我们进入go函数之后第一次输入小于等于0,system的地址就被保留在了栈上,而之后程序还会让我们进行一次输入,并把rbp-110h位置处的值变为加上新的输入的值,这个新的输入是没有限制的,意味着我们可以把system的地址改为libc中的任何地址。
接下来再看看play_game函数:
在这里插入图片描述
这里有一个明显的栈溢出,buf的大小仅为0x8,却可以读入最多0x400的数据,这意味着我们可以改变函数的返回地址,但是开启了PIE保护,意味着我们不知道程序执行时候的真实地址,那我们要把返回地址改成什么呢?
这里就需要利用vsyscall和之前保留在栈上的system函数了

vsyscall是什

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值