spaceline是军用软件吗

MRI》中解释了为什么能够将数字化的磁共振信号直接填充在 k 空间。为了便于更加深刻地理解,我们再学习下另一本书中与此相关的内容。即我在 B 站直播的那本书《MRI from Picture to Proton》。下面我将引述于下,且同样进行译注,如果想看直播回放请去 B 站查看,文末附有直播间房间号。

一切权利归原作者所有。

仅供学习交流使用,严禁用作商业用途。

在磁共振成像中我们用梯度来测量被成像物体的二维(或三维)频谱。这一频谱就是所谓的 k 空间,由一组单独的空间频率所组成的数字矩阵。下面将从概念上来解释这一过程。

空间频率这一概念不仅仅是一个空想出来折磨磁共振学习者的抽象理论,在现实生活中,我们的大脑利用空间频率来建立我们所看到的视觉图像。空间频率理解起来可能很困难,但它们却又是真实存在的,并且如果没有空间频率的话,我们将处理黑暗之中!

理解空间频率最简单的一种方法就是考虑一个线对测试卡片,比如用于测试 X 线成像系统的线对。它们包含明暗交替变化的条带或不同间距的线对(如图 8.10,即下图)。

这个明暗相间的条带的方向可以是任意方向,代表可能含有各个方向的空间频率。我们回顾下【Q&A in MRI】中的一个 gif 动图:

k 空间的中心区域。而且 k 空间中的点所蕴含的空间的频率的方向你发现规律了吗?

假设每厘米有 5 个线对,这意味着在一厘米内有 5 组明暗条纹。这种线对模式产生的图像亮度模式类似于空间频率。在磁共振中,空间频率是信号或图像亮度在空间分布上的周期性变化,不是用每厘米线对数表示,而是用“每厘米周期数”表示(十分相似)。

空间频率 k 的单位为 cycles/cm. 之前 【Q&A in MRI】中写过,二维图像是由各个方向各个频率各个相位的平面简谐波组成(或图像可以拆解成若干平面简谐波)。

任何图像(不仅仅是磁共振图像),应用傅立叶变换理论进行解析都可以分解成周期变化亮度(正弦曲线形式)或空间频率。矩阵为 256 × 256 像素的数字图像将有 256 × 256 (=65 536)个可能的空间频率,可以是正值也可以是负值。如果我们知道某物体一幅图像的所有空间频率,那么我们可以计算出这个图像。用梯度进行磁共振定位的目的就是想要操纵磁共振信号,使之能够提供重建一幅图像所需要的所有空间频率。k  空间中的每一个点代表一个空间频率分量。

【MR技术】为什么磁共振成像这么麻烦?或许这篇文章能够给你带来新意。

在这一链接文章里通过浅显的话道出了磁共振成像的精髓之处。为什么磁共振成像那么麻烦?不就是在获取图像的空间频率(“图像的另一面”)吗?然后再通过逆傅立叶变换得到我们“看得懂的图像”。

图 8.11(即下图 a)展示了一幅图像以及它所对应的空间频率(即 k 空间)。如果我们将高频信息去除掉,那么得到的图像将只有亮度没有细节(即下图 b);如果去除的是低频率数据,那么得到的图像将会只包含图像边缘和一些尖锐特征,而图像整体的亮度将很低(即下图 c)。因此,大的物体对应低频信息,小的物体或锐利的边缘对应高频信息。

我们可以通过 ImageJ 软件来进行模拟相同的实验:



大的物体对应低频信息,小的物体或锐利的边缘对应高频信息。从上面以及原文中的示例图就能够完全看出。另外,从下面 大圆 与 小圆 的 k 空间示意图中也能够完美表现:大圆的空间频率主要集中在低频区域,小圆拥有丰富的高频空间频率(k 空间调成相同的窗宽窗位观察)。

8.5.2 完全懵的概念:相位编码

可能大多数人觉得相位编码是磁共振成像过程中最难理解的一环,但一旦你从概念上掌握了相位编码的话,那么对于你全面理解磁共振成像将获益良多。下面我们结合图 8.12(即下图)来理解相位编码。图 8.12 给出了在施加相位编码梯度时,三个不同空间位置的横向磁化矢量分别在三个不同时刻相位编码梯度对它们的作用效果。

A 时刻之后打开梯度编码,y 轴方向上不同位置的质子群所受的叠加的磁场强度不同,就导致大家的进动频率不同。在上图所示中,相位编码梯度施加的效果为,正 y 轴处是正向梯度场强,负 y 轴处是负向梯度场强(绿色标示)。然后各个位置的质子群按自己的进动频率进行进动,那么就导致大家步调(相位)的不一致,而越是y轴正向的进动越快,越是y 轴负向的进动越慢。就导致y 轴正向的相位增加(多跑了好几圈),y 轴负向的相位减少(少跑了好几圈),y = 0 处的跟之前一样,进动频率不变。
最终产生的最大的相位差别跟梯度效能十分相关,即梯度峰下面积:

不论是相位编码梯度还是扩散敏感梯度,扰相(毁损)梯度亦或是其他应用类型的梯度,对质子群的作用都是一样的。若要想达到某施加效果,比如使梯度施加方向上的质子群相位变化为 8π,由于梯度作用产生的相位是具有累积效应的,那么梯度场强度越大,所需要的时间就越短;梯度场强度越小,所需要的时间就越长。另外梯度爬升的过程也是有效作用时间,那么爬升得越快,梯度场强越大,所需的时间就越短。总之,梯度波形下的面积要相等。另外,梯度的快速来回切换,与 PNS 与听觉噪声十分相关;还有静音序列的梯度模式、Spiral 采集所配合的读出梯度等通常不是梯形/矩形梯度脉冲。

假设一开始所有自旋的磁共振信号都是同相。如果我们在时刻 A 沿着 y 轴方向施加一相位编码梯度,那么所有的氢原子核的进动频率将加快或减慢,具体根据它们在 y 轴所处的位置来判断。就像我们在 8.3.3 节中讲过的,这一编码梯度将导致自旋开始散相或成扇形散开,只要梯度一直施加,那么散相的程度将一直持续增大。如果我们在时刻 B 关闭梯度的话,那么所有的氢原子核将又恢复到它们原来的进动频率,但它们不同的相位角将得到保留。这一过程就称作相位编码。而这一不同位置质子群信号相对的相位差异将一直保留,直至另一个梯度的出现或磁共振信号由于 T2 弛豫衰减完毕。

8.3.3 节所讲的散相如下图:

图 8.13(即下图)显示了在相位编码梯度方向沿柱形分布的质子群所经受三个不同梯度场强度而产生的信号差异。我们看到,在没有施加梯度时,所有质子群均同相,并且采集的信号强度很大(即下图 a)。但随着梯度强度的增大,质子群的散相也越来越大,当散相足够大使得所有质子群的相位相互抵消时,那么将没有磁共振信号产生。

