首页
社区
课程
招聘
[原创]pwnable.tw 之 unexploitable 解题思路分享
发表于: 2017-12-24 20:27 7273

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

2017-12-24 20:27
7273

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$
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$

如果上面一步工作做完,剩下的思路就比较顺畅了:

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 2
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//