fuzz CVE-2019-1118

2024-03-06 06:18
文章标签 2019 cve fuzz 1118

本文主要是介绍fuzz CVE-2019-1118,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

这篇来分析一下CVE-2019-1118,问题为stack corruption in OpenType font handling due to negative cubeStackDepth

 

漏洞复现

搭建环境,简单复现一下

git clone https://github.com/adobe-type-tools/afdko
cd afdko
git checkout 2.8.8
cd c
bash buildalllinux.sh debug

根据给出的poc测试

可以发现,出错了,但是被afdko捕获了。

这样的话,在重点位置设一下断点,再来看一下

首先测试一下do_blend_cube.otf

pwndbg> b t2cstr.c:1057
Breakpoint 1 at 0x466af2: file ../../../../../source/t2cstr/t2cstr.c, line 1057.
pwndbg> run -cff do_blend_cube.otf

看一下效果

结合着反汇编代码看,效果可能更好

.text:0000000000466AF2                 mov     esi, [rbp+nBlends]
.text:0000000000466AF5                 mov     rdi, [rbp+h]
.text:0000000000466AF9                 add     rdi, 32D60h
.text:0000000000466B00                 mov     rax, [rbp+h]    ; h
.text:0000000000466B04                 movsxd  rax, dword ptr [rax+32D44h]; 取得索引
.text:0000000000466B0B                 imul    rax, 1920h; cube大小
.text:0000000000466B12                 add     rdi, rax
.text:0000000000466B15                 imul    esi, [rdi+10h]
.text:0000000000466B19                 mov     [rbp+nElements], esi

可以发现h->cube数组取值是通过乘法实现的,当索引为-1即h->cubeStackDepth==-1时,

imul rax, 1920h ==> imul 0xffffffff, 1920h

cube数组每项的大小:sizeof(h->cube[0]) == 0x1920

再变换一下

((struct cube)h->cube)-1

相当于h->cube指针向前移动了一个数组值,即0x1920个字节

再来看看struct _t2cCtx的大小

向前移动了,但是((struct cube)h->cube)-1的位置还是在_t2cCtx结构体中,验证一下

继续单步执行到这,索引值得出

继续si

此时

可以发现0x9d3f8 > 0x31880 ,验证也确实还在结构体中。

这样的话,即使是h->cubeStackDepth==-1也不会导致内存访问出错,最多也就是分析错误,被afkdo捕获也就不奇怪了。我们的结果也确实是这样

但是PJ0给的例子中,存在了一个叫做redzone patch的操作,打完patch之后会出现user-after-poison的错误。

就像这样

==96052==ERROR: AddressSanitizer: use-after-poison on address 0x7ffea1a88890 at pc 0x00000069e6e2 bp 0x7ffea1a46bb0 sp 0x7ffea1a46ba8
READ of size 4 at 0x7ffea1a88890 thread T0#0 0x69e6e1 in do_blend_cube afdko/c/public/lib/source/t2cstr/t2cstr.c:1057:58#1 0x6855fd in t2Decode afdko/c/public/lib/source/t2cstr/t2cstr.c:1857:38#2 0x670a5b in t2cParse afdko/c/public/lib/source/t2cstr/t2cstr.c:2591:18#3 0x542960 in readGlyph afdko/c/public/lib/source/cffread/cffread.c:2927:14#4 0x541c32 in cfrIterateGlyphs afdko/c/public/lib/source/cffread/cffread.c:2966:9#5 0x509662 in cfrReadFont afdko/c/tx/source/tx.c:151:18#6 0x508cc3 in doFile afdko/c/tx/source/tx.c:429:17#7 0x506b2e in doSingleFileSet afdko/c/tx/source/tx.c:488:5#8 0x4fc91e in parseArgs afdko/c/tx/source/tx.c:558:17#9 0x4f9470 in main afdko/c/tx/source/tx.c:1631:9#10 0x7fa93072e2b0 in __libc_start_main#11 0x41e5b9 in _start如果我们想这样的话,该怎么

做呢?

很遗憾,关于手动设置redzone的资料特别少,中文基本上就是纯空白了。而且我发现,基本上这个方法就是PJ0自己成员在用,其他人很少有使用过的。

为了实现这个功能,我把sanitizer的实现资料和相关redzone的源码全部简单过了一遍,最后弄懂了redzone的相关定义和用法,这部分想要了解的话,自己查资料吧,内容比较多,可以重点看一下PJ0介绍sanitizer的几个paper。

最后在sanitizer/asan_interface.h中看到了这部分代码

