题目:bctf2016_bcloud
不得不说这题细节做的真好,如果不认真看还真找不到利用点
保护
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TP0vrBX0-1643304186511)(house-of-force(bctf2016_bcloud)].assets/image-20220128010314241.png)](https://i-blog.csdnimg.cn/blog_migrate/faecf6a4ee8d5377476d6779b5047dba.png)
分析
main函数:

add函数:

因为在malloc是加上了4所以通过这里off-by-null行不通
dele、edit函数没有常见漏洞
重要函数
0x80487A1函数:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IVxiAaOx-1643304186513)(house-of-force(bctf2016_bcloud)].assets/image-20220127213517224.png)](https://i-blog.csdnimg.cn/blog_migrate/578e8e325a81688f8468a4170295a0e8.png)
0x804868D函数:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Se1bK72S-1643304186514)(house-of-force(bctf2016_bcloud)].assets/image-20220127214049019.png)](https://i-blog.csdnimg.cn/blog_migrate/f4da17cde74e6b77029a9f582bf08f41.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)](https://i-blog.csdnimg.cn/blog_migrate/066aa2d59148ee3fc2972acfa0757e78.png)
0x804884E函数:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jqFNfaIH-1643304186515)(house-of-force(bctf2016_bcloud)].assets/image-20220127222928686.png)](https://i-blog.csdnimg.cn/blog_migrate/0e136307987b0763a59513b38acec063.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)](https://i-blog.csdnimg.cn/blog_migrate/0b3b309da4602e93cd3550b472f34c7e.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)](https://i-blog.csdnimg.cn/blog_migrate/e9b6ad30234bbeed82e7751830e90884.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)](https://i-blog.csdnimg.cn/blog_migrate/709ff9bc3e8443839a6cd3df64b616c7.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))

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

被折叠的 条评论
为什么被折叠?