从上图中我们看到,在没有施加梯度的时候,所有自旋同相,那么采集的信号就很强,因为大家叠加之后信号是增强的效果。而当施加梯度后,所有自旋处于一个散相过程,那么通过矢量叠加后,表现为相互有所抵消,那么采集的信号就强度就有所下降。这种情况就相当于我们 Cartesian k 空间模式采集中心区域的信号。而当施加的梯度效果很强时,所有自旋散相很严重,那么到最后采集到的信号就表现为很弱,就相当于我们 Cartesian k  空间模式采集周围区域时的信号。而在 Cartesian k 空间采集过程中,相位编码梯度是逐级变化的,从正向最大按固定的步长变化到负向最大。那么就导致采集的 MR 信号从 k 空间中心向相位编码方向两端逐渐变弱。

那么这又是如何测量空间频率的呢?参考图 8.13,假设质子群均匀分布,并且我们施加一个足够强的相位编码梯度,使得所有质子群的相位变化范围为 360°(2π 弧度或 2π 的倍数)。由于所有自旋平均分布于各个方向,当将这一圆柱内的所有质子的磁共振信号相加时我们将得到零信号。那么我们说这个物体没有单位长度一个周期的空间频率信息。

下面我们来看看一系列线对结构(包含质子与不包含质子交替排列),如下图 8.14 所示。

很显然,只有含有质子的那部分对磁共振信号有贡献。例如上图,当 k = 8 时,由于质子的空间分布是同相的,那么叠加起来时将会产生一个净的明确的信号。也就是说, 这一特定的相位编码梯度对在 FOV 大小内八个周期的空间频率敏感。再看图 8.14 中的其他线对模式,加起来的信号都是零。

然而,通常一个物体(如病人的身体)所拥有的空间频率是一个范围。每一个相位编码值可以看成是一个模版或一把梳子(用专业术语叫滤波器),对应于磁共振信号的一个空间分布或空间频率。如果要重建一幅完整的图像,就需要包括所有可能的空间频率。通过逐步采集所有相位编码来实现(如图 8.1 中用“梯状图形”来表示相位编码),一个 TR 间期采集一个相位编码。当没有施加梯度时,采集的整个物体的信号称之为零空间频率或 k = 0.

因此,磁共振成像序列包含多个射频激发过程,而每一次射频激发都匹配一个不同的相位编码梯度,直至所有可能的空间频率都被采集完。你可以将每一个相位编码步长想像成一个滤波器或一把梳子,就像图 8.15 中所示。当所有信号都采集完,通过傅立叶变换就可以将空间频率分布转换成被激励的氢原子核的空间分布,即病人的一幅图像。

比如有一簸箕各种豆子,有黄豆、绿豆、红豆、黑豆等混杂在一起,各个颜色的豆子大小各不相同。

现在有一个可调节网孔大小的筛子,那么可以通过多次调节网孔大小将所有豆子按大小给分类。

而每一次调节网孔的大小并进行筛选就相当于 MRI 成像中施加的一次相位编码(它蕴含一个空间频率)并进行信号采集。

而那么多次的相伴编码,每次施加的相位编码的梯度大小是不同的,但它们之间的步长相等。

以自旋回波 SE 序列为例,频率与相位编码步长均为256。

每一个 TR,采集一个回波填充一条 K 空间相位编码线,且从+128至-127顺序填充。那么每个信号的频率编码都是相同的,而相位编码是不同的,相位编码梯度以一定的步长从正向最大变为反向最大。

在这里再提一下,当采集第一条第+128相位编码线时,由于其相位编码梯度开的最大,那么各体素内散相的程度也最大,那么在采集时,信号将非常小,此时所采集的空间频率属于高频,相位编码方向的的空间频率 k 很大;当采集 K 空间中心部分时,+2,+1,0,-1,-2等时,由于相位编码梯度开的不是很大,那么各体素内的散相不是很严重,拥有较高的信号强度,此时所采集的空间频率属于低频,相位编码方向的的空间频率 k 很小。

顺便在这里再提一下,由于相位编码梯度的极性是反转的,由正向最大变成负向最大,那么所蕴含/采集的空间频率 k 也是有正负之分。这样 k 空间在相位编码方向就形成了对称的格式;而 k 空间在频率编码方向上的对称通过施加预读出梯度,这样在信号读出的中心时刻,空间频率为零,这样两边关于中心对称。
另外,由上也可以推得,MRI 扫描时,将空间体素做的越小,需要采集的空间频率就越多越丰富,对于细节显示也越好,包含了更多的空间频率,越逼近于图像真实的情况。若有时空间分辨力做的不够高时,就可能会出现截断伪影,即它所采集的空间频率不够,对于边缘、细节地方属于高频,那么就不能很完美地表达,在图像上就会出现“震铃”效应。关于更多信号采集与处理相关的内容请参阅下面链接:

为了获得整个图像,没有理由不在另一个方向也施加相位编码。实际应用的困难在于,对于每一个 GPE 值(或相位编码方向的空间频率,kPE)我们必须采集所有的 kFE 值(施加所有 GFE 梯度步长)。这就要花费很长的时间,但是它是可行的。比如 3D 成像或 3D 傅立叶变换就是这么做的。幸运的是,有一个更快、更简便、概念上也更简单编码的方式,就是在成像层面内的另一个方向上使用频率编码

从这里可以获知,要成一幅图像,没必要一个方向频率编码另一个方向相位编码,还可以两个方向都是相位编码。但这样就需要每一个 X 方向的相位编码需要对应所有 Y 方向的相位编码,比如两个方向相位编码步长都是 256,那么总共就需要采集 256×256 次信号,那么很显然,这将花费很长的时间,而使用频率编码就能很好地解决另一个方向空间频率采集的问题。但我们所熟知的 3D 采集时就需要这么做。层面内有一个频率编码与一个相位编码,层面间也是通过相位编码来采集的。所以 3D 序列的采集的时间通过表示成 TR×N1×N2×NSA,分别 N1, N2 分别代表层面内相位编码步长与层面间相位编码步长,因为一个方向的相位编码需要对应采集另一个方向的所有相位编码步长。

使用频率编码,我们能够从一次射频激发产生磁共振信号中采集完所需的所有空间频率信息。在相位编码中,一条数据线(即 kPE 值)的采集就需要一次磁共振激励(射频脉冲)。对于一幅相位编码方向有 256 个像素的图像,我们需要 256 次磁共振激励,这将花费 256 × TR ms 时间。图 8.16(即下图)表示开启梯度一段时间,将产生一定的梯度矩与相位变化;之后进行信号的采样,记录信号强度。再经过一个不同的梯度步长(以及不同的梯度矩和相位变化)后采集下一个数据点。这样经过梯度矩整个范围的作用,我们就采集了与磁共振信号强度相关所有数据点。

在施加频率编码梯度的同时进行信号的采集,那么随着梯度的持续施加,所采集的信号数据点中所包含的相位累积越来越多。在实际应用中,会在信号读取之前施加一预读出梯度,方向也读出梯度相反,所对应的梯度矩与读出梯度前一半时间内的梯度矩即峰下面积相同。信号读取的前半段时间内,横向磁化矢量聚相,信号强度逐渐增高;信号读取的后半段时间内,横向磁化矢量散相,信号强度逐渐衰减。但其整个过程中,不同时刻所采集的信号数据所包含的频率编码方向上的相位累积是不同的。