//===-- sanitizer/asan_interface.h ------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file is a part of AddressSanitizer (ASan).
//
// Public interface header.
//===----------------------------------------------------------------------===//
#ifndef SANITIZER_ASAN_INTERFACE_H
#define SANITIZER_ASAN_INTERFACE_H#include <sanitizer/common_interface_defs.h>#ifdef __cplusplus
extern "C" {
#endif
/// Marks a memory region (<c>[addr, addr+size)</c>) as unaddressable.
///
/// This memory must be previously allocated by your program. Instrumented
/// code is forbidden from accessing addresses in this region until it is
/// unpoisoned. This function is not guaranteed to poison the entire region -
/// it could poison only a subregion of <c>[addr, addr+size)</c> due to ASan
/// alignment restrictions.
///
/// \note This function is not thread-safe because no two threads can poison or
/// unpoison memory in the same memory region simultaneously.
///
/// \param addr Start of memory region.
/// \param size Size of memory region.
void __asan_poison_memory_region(void const volatile *addr, size_t size);/// Marks a memory region (<c>[addr, addr+size)</c>) as addressable.
///
/// This memory must be previously allocated by your program. Accessing
/// addresses in this region is allowed until this region is poisoned again.
/// This function could unpoison a super-region of <c>[addr, addr+size)</c> due
/// to ASan alignment restrictions.
///
/// \note This function is not thread-safe because no two threads can
/// poison or unpoison memory in the same memory region simultaneously.
///
/// \param addr Start of memory region.
/// \param size Size of memory region.
void __asan_unpoison_memory_region(void const volatile *addr, size_t size);// Macros provided for convenience.
#if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__)
/// Marks a memory region as unaddressable.
///
/// \note Macro provided for convenience; defined as a no-op if ASan is not
/// enabled.
///
/// \param addr Start of memory region.
/// \param size Size of memory region.
#define ASAN_POISON_MEMORY_REGION(addr, size) \__asan_poison_memory_region((addr), (size))/// Marks a memory region as addressable.
///
/// \note Macro provided for convenience; defined as a no-op if ASan is not
/// enabled.
///
/// \param addr Start of memory region.
/// \param size Size of memory region.
#define ASAN_UNPOISON_MEMORY_REGION(addr, size) \__asan_unpoison_memory_region((addr), (size))
#else
#define ASAN_POISON_MEMORY_REGION(addr, size) \((void)(addr), (void)(size))
#define ASAN_UNPOISON_MEMORY_REGION(addr, size) \((void)(addr), (void)(size))
#endif

宏定义ASAN_UNPOISON_MEMORY_REGION指向__asan_poison_memory_region,利用这个函数可以设置redzone,之后利用__asan_unpoison_memory_region解除设置PHP大马

方法找到了,那就来看具体代码,设置redzone,在do_blend_cube函数中

/* Execute "blend" op. Return 0 on success else error code. */
static int do_blend_cube(t2cCtx h, int nBlends) {int i;__asan_poison_memory_region(h->cube-1, sizeof(struct _t2cCtx)); // 设置redzoneint nElements = nBlends * h->cube[h->cubeStackDepth].nMasters;int iBase = h->stack.cnt - nElements;int k = iBase + nBlends;if (h->cube[h->cubeStackDepth].nMasters <= 1)return t2cErrInvalidWV;CHKUFLOW(h, nElements);if (h->flags & FLATTEN_CUBE) {for (i = 0; i < nBlends; i++) {int j;double x = INDEX(iBase + i);for (j = 1; j < h->cube[h->cubeStackDepth].nMasters; j++)x += INDEX(k++) * h->cube[h->cubeStackDepth].WV[j];INDEX(iBase + i) = (float)x;}} else {float blendVals[kMaxCubeMasters * kMaxBlendOps];for (i = 0; i < nElements; i++) {blendVals[i] = INDEX(iBase + i);}callback_blend_cube(h, nBlends, nElements, blendVals);}h->stack.cnt = iBase + nBlends;__asan_unpoison_memory_region(h->cube-1, sizeof(struct _t2cCtx)); // 解除redzonereturn 0;
}

这里有一点需要注意,poison的size一定要设置的够大,否则会没有poison的效果,我这里是取_t2cCtx结构体的大小,这样就保证了怎么移动我们都能检测到

来看一下效果

 

fuzzing 代码

还是这么写main函数

/* Main program. */
int CTL_CDECL main(int argc, char *argv[]) {txCtx h;char *progname;/* Get program name */progname = tail(argv[0]);--argc;++argv;/* Allocate program context */h = malloc(sizeof(struct txCtx_));if (h == NULL) {fprintf(stderr, "%s: out of memory\n", progname);return EXIT_FAILURE;}memset(h, 0, sizeof(struct txCtx_));h->app = APP_TX;h->appSpecificInfo = NULL; /* unused in tx.c, used in rotateFont.c & mergeFonts.c */h->appSpecificFree = txFree;txNew(h, progname);h->t1r.flags = 0; /* I initialize these here,as I need to set the std Encoding flags before calling setMode. */h->cfr.flags = 0;h->cfw.flags = 0;h->dcf.flags = DCF_AllTables | DCF_BreakFlowed;h->dcf.level = 5;h->svr.flags = 0;h->ufr.flags = 0;h->ufow.flags = 0;h->t1w.options = 0;// 设置cff模式setMode(h, mode_cff);// argv[1] 文件名,对应上面argv--doSingleFileSet(h, argv[0]);if (h->failmem.iFail == FAIL_REPORT) {fflush(stdout);fprintf(stderr, "mem_manage() called %ld times in this run.\n",h->failmem.iCall);}txFree(h);return 0;
}

出现异常利用上面的测试一下即可。ASP大马

fuzz代码我公开了,测出有效洞可得找我哈 : )

