利用漏洞获取libc

最近做一些难的题目,越来越自闭,感觉自己的基础知识还有待补充,索性暂停源短时间做题,先把一些基础知识理一理。本系列博客以《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 函数

猜你喜欢

转载自www.cnblogs.com/mzstar/p/11762541.html