频率编码梯度施加时,信号采集是同步进行的,这样频率编码方向上的空间频率信息就被采集下来了。而相位编码方向的空间频率信息需要每一次不同的相位编码梯度来进行采集。如果从总的时间上来看,跟频率编码方向上的采集十分类似:

然而,假设我们持续施加一梯度,在施加梯度的不同时间点测量/采集磁共振信号。在每一个时间点,磁共振信号所受的梯度矩的总量是不同的,同时累积的相位差也不同。因此每一个时间点反映了一个不同量值的“相位编码”,它对应着不同的空间频率。那么我们可以通过一次射频激发,采集随时间变化的磁共振信号,来获得这一方向上的所有空间频率。这个可以与相位编码采集进行类比,但相位编码的时间变化是“伪时间”,间隔 TR 时间进行采样,如图 8.17 所示。最终所采集的原始数据矩阵称作 k 空间。

那么如果我们能施加一次频率编码就能采集所有频率编码方向的空间频率,为什么还要花费时间来进行多次激励和相位编码呢?因为频率是一个标量参数,即它是用单个数字表示的量。如果我们同时在两个方向施加频率编码梯度,那么我们没有方法知道信号中的某特定频率是来源于这两个梯度中的哪一个,亦或两者都有。通过在两垂直正交的方向联合相位编码与梯度编码,我们可以收集到成像所需要的明确的空间频率。

频率编码可以解析一维结构(傅立叶变换),但不能解析二维结构。

二维的结构的解析需要引入相位编码:

还有另一种方式理解频率编码,这也是通常许多书中所使用的方法。就是考虑频率编码梯度对磁共振信号频率的作用效果,如图像 8.18 所示(即下图所示)。

由于频率编码梯度施加的同时进行信号的采集,那么信号的频率将依赖于被扫描物质在梯度磁场中的位置。采集的信号将不再是单个正弦波,而是许多频率分量的混合,亦即这些信号被频率编码了。通过傅立叶变换可以轻易地测定频率成分。如果施加一维傅立叶变换,那么就得到物体的一维投影频谱。

声明:由于本人才疏学浅,且篇幅较长,译注难免会有不当或错误的地方,还请各位老师多多指正。

}

电子信息、精密仪器、人工智能、智能硬件、智能可穿戴、工业物联网、智能制造装备、手机芯片、MEMS(微机电系统)、功率器件、机器人、无人机、3D打印、通用航空、轨道交通、动力电池、水处理、工业节能装备、新材料。 Electronic Information, Precision Instruments, Artificial Intelligence,



廊坊百冠包装机械有限公司是河北省高新技术企业,公司产品“超洁净干式杀菌系列吹灌旋生产线”荣获“河北省重点领域首台(套)重大技术装备产品”;“PET瓶无菌灌装生产线”荣获“河北省科技进步奖三等奖”、“廊坊市科技进步奖一等奖”。 Langfang Baiguan Packaging Machinery Co., Ltd.is a high-tech
目前火法冶金SO2尾气通常生产硫酸,但是由于硫酸市场问题、运输半径问题,该工艺已经收到巨大限制,迫切需要冶金尾气的新型制备工艺。过程所提出将冶金SO2尾气通过煤气还原制备硫磺新技术,利用了廉价的煤气,产品硫磺也是市场需求产品(目前还需要大量进口),原料优势明显。At present, pyrometallurgical SO2 tail gas
总占地120亩,一期已经完成建设高端研发办公楼3.5万平米,企业入驻率98%;项目已取得省级科技企业孵化器、国家级众创空间;2019年即将完成二期10万平米高端研发办公楼,酒店式人才公寓、职工超市、路演大厅、商务中心、多品味餐厅等。企业可自由选择60-6000平米研发厂房及办公楼 The total area is 120 mu, the first
智企汇谷:5A级商务综合中心,办公大楼总建筑面积6万平方米。是现代化、多功能、舒适的办公与生产场所,独享通州北京副中心大商圈,区位优势得天独厚,最适合企业和创客们的办公需求燕郊精工园项目:京东创新型产业园区。主要发展总部经济、企业孵化、创客空间、高新科技产业等功能板块。 Zhiqi Huigu: 5A-level business


河北稳控科技有限公司承办,产品可连接振弦、模拟量和其它数字接口传感器,实现物联网对接,突破了传统的信号线缆过长、线缆费用、施工费用及线缆易受干扰等问题。综合运用快速测量技术和超低功耗控制、无线通讯技术,单节电池(1000mAH)可连续工作数年。 Hebei Steady Control Technology Co., Ltd., the product can
河北净易环保工程有限公司承办,拥有核心技术专利30余项,国家高新技术企业。采用无机陶瓷膜净水不排放废水且保留原水矿物质。核心技术“无机生态梯度双控陶瓷膜净水技术”经科技鉴定达到国际先进水平。无排废净水也为节水型高校,节水型企事业单位作出贡献。 Hebei Jingyi Environmental Protection Engineering Co.,
三河市黑蚂蚁仪表有限公司是一家提供新能源及建筑节能综合解决方案的国家高新技术企业,集产品研发、设计、组装、销售和技术服务于一体综合性公司。是河北省高新技术企业、河北省科技型中小企业、国家级科技型中小企业、廊坊市供热计量节能系统研发中心;近年来,获得了17项专利,其中7项实用新型专利,10项外观专利。 Sanhe City Black Ant
欧伏电气股份有限公司是一家为全球客户提供电气产品及解决方案,集研发、制造、销售、服务为一体的高新技术企业,在数据中心领域,提供卓越的能源及冷却解决方案。瑞士皓欧集团是世界暖通领域顶尖品牌,一家全球性跨国公司,在欧洲佣有多处生产基地。欧伏电气与瑞士皓欧战略合作,为中国数据中心带来世界领先的制冷技术,打造中国本土的间接蒸发冷却系统一ServeLine。这是两套超高效节能冷却解决方案,通过对“风”和“水”的智慧利用,1200平的板式热交换器能使全年90%以上的时间无需开启机械制冷,数据中心总运行成本由此可降至最低。皓欧一欧伏ServeLine间接蒸发冷却系统可为互联网、企业、学校等用户提供数据中心冷却一体化解决方案,以满足制冷节能、能源优化、智慧管理的需求,助力中国数据中心实现能源与环境的和谐发展。