还不会的话,只能看我的具体项目了,一起学习fuzz哈

 

参考

Microsoft DirectWrite / AFDKO stack corruption in OpenType font handling due to negative cubeStackDepth

这篇关于fuzz CVE-2019-1118的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/779078

相关文章

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

vulhub GhostScript 沙箱绕过(CVE-2018-16509)

1.执行以下命令启动靶场环境并在浏览器访问 cd vulhub/ghostscript/CVE-2018-16509 #进入漏洞环境所在目录   docker-compose up -d #启动靶场   docker ps #查看容器信息 2.访问网页 3.下载包含payload的png文件 vulhub/ghostscript/CVE-2018-16509/poc.png at

2019学习计划

工作三年了,第一年感觉是荒废的,第二年开始学习python,第三年开始自动化 感觉自己会的东西比较少,而且不够深入,流于表面 现制定一下今年大概的学习计划 需持续巩固加强:python、ui自动化、接口自动化、sql等 代码量需提升,敲的不够(重点) 学习: 1.移动端测试,appium等 2.前端知识系统整理学习  3.性能测试 4.docker入门,环境搭建 5.shell

【网络安全】Jenkins任意文件读取漏洞及检测工具(CVE-2024-23897)

原创文章,不得转载。 文章目录 漏洞成因影响范围检测工具更多细节 漏洞成因 Jenkins CLI 接口存在任意文件读取漏洞(CVE-2024-23897)。该问题源于 args4j 库在解析文件名参数时,会将@符号后的字符串视为文件名并尝试读取文件,而且该功能默认处于启用状态。 影响范围 Jenkins weekly <= 2.441 Jenkins LTS <=

最简单的使用JDBC[连接数据库] mysql 2019年3月18日

最极简版本的, 我们这里以mysql为例: 首先要创建maven工程, 需要引入jar包:,这里需要注意, 如果你安装的是mysql最新版本8以上的, 下面有些地方需要更改,具体就是mysql连接的url, 和5版本的不一样,具体解决请自行百度哈.这里只演示mysql5版本的? 依赖: <dependency>   <groupId>mysql</groupId>   <artifactId

(php伪随机数生成)[GWCTF 2019]枯燥的抽奖

审核源码发现加载check.php,审计发现使用了mt_rand()函数,这个函数生成的值是伪随机的 参考下面这篇文章 PHP mt_rand安全杂谈及应用场景详解 - FreeBuf网络安全行业门户 kali里面输入下载工具 git clone https://github.com/openwall/php_mt_seed.git cd进去输入make后编译出的文件先

2019年2月17日

今天又重新看了一下输出第1500个丑数 在我错了八次之后发现要输出一个句号还要输出换行 接下来的两天应该进入复习阶段了。

National Contest for Private Universities (NCPU), 2019 E. Generalized Pascal's Triangle

编辑代码 2000ms 262144K Generalized Pascal's Triangle Pascal's triangle is a triangular array in which each number can be calculated by the sum of the two numbers directly above that number as shown i

Hinton等人最新研究:大幅提升模型准确率,标签平滑技术 2019-7-8

导读:损失函数对神经网络的训练有显著影响,也有很多学者人一直在探讨并寻找可以和损失函数一样使模型效果更好的函数。后来,Szegedy 等学者提出了标签平滑方法,该方法通过计算数据集中 hard target 的加权平均以及平均分布来计算交叉熵,有效提升了模型的准确率。近日,Hinton 团队等人在新研究论文《When Does Label Smoothing Help?》中,就尝试对标签平滑技术对

Photoshop CC 2019圆形的抠图

快速进入矩形选区 快速在矩形和圆形选区之前切换: shift+M 选择的时候,按住shift,可以选中正方形/圆形   以中心点画圆: alt + 拖拽 再利用变换选区功能即可实现圆的选中 效果如图所示: 再使用自由变换,即可放大,缩小球的大小: ctrl + T 阴影部分的处理: 1)去其他球那里选择个椭圆形选区 2)选择编辑-填充 3)使用滤镜里