首页
社区
课程
招聘
[原创]第九题 C与C++
发表于: 2019-3-23 03:09 3463

[原创]第九题 C与C++

2019-3-23 03:09
3463

程序逻辑比较简单,可以申请和释放内存,并且实现了c和cpp的两种内存分配方法,如下:
malloc –> free
new –> delete
图片描述

分析c和cpp的实现存储方式可以发现,存储字符串时,是按照16字节进行划分的,每一段进行存储。如下:
图片描述
cpp:
图片描述
其中heap pos是每一个堆内存块的位置,mem pos是申请内存时返回的位置,pointer是程序中存储数据用到的位置。
在释放内存时,如果调用free,直接释放内存即可,如下:

图片描述
如果调用delete,会将指针往前移8个字节,然后获取str块的count,然后将其所有块中的虚表中的release函数调用一次,如下:

图片描述

通过malloc申请的内存,通过delete来释放,会按照delete的规则来进行,从而实现了c和cpp的混用,把c中的堆块size当成cpp的块数,从而依次执行其中虚表的release函数,从而实现了函数控制流劫持。

在设置name来可以布置虚表,写入两个函数,在release的时候,实现调用,由于泄露和布置虚表至少需要两次输入,应该可以在布置虚表的时候把main函数放在第二个虚表的位置,从而实现多次利用漏洞,从而实现多次利用。
Name的内容设置为:
p64(main_func)+ p64(target_func)
虚表vtable有多个,从后往前执行,其内容设置为:
Vtable(n-1): p64(name_addr)
Vtable(n): p64(name_addr+8)
这样,调用虚表函数,依次执行的函数就为:target_func,main_func
其中,泄露libc地址的函数如下:

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//