智能硬件产业园规划占地面积117亩,规划总建筑面积8.5万平米,目前,智能硬件产业园围绕制造业研发设计、互联网化、智能化方向发展2.5产业,由现代化高端企业建筑组成,集标准厂房、中试研发楼、配套楼等物业形态于一体,重点发展智能化智能制造装备、智能家居自动化系统集成和车联网等产业集群。 The intelligent hardware industrial 1、智能硬件:操作系统、芯片、传感器屏幕/面板、结构件、PCBA整机制造、检验检测 2、汽车零部件:发动机与传动系统、内饰、外饰汽车电气电子、车身及底盘系统 3、智能装备制造:智能仪器仪表、增量制造、数控机床 1, Intelligent Hardware: Operating System, Chip, Sensor Screen / Panel,
检验认证产业园总占地面积36亩,建筑总面积2.5万平方米。打造国内最权威的集规模化、多元化、专业化于一体检验认证产业集群,立足检验认证产业链的高附加值环节,以高标准的产品规划、完善的产业配套、生态高科园区的理念,营造产业升级的样板区。 The inspection and certification industrial park covers an area
创新中心产业园总占地面积23亩,总建筑面积1.7万平方米,共建5栋载体。创新中心聚焦“大智移云”等高科技方向,以创新企业和科技孵化平台为招商目标,打造“互联科技+智慧服务”产业集群,吸引高端人才聚集,打造宜居活力办公社区和北京副中心功能组团科技服务高地。 The Innovation Center Industrial Park covers an area
总建筑面积近3万平米,为大厂首座5A级标杆写字楼,大厦首层设置一站式政务服务大厅,包含注册地、立项审批、财税服务、金融服务、人才服务、版权服务等功能。2层配置食堂满足企业用餐需求,3-6层为高新区办公地点,7-15层为可招商部分,每层1300㎡,共计约11900㎡。 The total construction area of Chuangye
目前可招商载体3个: 1)影视创意孵化产业园建筑面积5.8万平米,建设载体14栋已全部投入使用。园区包括教学楼、孵化楼、创意楼、特效楼、拍摄棚、放映厅,以及配套等功能区; 2)影视制作产业园建筑面积3万平米,建设载体6栋已全部投入使用。园区包括影视拍摄棚、后期制作、置景空间、创意办公、大师工作室等功能区;
机器人产业园位于香河开发区,产业园载体由德国FTA设计公司提供高标准设计,由幸福物业提供星级物业服务。产业园总占地约676亩,总建筑面积约54万平方米,总投资约40亿元,主要建设机器人研发大厦、系统集成产业园、核心零部件产业园、机器人展示培训产业园以及机器人酒店、运动公园等相关配套设施。主要进行高端领域智能机器人及其他自动化设备的设计、研发、生产。目前,香河机器人产业园内提供政务服务、金融服务、人力资源、品牌推广、供应链对接等八大产业服务体系。未来,将形成机器人本体、设计研发、核心零部件、系统集成、行业应用、配套服务等全产业链的发展模式,打造全国知名的机器人产业集群、国内重要的机器人研发生产示范区,建成国家火炬特色产业园区。











廊坊市朗盈汽车零部件有限公司于2016年成立,注册资本为3000万人民币,公司主要经营汽车零部件、汽车电子产品、汽车内饰产品的生产和销售;销售:金属材料(不含贵金属)、建筑材料、化工产品(不含危险化学品)、仪器仪表。 Langfang Langying Auto Parts Co., Ltd. was established in 2016 with a
企业港位于廊坊市高新技术产业开发区,龙脊道以南,凤翼路以东园区,占地1340000平方米,总建筑面积205476平方米。区域路网、热力站、给水厂、污水处理厂、雨污水泵站、变电站、燃气、通讯、创业服务中心等配套设施工程已陆续建成投入使用,具备大型项目综合吸附和承载能力。 The enterprise port is located in Langfang 电子信息、高端装备制造、精密仪器制造、人工智能、智能硬件、智能可穿戴、工业物联网、智能制造装备、手机芯片、MEMS(微电机系统)、功率器件、机器人、无人机、3D打印、通用航空、轨道交通、动力电池、水处理、工业节能装备、新材料 Electronic Information, High-End Equipment Manufacturing,
新材料产业园位于廊坊高新技术产业开发区中部,紧邻开发区管委会。园区周边环绕京台、廊沧、京沪、津保4条高速,津保、津保城际、京沪高铁3条铁路干线;距首都机场、天津机场各60公里,距大兴机场仅40公里。园区面积161亩,规划建设研发创新中心、中试产业港、标准化厂房及生活配套设施。产业园将围绕新材料产业创新与应用示范,培育涵盖研发-孵化-中试-生产-交易全产业环节的新材料产业集群,打造河北省新材料产业创新高地。



京津冀工业设计产业生态城位于廊坊市龙河高新区,是首家以工业设计为核心内容,集科研展示、交易交流、创新创业、孵化培育等功能于一体的工业设计全产业链园区。生态城一期规划面积3万平方米,建有工业设计体验中心、工业设计研究中心、智能制造中心、工业设计交流中心、工业设计成果培育中心、工业设计创新创业基地,以及工业设计博物馆、工业设计成果展厅、工业设计开放课堂、联合办公空间、白领公寓、餐厅、健身娱乐中心等配套设施。符合条件的入驻设计机构,可享受河北省、廊坊市等相关工业设计政策支持。
创新创业中心占地272.25亩(181500平方米),总建筑面积20万平方米,总投资10亿元,位于龙河高新区产业聚集的核心地带,紧靠富智康电子信息制造基地和中建二局机械制造基地,周边中小企业环抱,产业链和产业结构合理完备,发展环境优越。 The Innovation and Entrepreneurship Center covers an area
慧谷梦工厂总占地面积282亩,总投资15亿元,位于龙河高新区内,主要建设工业厂房114栋、研发办公楼6栋、配套服务用房3栋、蓝白领公寓楼5栋。将充分借鉴北京中关村扶持人才创业和科技创新的成功经验,整合各种资源要素,打造集研发、孵化、创新创意、“互联网+”,总部办公等于一体,融合新鲜独特、富有活力的新一代、绿色元素的产学研用集聚新平台。 Huigu 主要面向国内外电子信息、生物医药、新材料、新能源等战略性新兴产业,总部经济,重点发展创业苗圃、创意工厂、创新中心等新型创客空间,引导科技创新、孵化研发加速和人才创业,提供研发、孵化、中试、生产、经营和文化、教育、培训、展示平台,打造良好的高新科技创新创业环境。 It mainly for domestic and international

