首页
论坛
课程
招聘
[原创]pwnable.tw 之 unexploitable 解题思路分享
2017-12-24 20:27 3153

[原创]pwnable.tw 之 unexploitable 解题思路分享

2017-12-24 20:27
3153
unexploitable这道题是从pwnable.kr上的题修改而来的
在本文中使用“原版”和“新版”来区分pwnable.kr和pwnable.tw上的这两道题

(*)如果同学没有做过pwnable.kr的unexploitable题的话,建议先做一下原版题再看下面的内容:

在原版题中,可用ROP或SROP方式得到FLAG,这两种思路都依赖于在binary自身中有一个"\x0F\x05"字节序列,也就是syscall指令
如果拿原版题的exp直接去跑新版题,用GDB一步步跟踪会发现两道题在绝大部分地方都是一样的,包括一些硬编码的地址都是一样的。
但是在新版题中,在binary中已经找不到这样的指令,也就没法通过硬编码方式调用syscall

对于新版题目而言,pwnable.tw官网还额外给提供了一个libc文件,在该文件中搜索可以发现大量的syscall指令,但是由于服务器是开启了ASLR的。
所以可以想到尝试用地址信息泄露的方式获取一个syscall指令的地址。
在main函数中第一次读取用户输入时会调用一次read函数,随后会在read函数的got表项位置填充上read函数的实际地址。通过在libc中搜索会发现在read函数偏移0xe的位置有一个syscall指令,也就是说,可以尝试修改read函数got表项中最低字节,这样当下次再调用read函数时即可直接跳到syscall指令。
gdb-peda$ print read
$1 = {<text variable, no debug info>} 0x7ffff7b04670 <read>
gdb-peda$ find "\x0f\x05" 0x7ffff7b04670 0x7ffff7b04680
Searching for '\x0f\x05' in range: 0x7ffff7b04670 - 0x7ffff7b04680
Found 1 results, display max 1 items:
libc_64.so.6 : 0x7ffff7b0467e (<read+14>:	syscall)
gdb-peda$

如果上面一步工作做完,剩下的思路就比较顺畅了:
1、通过修改后的read函数可以调用任意syscall(当然这个是基于对EAX寄存器的控制的前提下)
2、利用该sysccall主动调用write系统调用来泄露信息并得到execve函数的真实地址
3、调用execve得到shell

其实在编写exp的过程中还是有一些小坑,留给大家自己去发掘:)大牛们请轻拍~

附上一张我的solver.py运行的结果,基于pwnable官网的要求,此处我不会放出solve.py源码
顺便吐槽一下,不知为何在连接pwnable.tw时网络状况总是不太好 - -


参考文章:
1、https://bbs.pediy.com/thread-223391.htm
2、http://spd.dropsec.xyz/2017/02/21/寻找Gadgets及通用Gadgets/
3、http://weaponx.site/2017/03/24/unexploitable-Writeup-pwnable-tw/

《0day安全 软件漏洞分析技术(第二版)》第三次再版印刷预售开始!

收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回