首页 > 其他 > 详细

利用漏洞获取libc

时间:2019-10-30 01:36:13      阅读:108      评论:0      收藏:0      [点我收藏+]

最近做一些难的题目,越来越自闭,感觉自己的基础知识还有待补充,索性暂停源短时间做题,先把一些基础知识理一理。本系列博客以《ctf-in-all》以及i春秋的《linux pwn基础入门》为基础开始学习。

第一篇博客,来理一理如何利用漏洞获取libc。

首先,libc是什么?

libc 即在 Linux系统下的C语言函数库。

 不同版本的libc,函数首地址相对于文件开头的偏移和函数间的偏移不 一定一致。所以如果题目不提供libc,通过泄露任意一个库函数地址计算出system函数地址的方法就不好使 了。这就要求我们想办法获取目标系统的libc。

技术分享图片

 

 技术分享图片

 

 技术分享图片

 

 技术分享图片

 

 技术分享图片

 

 

技术分享图片

 

 技术分享图片

 

 在某不知名网站找到了一段视频,讲了一下关于这一知识点,讲的比较通俗易懂,就将部分重要的地方截了下来。

在《Linux PWN入门》和《ctf-in-all》中主要就是使用DynELF来泄露函数地址。

利用 如 pwntools 的 DynELF 模块,对内存进行搜索,直接得到我们需要的函数地址。

下面阐述一下关于DynELF的知识点:

使用方法如下:

io = remote(ip, port)
 
def leak(addr):
 payload2leak_addr = “****” + pack(addr) + “****”
 io.send(payload2leak_addr)
 data = io.recv()
 return data
 
d = DynELF(leak, pointer = pointer_into_ELF_file, elf = ELFObject)
system_addr = d.lookup(“system”, libc)

使用DynELF时,我们需要使用一个leak函数作为必选参数,指向ELF文件的指针或者使用ELF类加载的目标文件至少提供一个作为可选参数,以初始化一个DynELF类的实例d。然后就可以通过这个实例d的方法lookup来搜寻libc库函数了。

其中,leak函数需要使用目标程序本身的漏洞泄露出由DynELF类传入的int型参数addr对应的内存地址中的数据。且由于DynELF会多次调用leak函数,这个函数必须能任意次使用,即不能泄露几个地址之后就导致程序崩溃。由于需要泄露数据,payload中必然包含着打印函数,如write, puts, printf等,我们根据这些函数的特点将其分成两部分分别进行讲解

 

DynELF原理:

截图自《ctf-in-all》

技术分享图片

 

 

DynELF实例:

在 libc 中,我们通常使用 write 、 puts 、 printf 来打印指定内存的数据。

1、write 函数

技术分享图片

 

 write函数的特点在于其输出完全由其参数size决定,只要目标地址可 读,size填多少就输出多少,不会受到诸如‘\0’, ‘\n’之类的字符影响。因此leak函数中对数据的读取 和处理较为简单。

 

2、puts 函数

技术分享图片

 

 

3、printf 函数

技术分享图片

 

利用漏洞获取libc

原文:https://www.cnblogs.com/mzstar/p/11762541.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!