电子信息产业总部基地位于龙河高新区内,占地面积120亩,紧靠富智康电子信息制造基地,产业链和产业结构合理完备,且周边配套设施齐全,以商务楼、功能性板块和区域性设施为主要载体,带动区域经济发展。 Electronic Information Industry Headquarters Base is located in Longhe High-tech
廊坊市圣淘电子技术服务股份有限公司利用电商培训累积的商家资源,给商家建立社群类电商小程序,利用免单和返现奖励的模式,鼓励买家将订单分享给好友参与团购返现,使产品以社交团购的方式裂变增长。 Langfang Shengtao Electronic Technology Service Co., Ltd. use the accumulated
项目位于廊坊市永清经开区内,西邻百合路,南北跨越富贵路,总投资120088万元,项目总建筑面积266600平方米。主要建设21栋厂房、9栋行政办公及生活服务设施用房及1栋北大精英科创基地。项目分三期建设,一期总建筑面积83058.31㎡,地上建筑面积为59548.31平方米,地下建筑面积23510㎡。主要建设20栋厂房,二、三期总建筑面积为平方米,主要建设9栋行政办公及生活服务设施用房及1栋北大精英科创基地。 项目主要面向信息产业、软件开发、智能设备、文创产业、互联网、精密仪器、高端装备制造等高科技创业企业,提供良好孵化培育条件和全方位、全过程的高效服务。为入住孵化企业提供厂房场地租赁、政务代理、资金融通、人员培训、生活住宿、物业管理等综合配套服务。 The project is mainly aimed at high-tech start-ups such
河北永清经济开发区现代服务产业园(原河北廊坊现代服务产业园区)总规划面积27平方公里,于2010年被河北省人民政府批准为省级开发园区。同年,经省人民政府批准,“中国北方金融产业后台服务基地(A区)”设立于园区,并作为“十二五”期间全省全力打造的金融产业基地。2012年,园区又被省商务厅、工信厅、科技厅联合评定为“河北省服务外包产业基地”。 Hebei

“中农国际农产品交易展示中心项目”。立足永清,辐射“京津冀”及雄安新区,运用5G、大数据、物联网等高科技、智能化技术,致力打造集线上交易、线下展示体验,产品种类齐全、配套设施完善的进口农产品交易平台,集国际农产品进口贸易、仓储、物流、加工、包装等功能为一体的大型综合性企业。项目总投资6亿元,总占地面积㎡,其中,综合服务区、会展区、交易区占地面积37126.37㎡,物流区、仓储库房及辅助设施占地面积570667㎡。"Zhongnong




















北距北京新机场80公里、北京市区100公里,西距雄安新区50公里,东接天津市静海县,距滨海新区48公里,是对接天津的桥头堡。京沪高速、廊沧高速、荣乌高速环绕周边,省道廊泊线纵贯全境,区位及交通优势十分明显。 It is 80 kilometers away from Beijing New Airport in the north, 100

文安经开区拟利用50亩一类工业用地,用于项目招商,要求总投资在3.5亿元以上,项目需纳入集院士工作站、产学研平台、创业孵化器、小微企业创新示范基地、模具制造及销售等功能,为投资企业提供一片良好的双创载体。 Wen'an Economic Development Zone plans to use 50 acres of industrial land
8平方公里起步区基础设施完善,道路、给水、排水、通讯、电力、供热、供气、宽带网络、有线电视、土地平整等全部完成,功能不断增强。储备土地2000多亩,供水站、污水处理厂已建设完成。35千伏和110千伏变电站的扩容改造升级工程已完成,届时,可保证园区落户项目用电需求,220千伏和110千伏变电站已投产使用;园区中心主路与县城连接线中源路现已全面通车。园区核心区已实现“九通一平”,具备了大项目落地的基本条件。
区位优势明显。廊沧高速大城出口位于园区境内。目前,上位电源引自现状广安220kV变电站。另在工业园内规划1座110kV变电站,规模3×5万千伏安,占地面积5000平方米。园区生活用水及生产用水规划水源引自园区东侧南水北调水厂,规模8万立方米/日。已有一条燃气管道铺设到园区北部。气源来自县城方向规划管道天然气。规划区内计划设置一座燃气调压供气站及服务站,占地5300平方米,为该区域提供燃气。

廊坊科技企业孵化器有限公司成立于2002年,自有孵化场地10800平方米,是专业从事创新创业型企业及团队孵化、培育的服务机构。2008年获批“省级科技企业孵化器”,2018年获批“省级示范性双创孵化基地”。公司自成立以来,一直秉承“让创业更简单”的服务理念,采用“孵化+投资”的模式,突出“科技”和“创新”两大关键要素,着力提升政策支撑和自主创新,为科技创新型中小企业和团队提供低成本的研发、办公场地,并通过创业辅导、技术对接、成果转化、投融资等科技服务,帮助入孵企业提高创业成功率。



本项目依托霸州市鑫地美种植农民专业合作社运营的农业科技园建设,该科技园共占地4000亩,房车训练营基地项目建设包括荷花池4个;观光山一座(可滑草、滑雪);7000平方米游客集散中心一处;房车训练营停放区一处。 The project relies on the construction of the agricultural science and


项目总占地千余亩,依托环京津冀经济圈,打造集观光度假、餐饮娱乐、科普体验、户外健身、养生养老、原生态田园生活为一体的京南旅游腹地,倡导人与自然的和谐共融与可持续发展,通过一三产的有机结合与关联共生,实现生态农业、休闲旅游、田园居住等复合功能,为游客提供高品位、多层次、全方位的休闲体验,致力于打造健康养生的田园综合体。 The project covers

项目占地5500亩,其中核心区域2400亩。区域内有文化古镇、大型水果采摘园、碱河岸汉代历史与宫廷技艺等文化旅游资源。本项目依托区域内丰富的资源属性,定位于京南休闲度假旅游观光目的地。将打造集古文化街观光、体验民宿、美食采摘、水上娱乐等功能于一体的5A级旅游景区及国家级特色小镇综合体。 The project covers an area of


北京大兴国际机场临空经济区位于北京大兴区与廊坊市毗邻区域,环机场布局建设,区位优势明显,交通便捷通畅,发展空间充裕,具备高起点、高标准开发建设的基本条件。北京新机场临空经济区定位为国际交往中心功能承载区、国家航空科技创新引领区、京津冀协同发展示范区,将实现建成具有国际竞争优势的临空经济区。临空经济区总面积150平方公里,其中大兴区50平方公里,廊坊市100平方公里。 依托北京大兴国际机场国际大型航空枢纽辐射带动作用,临空经济区规划建设“三区四集群”,三大功能区即航空物流区、科技创新区、服务保障区,四个产业集群即航空服务保障产业集群、航空物流产业集群、临空高端服务产业集群、科技创新产业集群。 Beijing Daxing International Airport Linkong Economic Zone is located in 航空物流产业集群主要包括:电子商务与电商物流、冷链物流、供应链管理、物流金融,科技创新产业集群主要包括:航空航天、新一代信息技术、高端装备制造、生物医药、未来产业,临空高端服务产业集群主要发展:研发设计、检验认证、外包服务,航空服务保障业集群主要发展:航空运营中心、培训基地、维修基地。 The aviation logistics industry
}

Instagram每天上传超过100+百万张照片,是最受欢迎的社交媒体平台之一。 基于这个原因,我们决定测试适用于Android和iOS操作系统的Instagram应用的安全性。 在其中我们发现了一个严重漏洞,可以用来在受害者的手机上远程执行任意代码。

我们进行此研究的关注方向是测试Instagram使用的第三方项目组件。

现如今,许多软件开发人员,无论其项目规模大小,都会在其软件中使用开源项目。在此次研究的最后,我们在Instagram使用的Mozjpeg(一个开源项目用作其JPEG格式解码器)库中发现了一个漏洞。

