首页
社区
课程
招聘
[原创]CVE-2018-0758 字符串连接整数溢出导致堆溢出
发表于: 2018-1-18 01:13 5284

[原创]CVE-2018-0758 字符串连接整数溢出导致堆溢出

2018-1-18 01:13
5284

标签(空格分隔): Chakra

source:508K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6T1N6h3N6K6i4K6u0W2j5$3S2J5L8$3#2A6N6h3#2Q4x3X3g2G2M7X3N6Q4x3V1k6H3i4K6u0r3M7s2u0G2K9X3g2U0N6q4)9J5k6s2A6W2M7X3!0Q4x3V1k6A6M7%4y4#2k6i4y4Q4x3V1k6V1k6i4c8S2K9h3I4Q4x3@1k6A6k6q4)9K6c8o6p5K6z5o6l9`.

poc第9行print(a[0]);触发crash,原因是引用了a字符串的元素,引用操作会调用JavascriptString::GetItem获取元素,这个函数内部调用字符串的拷贝函数JavascriptString::Copy,在这个函数中触发了漏洞,调用堆栈如下

漏洞触发了Js::ConcatStringBase::CopyImpl函数中的断言,因为copyCharLength+copiedCharLength < buff_size

代码位于ConcatStringBase::CopyImpl函数,函数作用是拼接字符串,正常操作是先拷贝第一部分然后计入copiedCharLength,之后依次拷贝接下来的部分

这个函数是通过一个循环进行处理的,结合poc第4行中的a = 'BBBBBBBBB' + b + a;猜测ConcatStringBase::CopyImpl用于实现这个拼接过程。

ConcatStringBase::CopyImpl函数中,参数int itemCount表示拼接字符串个数,参数JavascriptString * const * items表示传入的各字符串指针的数组。

在函数处理中会首先会依次取出items数组中保存的各个字符串,字符串类型是JavascriptString对象

依次看items数组中的字符串内容

之后依次对各字符串进行拷贝操作,使各字符串首尾相接

调试发现程序会调用ConcatStringBase::CopyImpl9次,并不是poc中的循环次数0x10000次。修改循环次数为0x20,发现会调用32次ConcatStringBase::CopyImpl函数并且不会发生crash
图片描述

说明每次调用函数ConcatStringBase::CopyImpl都对应着poc中for循环的一次字符串链接操作,在调试过程中发现进行拷贝时拷贝的尺寸的大小是预先设定的,修改poc如下

图片描述
可以看到当设定循环次数为1时,代表目标缓冲区的m_charLength大小为65545

图片描述
当设定次数为2时,目标m_charLength为131090,说明每次的大小为65545字节,因为m_charLength的类型unsigned int,所以当for循环设置为0x10000时会发生整数溢出成为一个较小的正数。
图片描述]
图片描述

这个漏洞进一步的溢出发生地点与Lowerer::LowerSetConcatStrMultiItem函数有关,在原链接中 lokihardt已做出分析,感兴趣的同学可以看一下漏洞的修补
600K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6y4K9h3y4J5L8%4y4G2k6Y4c8Q4x3V1k6o6K9r3q4C8M7X3q4o6L8%4u0W2i4K6u0r3M7s2g2D9L8q4)9J5c8U0b7#2x3o6y4Q4x3V1k6U0L8$3#2E0K9i4c8K6i4K6u0r3y4r3c8T1x3r3u0V1x3U0m8S2j5K6g2X3y4h3p5@1k6e0t1$3x3o6j5#2x3$3p5I4x3o6t1$3z5h3k6W2k6U0W2W2k6U0f1I4k6U0V1I4k6R3`.`.

 

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2019-2-1 16:24 被admin编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回