在我们下面描述的攻击情形中,攻击者只需要通过电子邮件,或其他媒体交换平台将图像发送给受害者。 当受害者打开Instagram应用程序时,就会执行恶意代码。

告诉我你的朋友是谁,我会告诉你他的漏洞

我们都知道,即使是大公司大都也依赖于开源项目,并且这些项目几乎不经过修改就集成到了他们的产品中。

大多数使用第三方开源项目的公司都对其进行了声明,但并非所有库都显示在该应用程序的“About”页中。 为了确保能查看到所有的库最好的办法是查看Instagram应用的lib-superpack-zstd目录:

moz后缀是mozjpeg的缩写,mozjpeg是Mozilla JPEG编码器项目的缩写,我们需要了解一些这些模块都做了什么?

让我们从JPEG格式的简要历史开始。JPEG是一种自1990年代初期以来就存在的图像文件格式,它基于有损压缩的概念,这意味着在压缩过程中会丢失一些信息,但是人眼可以忽略不计。Libjpeg是Windows,Mac和Linux操作系统中内置的基准JPEG编码器,由一个非正式的独立小组维护。该库试图在编码速度和质量与文件大小之间取得平衡。

相反,是libjpeg的高性能替代品,并且是大多数Linux发行版的默认库。该库旨在在编码和解码期间使用较少的CPU时间。

2014年3月5日,Mozilla发布了项目,这是一个基于libjpeg-turbo之上的JPEG编码器,目的是为Web图像提供更好的压缩效果,但会降低性能。

在Instagram的使用中将mozjpeg库拆分为3个不同的共享对象:

  • libjpegutils_moz.so –两个共享对象之间的连接器。它包含JNI调用以从Java应用程序端调用解压缩的API。

我们在CPR的团队建立了一个多处理器模糊测试实验室,通过我们以往的为我们带来了惊人的结果,因此我们决定将模糊测试工作也扩展到Mozjpeg。

Mozilla在libjpeg-turbo之上所做的主要添加是压缩算法,因此这才是我们研究的重点。

AFL是我们首选的武器,因此自然而然地我们必须为其编写harness。

要编写harness,我们必须了解如何使用Mozjpeg解压功能。

幸运的是,Mozjpeg附带了一个代码示例,说明了如何使用该库:

但是,为确保我们在Mozjpeg中发现的任何崩溃都影响Instagram本身,我们需要了解Instagram是如何将Mozjpeg集成到其代码中的。

幸运的是,下面你可以看到Instagram直接复制粘贴了该库的最佳实践:

我们的harness从AFL接收生成的图片文件,并将它们发送到封装的Mozjpeg解压函数。

我们仅用30个核心的CPU跑了fuzzer一天,就收到了AFL通知我们的447次独特的崩溃。

在对结果进行分类之后,我们发现了与解析JPEG图像Size有关的有趣崩溃。 崩溃是一个越界写,我们决定专注研究它。

存在漏洞的函数是read_jpg_copy_loop,它在解压缩过程中产生了整数溢出。

漏洞的函数在解析JPEG图像文件时处理图像尺寸不恰当。下面是原始漏洞函数的伪代码:

首先,让我们了解这段代码的作用。

_wrap_malloc函数基于3个参数(即图像尺寸)来分配内存块。宽度和高度都是从文件中解析的16位整数(uint16_t)。

除了高度和宽度,output_component也完全由攻击者控制。它是从文件中解析的,并且未针对文件中可用的剩余数据进行验证。

__warp_malloc期望其参数在32位寄存器中传递!这意味着,如果我们可以使分配大小超过(2 ^ 32)个字节,则将发生整数溢出,从而导致分配的大小比预期的小得多。

分配的尺寸是通过将图片的宽度,高度和output_components相乘得出的。这些大小不受检查,由我们控制。滥用它们便会得到我们想要的整数溢出。

更为方便我们的是,此缓冲区然后会传递给memcpy,从而导致基于堆的缓冲区溢出。

在分配内存后,将调用memcpy函数,并将图像数据复制到分配的内存中。

从漏洞利用者的角度来看,这是一个很有希望的bug:线性堆溢出使攻击者可以控制分配的大小,溢出的大小以及溢出的内存区域的内容。

为了导致内存损坏,需要溢出整数以确定分配大小; 因此计算的大小必须超过32位所能表示的最大值。 此时我们就是正在处理一个WildCopy的漏洞利用,这意味着我们必须复制大于2^32(4GB)的数据。 因此,当循环到达未映射的页面时,程序极有可能崩溃:

那么我们如何利用这一点呢?

在深入研究Wildcopy利用技术之前,我们需要将我们的情况与经典的wildcopy(如)区分开来。 经典案例通常涉及一个写入4GB数据的memcpy

但是,在我们的示例中,有一个for循环尝试将X字节复制Y次,而X * Y为4GB。

当我们尝试利用这种内存损坏漏洞时,我们需要问自己几个重要的问题:

  • 我们能否控制(甚至部分控制)我们破坏的数据的内容?
  • 我们可以控制要破坏的数据的长度吗?
  • 我们可以控制溢出的已分配块的大小吗?

最后一个问题尤其重要,因为在Jemalloc/LFH(或每个基于bucket的分配器)中,如果我们无法控制要破坏的块的大小,则可能难以对堆进行布局以进一步破坏一个特定目标结构(如果该结构的大小明显不同)。

一眼望去,关于我们控制内容的能力的第一个问题的答案似乎是“是”,因为我们可以控制图像数据的内容。

现在,转到第二个问题–控制我们破坏数据的长度。 答案也显然是“是”,因为memcpy循环逐行复制文件,并且复制的每一行的大小都是由攻击者控制的width参数和output_component的乘积。

关于我们破坏的缓冲区大小的第三个问题的答案是微不足道的。

由于它是由width * height * cinfo-> output_components控制的,因此我们编写了一个小Python脚本,该脚本根据整数溢出的影响,根据希望分配的块大小,为我们提供了这三个参数的含义:

现在,我们已经具备了使用wildcopy的先决条件,让我们看看如何利用它们。

要触发此漏洞,我们必须指定一个大于2 ^ 32字节的数据长度。实际上,我们需要在到达未映射的内存之前停止wildcopy

  • 依靠竞态条件–尽管wildcopy破坏了一些有用的目标结构或内存,但是我们可以竞争另一个线程,以在wildcopy崩溃之前使用现在已损坏的数据来执行某些操作(例如,构造其他原语,终止wildcopy等)。
  • 如果wildcopy循环具有某种逻辑,可以在某些情况下停止循环,那么我们可以打乱这些检查,并在破坏足够的数据后停止循环。
  • 如果wildcopy循环在每次迭代时都调用一个虚函数,并且指向该函数的指针位于堆内存中的结构中(或位于我们在wildcopy期间可能损坏的另一个内存地址中),则漏洞利用程序可以使用该循环来覆盖并在wildcopy期间转移执行。

遗憾的是,第一种方法不适用于此处,因为我们是从图像向量中进行攻击。 因此,我们对线程没有任何控制,因此竞态条件选项无济于事。

为了使用第二种方法,我们寻找了一个终止开关来停止wildcopy。 我们尝试将文件切成两半,同时保持图像标题中的大小相同。 但是,我们发现,如果解码库达到一个EOF标记,它只会添加另一个EOF标记,因此我们最终陷入EOF标记的无限循环中。

我们还尝试寻找一种ERREXIT函数,该函数可以在运行时停止解压缩过程,但是我们了解到,无论我们做什么,我们都永远无法在此代码中找到导致ERREXIT的路径。 因此,第二种选择也不适用。

要使用第三个选项,我们需要寻找一个在wildcopy循环的每次迭代中都会调用的虚函数。

让我们回到发生memcpy复制的循环逻辑:

我们可以看到,除了覆盖我们的memcpy… 之外,只有一个函数可以在每次迭代中调用—jpeg_read_scanlines

在上面的代码中我们可以看到,每次调用jpeg_read_scanlines从文件中读取另一行时,我们都会调用虚拟函数process_data

从文件中读取的行被复制到cinfo结构内的row_ctr的缓冲区中。

process_data_simple_main中,我们可以确定另外2个在每次迭代中都会调用的虚函数。 它们都有一个cinfo结构。

Cinfo是在Mozjpeg各种函数期间传递的结构。 它包含关键成员,函数指针和图像元数据。

cinfo结构中,我们可以看到3个指向函数的指针,这些指针可以在循环覆盖期间尝试覆盖并劫持执行流。

事实证明,上面提到的第三个方案适用于我们的情况!

在深入探讨Jemalloc利用概念之前,我们需要了解Android的堆分配器的工作方式,以及我们将在下一章着重介绍的所有术语-Chunks, Runs, Regions。

Jemalloc是一个基于bucket的分配器,它将内存分成大小始终相同的块(Chunks),并使用这些块(Chunks)存储所有数据结构(以及用户请求的内存)。 块被进一步划分为“runs”,它负责特定大小的请求/分配。 run会跟踪这些大小块的free操作和使用过的“Regions(区域)”。 Regions是在用户空间分配(malloc调用)上返回的堆块。 最后,每次运行都与一个“bin”相关联。Bins负责存储free区域(Regions)的结构(树)。

我们发现了3个好的函数指针,可用于在wildcopy期间转移执行并控制PC寄存器。

cinfo结构具有以下成员:

我们需要找到3种结构在堆存储器中的位置,基于此我们可以覆盖其中至少一种结构以获得对PC寄存器的控制。

为了弄清楚这一点,我们需要了解使用Mozjpeg解压缩图像时堆的样子。

让我们回想一下cinfo最重要的struct成员之一:

Mozjpeg有自己的内存管理器。JPEG库的内存管理器控制内存的分配和释放,并管理大型“虚拟”数据数组。 库中的所有内存和临时文件分配都是通过内存管理器完成的。 这种方法有助于防止内存泄漏问题,并且在malloc/free运行缓慢时加速操作。

内存管理器创建被释放内存的“内存池”,并且可以一次释放整个池。

一些数据是被“永久”分配使用的,直到销毁JPEG对象后才会释放。

例如,让我们看一下Mozjpeg在图像解码过程中所做的一种堆的分配。 当Mozjpeg要求分配0x108字节时,堆分配器实际上会给一个大小为0x777的堆块。 我们看到,请求的大小和分配的实际大小不同。

我们需要来分析一下这种行为。

分配的“池”由alloc_small和其他封装的函数管理,这些函数维护一组成员,以帮助它们监视“池”的状态。 因此,每当请求内存分配时,封装的函数都会检查“池”中是否有足够的空间。

如果有可用空间,则alloc_small函数从当前“池”中返回一个地址,并使指向池中空闲块的指针移动。

当“池”空间不足时,它将使用从first_pool_slop数组中读取的预定义的内存块分配另一个“池”,在我们的示例中为160016000

现在,我们了解了Mozjpeg的内存管理器是如何工作的,我们需要确定哪个内存“池”保存着目标虚拟函数指针。

作为解压缩过程的一部分,有两个主要函数可对图像元数据进行解码并为以后的处理做好准备。直到我们到达wildcopy循环为止,仅有jpeg_read_headerjpeg_start_decompress两个函数负责内存分配。

在解析这些标记时,第二个也是最大的“池”,大小为e80),由Mozjpeg内存管理器分配。“池”的大小是first_pool_slop数组(来自上面的代码段)中的const值,这意味着Mozjpeg的内部分配器已经使用了第一个池的所有空间。

我们知道,我们的目标main,coef和post结构是从jpeg_start_decompress函数中分配的。因此,我们可以放心地假设其他分配的结构(直到我们到达wildcopy循环)也将位于第二个大“池”中,包括我们要覆盖的main,coef和post结构!

现在,让我们仔细看看Jemalloc如何处理这种大小类分配。

Jemalloc返回的内存大小分为三类-小,大,巨大。

  • 小型/中型:这些区域小于内存页大小(通常为4KB)。
  • 大:这些区域介于小/中和大之间(内存页大小与块(chunk)大小之间)。
  • 巨大:大于块(chunk)的大小。它们被单独处理与arenas无关,有一个全局分配器树。

操作系统返回的内存分为多个部分。在Android中,对应于不同的版本,这些块的大小也不相同。它们通常约为2MB/4MB。每个块都与一个arena关联。

run可用于托管一个分配的大块或分配的多个小块。

大型regions有自己的runs,即每个分配的大块都有专用的run。

在为漏洞利用实现堆布局时,有一种可视化堆的方法:查看堆上下文中的各种内存分配。

为此,我们使用一个简单的工具,使我们可以在漏洞利用开发过程中检查目标进程的堆状态。 我们使用了argpvats编写的名为的工具来可视化Jemalloc堆。

我们使用gdb上的shadow执行了调试会话,以验证我们的假设。

我们的目标是利用整数溢出来导致堆缓冲区溢出。

利用这些类型的bug都是对于堆对象的精确定位。我们想强制某些对象被分配在堆中的特定位置,因此我们可以布局形成有用的邻接关系来破坏内存。

为了实现这种邻接,我们需要调整堆的布局,以便将可利用的内存对象分配在目标对象之前。

不幸的是,我们无法控制free操作。根据Mozjpeg文档,大多数数据是按“per

但是,在我们的例子中,我们不需要任何free操作,因为我们可以控制一个函数,该函数最终会执行内存分配大小受我们控制的malloc函数。这使我们能够选择将可溢出的缓冲区放在堆上的位置。

我们想将可以溢出的缓冲区对象放置在执行函数指针调用的main/post/coef大型(0x5000)数据结构对象之前。

因此,我们利用此漏洞的最简单方法是对堆进行布局,以便将溢出的缓冲区分配到我们的目标(0x5000byte)对象之前,然后(使用该错误)覆盖main/post/coef虚函数地址。这使我们可以完全控制虚表,将任意方法重定向到指定的地址。

我们知道目标对象具有相同的大小(0x5000),并且因为Jemalloc从顶到底分配空间,所以我们唯一需要做的就是将溢出对象放在目标块所在的底部。

对象之间的距离(以字节为单位)并不重要,因为我们有一个wildcopy循环,可以逐行复制大量数据(我们控制行的大小)。被复制的数据最终大于2MB,因此我们可以确定,最终我们将破坏溢出对象之后的块中的每个对象。

由于我们无法控制free操作,因此无法创建对象会掉进去的洞。 (洞是run过程中一个或多个被free的位置。)相反,我们尝试查找在图像解压缩流程中无论如何都会出现的洞,并寻找在调试期间反复出现的大小。

让我们使用shadow工具检查块在内存中的布局:

我们正在寻找带有洞的runs,并且这些runs必须在要覆盖的较大目标缓冲区之前。 run可用于托管一个大块的或多个小型/中型的分配操作。

承载小分配的runs被分为区域(regions)。一个区域(regions)等同于一个小的分配。 每个小的runs仅容纳一个区域(regions)。 换句话说,一个小runs恰好与一个区域(regions)大小相关联。

托管中型分配的runs也被划分为多个区域,但顾名思义,它们大于小型分配。 因此,托管介质分配的runs被划分为占用更多空间的类区域。

大小为0x200的中型run被分为8个区域:

小块分配是最常见的,很可能是我们需要manipulate/control/overflow的分配。 由于将较小的分配划分为更多的区域(regions),因此它们更易于控制,因为由其他线程来分配其余区域(regions)的可能性较小。

因此,为了使可溢出对象分配到大型目标对象之前,我们使用我们的Python脚本(wild copy利用)。 该脚本可帮助我们生成需要的图片尺寸,这将使得malloc在目标的小型类中分配可溢出对象。

我们构造了一个新的JPEG图像,其大小(0xe0)将会触发分配给对象的小型类,并在libjepgutils_moz.so + 0x918上设置了一个断点。

我们在可控的malloc之前只有一条命令,X0寄存器刚好拥有我们希望分配的大小:

我们继续执行一个命令,然后再次检查X0寄存器,该寄存器现在保存了调用malloc后返回的结果:

我们从malloc获取的地址是我们可溢出对象的地址(0x72a639ac40)。 让我们使用shadow框架中的jeinfo方法检查其在堆上的位置。

让我们继续执行,看看覆盖大型目标对象后会发生什么

BOOM! 正是我们的目标–当程序试图通过函数指针从溢出的对象中加载被传入数据破坏的函数地址时,崩溃发生了。 我们遇到了总线错误(也称为SIGBUS,通常为信号10),该错误在进程尝试访问CPU无法物理寻址的内存时发生。 换句话说,程序尝试访问的内存不是有效的内存地址,因为它包含来自我们映像的数据,该数据替换了实函数指针并导致崩溃!

我们有一个可控的函数调用。 编写一个可靠的漏洞利用所缺少的就是将可执行内存重定向到一个方便的堆栈块构建ROP。

现在我们需要将所有内容放在一起:

  1. 生成我们控制的有效payload的副本
  2. 将执行跳转到受我们控制的地址。

我们需要使用受控数据来生成损坏的JPEG。 因此,我们的下一步是确切确定Mozjpeg平台支持哪些图像格式。 我们可以从下面的代码中找出答案。 out_color_space表示根据图像格式确定的每个像素的位数。

我们使用了一个称为的简单Python库来构造RGB BMP文件。 我们选择了我们熟悉的RGB格式,并在其中填充了“ AAA”作为有效载荷。 该文件是我们用来创建恶意压缩JPEG的基本图像格式。

然后,我们使用Mozjpeg项目中的cjpeg工具将bmp文件压缩为JPEG文件。

接下来,我们测试了压缩后的输出文件以验证我们的假设。 我们知道RGB格式是每个像素3个字节。

但是,当我们检查控制的分配时,我们看到作为整数溢出一部分的heightwidth参数仍然乘以值为4的out_color_components,纵然我们从RGB格式开始,每行使用3x8-bit像素。 看来Mozjpeg更倾向于将我们的图像转换为每个像素4x8-bit的格式。

然后,我们转向了Mozjpeg平台支持的4x8-bit像素格式,CMYK格式满足了标准。我们使用CMYK格式作为基本图像,以便完全控制所有4个字节。我们在图像中填充了“AAAA”作为有效载荷。

我们将其压缩为JPEG格式,并添加了可以触发程序崩溃的图片尺寸。 令我们振奋的是,我们发生了以下崩溃!

但是,即使我们在每个像素图像上构建了4x8-bit的图像,我们也还是得到了一个奇怪的0xFF字节在我们可控地址中,然而其却并非有效载荷的一部分。

这个0xFF是什么意思? 透明度!

支持透明的位图文件格式包括GIF,PNG,BMP,TIFF和JPEG 2000(通过颜色透明或Alpha通道)。

基于位图的图像在技术上是通过图像的宽度和高度(以像素为单位)以及每个像素的位数来表征的。

因此,我们决定使用PIL库通过受控的alpha通道(0x61)构造RGBA BMP格式文件。

令人惊讶的是,我们得到的结果与使用CMYK构造的恶意JPEG触发崩溃的结果相同。 即便我们使用了RGBA格式作为压缩JPEG的基础,我们仍然在可控的地址中看到了0xFF,并且文件中的Alpha通道的值为(0x61)。 这怎么发生的? 让我们回到代码中,了解造成这种奇怪行为的原因。

最终我们在下面的这段小代码中找到了答案:

这也解释了为什么即使我们使用每个像素3x8-bit的RGB对象,也得到了奇怪的0xFF alpha通道。

现在我们将所有内容放在一起,得出的结论是,无论将哪种图像格式用作压缩JPEG的基础,Instagram始终会将输出文件转换为RGBA格式文件。

始终在开头添加0xff这一事实意味着我们可以在大端环境中实现我们的目标。

小端系统将单词的最低有效字节存储在最小的存储地址中。 因为我们使用的是低位优先系统,所以Alpha通道值始终被改写为受控地址的最高有效字节。 当我们尝试在用户模式下利用该错误,并且(0xFF)开头的地址值属于内核地址空间时,它会直接挫败我们的计划。

我们失去了快速取得胜利的可能。 但可以从中学到的一课是,现实生活不是CTF游戏,有时开发人员设定的一个关键const值可能会从开发角度破坏一切。

让我们回想一下Mozilla基金会主要网站上有关Mozjpeg的内容:

Mozjpeg的唯一目的是减少网络上提供的JPEG文件的大小。

据我们所知,每上传一张图片,Instagram就会增加25%的内存使用量!大约每天1亿美元!

至此,Facebook已经修补了该漏洞,因此即使我们还没有完全解决它,我们也停止了利用开发工作。

我们仍然只有3个字节的覆盖,从理论上讲,我们可以投入更多的时间来找到更多有用的原语,以帮助我们利用此错误。但是,我们认为我们已经做了足够的工作,并且已经宣传了我们想要传达的重要观点。

}

我要回帖

更多关于 spaceengine无法启动 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信