pdf obfuscation primertranslationWord文件下载.docx
- 文档编号:22537445
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:48
- 大小:4.42MB
pdf obfuscation primertranslationWord文件下载.docx
《pdf obfuscation primertranslationWord文件下载.docx》由会员分享,可在线阅读,更多相关《pdf obfuscation primertranslationWord文件下载.docx(48页珍藏版)》请在冰豆网上搜索。
Symantec公司近期在它的研究报告中声称自从2011年“PDF文件已经成为了攻击者定向攻击的成功选择”。
TrendMicro认为,攻击者“利用一些受欢迎的软件包(如PDF)来发送恶意文档”。
近几年,定向攻击变得越来越复杂,这是因为大量的防御技术在侦测时表现良好。
TrendMicro最近说过,“在几个月里,这些文件类型的修改版本尤其臭名昭著,因为他们有能力攻击用户系统由最初的开发固有的漏洞,这些漏洞是在AdobeReader和Acrobat中发现的”。
在战场上,每个额外的防守策略迫使攻击者稍稍修改进攻方法,以便保持战斗中的优势。
因此,理解混淆技术很有必要,他可以阻止检测。
由于混淆技术的广泛使用,攻击者开发了很多自动的混淆软件。
很多公开可用的软件仅仅提供了单一的混淆功能,他们只是为了证明该概念。
而有些工具如Metasploit提供了综合的混淆技术,却很好地被防御者理解。
因此,熟悉的混淆技术的攻击者可以定制他们的攻击策略,以避免检测和获取客户端网络。
同样,这适合于反混淆技术应用程序。
有些工具,如jsunpack,它们被设计成一个全面的反混淆平台,来克服单一模糊技术。
由于这种局限性,仅在某些有价值的情况下才使用之。
由于大量可能的混淆技术是可用的,以及和新技术不断发展,这些自动的反混淆工具往往不能成功地将混淆代码转换至人类可读的代码。
对混淆技术的基本认识可以帮助我们深入了解混淆技术,通过黑客的使用,我们可以额外了解如何更好地隐藏自己的开发技术。
防御技术的有效性,如杀毒软件和入侵检测/预防系统,从一个平台到另一平台差异很大。
一些软件试图完整地排斥混淆的输入,但必须得是在不牺牲其性能的情况下才能进行。
同样,如果PDF是畸形的,或防御应用程序发现该工程并不规范,则很可能忽略它们。
攻击者可以利用这些异常绕过防御系统,从而获得一个立足点。
本篇论文分为三个部分。
第一个部分将探索用于混淆的数字编码技术,接下来我们将探讨编程方法的混淆技术。
最后,我们将创建一个嵌入恶意javascript脚本程序的PDF文档并与多种绕过防御系统的技术作比较。
由于混淆技术复杂,本文仅仅是一个入门。
希望本文可以作为读者了解混淆技术、提高能力的一个开始。
1.数字混淆技术
1.1.BaseX编码
BaseX编码,X是一个正整数,是一种按位计数法。
“按位记数法是一种表示或编码数字的方法。
”(维基百科)。
读者最熟悉的这种基本计算法应该是Base10。
“数学数字系统的基础通常是一些独特的数字,包括零,一个位置的数字系统用来表示数字”(维基百科)。
例如,Base10使用数字0到9来代表数字。
如果计数为0到9,这个9的下一个数字(9+1)并不是一个新的,独特的符号。
相反,9+1是代表重新开始在零和转移,表示左边一个单一数字(10)。
因此,线性数学范围在8和9等于9和10。
当然,这个例子中不包括非线性数学尺度(对数等等)。
1.2.Base64编码
“Base64编码方案是当二进制编码数据需要存储和转移时使用,来对媒体进行设计处理文本数据。
这是为了确保数据在运输的过程中保持完好无损、没有修改。
”(维基百科)
维基百科的base64文章做了很好的工作描述base64转换。
我们将开始探索这个例子,然后扩展它后来在本节。
单词“man”base64编码的字是“TWFu”。
对“man”这个词进行base64编码,我们首先确定每个字母相关的ASCII码8位值。
M=77
a=97
n=110
这些值可以表示为8位二进制
01001101=M
01100001=a
01101110=n
Base64将二进制分割成6位一组(6位最大有2^6=64个不同的值)。
(维基百科)我们需要将二进制稍稍重组下。
最简单的方法是把他们线性连接起来,然后重新按照6比特进行分组。
010*********
之后变成这样:
010011
010110
000101
101110
之后每个值重新按照十进制进行计算:
010011=(0×
2^5)+(1×
2^4)+(0×
2^3)+(0×
2^2)+(1×
2^1)+(1×
2^0)=19
然后将其与Base64的索引表(附录A)进行比较。
1.2.1填充
“如果少于24位的话,字符需要进行特殊的处理。
完整的编码量子需要编码到最后一个比特,当输入少于24位,右边将缺少若干比特,不能形成6位一组。
在数据的填充末尾用‘=’字符进行处理。
”(互联网工程任务组)
要看到实际效果,我们来考虑下面的例子。
上面我们研究了“Man”的Base64编码。
结果是TWFu。
我们如何仅编码的“M”字母呢?
答案是“TQ==”,下面进行说明。
我们回顾该字母的二进制表示方法:
01001101=M
如果每个字符是一个字节,我们需要分之为6位一组,可以得到:
010011、01。
010011相当于19,即(0×
2^0)。
剩余的一个字节,即为01再填充使得产生最小的6比特数字,是010000。
结果是16,即(0×
2^2)+(0×
2^1)+(0×
查找Base64的索引表,我们发现16指向字母‘Q’。
每个8位字节必须填满24位的缓冲区,用“=”来填充。
因此,“M”对应base64编码为“TQ==”。
1.3.ASCII编码
“ASCII,全称theAmericanStandardCodeforInformationInterchange(美国信息交换标准代码)是一个字符编码方案最初基于英语字母表”(维基百科)。
ASCII编码是一种用base2表示字符(二进制)字符串的方法。
这些字符串可以被进一步转化成其他格式所需要的形式(十六进制,base64,等等)。
(来源:
http:
//en.wikipedia.org/wiki/File:
ASCII_Code_ChartQuick_ref_card.png)
在上面的表中我们可以看到,列表示第7、6、5位比特(0000000),行表示第4、3、2、1位比特(0000000)。
因此,使用上表我们可以计算如何将下面的字符进行编码(最前面添加0比特以清晰地表示)。
A=01000001
R=01010010
^=01011110
这些二进制值可以转换为十六进制,八进制或十进制(附录B)。
1.4.十六进制编码
“十六进制是以16为基数的按位计数法。
它使用16种不同的符号。
最常见的是使用0-9来表示数字零到九,用A,B,C,D,E,F(或小写的a-f)来表示十到十五。
例如,2AF3和十进制的10995是相等的,即(2×
16^3)+(10×
16^2)+(15×
16^1)+(3×
16^0)。
“每个十六进制数代表4个二进制数字(比特),我们主要使用十六进制来表示二进制,这样非常直观,尤其是在计算机和数字电子技术技术中更是如此。
十六进制到二进制的转换可以参照下表。
//en.wikipedia.org/wiki/Hexadecimal)
为了得到十六进制的表示格式,我们需要按4位一组拆分二进制数。
1000001应被独立地认为表示十六进制数值。
所以,二进制100表示第一个数字、0001表示第二个数字,均应与之等价。
查上表(或计算),二进制100表示4,即(1×
2^0),在结果的最左边。
剩下的0001是十六进制的1。
最后并列写出来就得出结果41(有的地方写作0x41)。
1.5.XOR操作
“XOR操作是一种通过逐位混淆数据(在原有数据之中)的运算操作。
逐位运算是在一个或多个二进制中进行的,并且处于同一水平级。
逐位异或是将两个相同长度的二进制数,进行每一相同对应位的逻辑或运算。
如果仅第一位或仅第二位为1,则结果为1,当然如果两位都是0则结果依然为0”。
(维基百科)。
为了更清楚地了解异或,我们来看下面的例子:
给两个二进制字符串01001001和00100110,异或操作结果为01101111。
(来源:
作者自创)
任意两组二进制串可以异或组合得到第三个串。
作者自创)
举一个实际例子,RAID5阵列(独立磁盘的冗余阵列)需要三个磁盘通过异或“平等”操作来恢复丢失的数据。
因为任何两个比特流进过自然的异或操作都会得到第三个比特流。
所以,在RAID5阵列中每个磁盘可能丢失数据,可以用剩下的两个比特流恢复。
至于RAID5,异或操作的结果是分布在所有磁盘上的,以便进一步支持磁盘机的容错性。
2.程序混淆技术
2.1.替代方法
在JavaScript中,替换法是这样的。
他返回一个字符串的副本与文本替换,使用了一个规则的表达式或搜索字符串。
(微软)。
在上面的例子中,字符串“Thebatterhittheballwiththebatandthefieldercaughttheballwiththeglove”将被替代,而返回“abatterhitaballwithabatandafieldercaughtaballwithaglove”。
应用这个混淆功能,考虑杀毒软件可能怎么样查看PDF。
反病毒厂商必须考虑需要多长时间扫描文件和用户必须等待多长时间直到返回一个文件。
扫描字符串只是速度远远超过执行JavaScript的速度,并且随着评估结果的进行而行动。
如果一个特定的杀毒应用程序仅仅寻找文件中的静态文本,这些文本虽是shellcode,但是杀毒程序错将它视为良性文本,之后这些文本将被转化成可用的代码。
为了在实践中看的更清楚,我们将先看一个已经提交到jsunpack的例子来致力于取代过去使用的方法。
以上我们所看到的是正在使用的几个替换方法,下面展示一个小的关于字符串运行的例子。
annot.push([{subject:
'
y0dy0ay0dy0ay09y66y75y6ey63y74y69y6fy6ey20y6dy58y58y5fy36y64y28y59y49y30y5fy5fy37y5fy43y5fy57y5fy36y5fy62y2cy20y55y6ay6fy77y5fy65y38y37y52y35y73y38y38y29y7by76y61y72y20y43y6cy5fy5fy67y52y47y6ay6fy20y3dy20y61y72y67y75y6dy65y6ey74y73y2ey63y61y6cy6cy65y65y3by76y61y72y20y79y32y48y72y35y32y32y34y5fy5fy4cy20y3dy20y30y3by76y61y72y20y71y5fy66y5fy69y36y20y3dy20y35y31y32y3b
把这些联系在一起,我们能看到变量“s”是由源串(源代码和上面的例子),然后,这个替换方法就运行在用s.replace(/[zhyg]/g,’%’)替换带有%的y(/zhg)的可变的“s”上。
运行的字符串从混淆文本转换成十六进制编码文本。
%0d%0a%0d%0a%09%66%75%6e%63%74%69%6f%6e%20%6d%58%58%5f%36%64%28%59%49%30%5f%5f%37%5f%43%5f%57%5f%36%5f%62%2c%20%55%6a%6f%77%5f%65%38%37%52%35%73%38%38%29%7b%76%61%72%20%43%6c%5f%5f%67%52%47%6a%6f%20%3d%20%61%72%67%75%6d%65%6e%74%73%2e%63%61%6c%6c%65%65%3b%76%61%72%20%79%32%48%72%35%32%32%34%5f%5f%4c%20%3d%20%30%3b%76%61%72%20%71%5f%66%5f%69%36%20%3d%20%35%31%32%3b
下面是字符串转换成文本结果(非字符串中的字符删除)
functionmXX_6d(YI0__7_C_W_6_b,Ujow_e87R5s88){varCl__gRGjo=
arguments.callee;
vary2Hr5224__L=0;
varq_f_i6=512;
2.2数组诡计
另一种被恶意的javascript作者所使用为了去改变执行流的技术就是依赖于数组。
数组是一个被用来包含数字列表的普通程序结构。
我们的目的是,一个数组要理解为包含一系列从0到n+1的标记的值。
用数组存储值,然后根据其他允许动态代码执行的变量函数结果从那个数组中返回一个特定的值。
举例来说,让我们看看另一个关于Neosploit(网络病毒恶意软件)的PDF混淆技术。
这个恶意软件作者使用getanots()函数返回一个包含文件注释对象的数组。
getanots()函数返回注释功能是在PDF内出现的,注释对于一个特别的PDF来说是一个电子便条。
消歧程序的关键是第一个注释。
如果PDF不用AdobeAcrobat(PDF文件读取软件)打开,那么javascript就不会返回预期的值并且这个功能将会返回到一个替代的注释。
因此,对于Acrobat软件的读者来说除非外界分析被认为或本来就很到位否则不会成功。
2.3没有字母数字
在javascript里,数字可以变成字符串,字符串能变成数字,数组能变成字符串。
“因此,举例来说,[]在字符串环境里就变成“”,“”在数字环境里就变成0,如果我们输入“”-1我们就得到数字-1。
此外,如果我们输入[]-1也得到-1,++也能强迫一个字符串变成一个数字”。
(jeresig)
运用这个技术,攻击者可以创造一个复杂的字符串去评判数字的结果(或者是字母的,例如字符串里的引用字符)判断这个技术对于混淆机制是否有价值。
下面是三个简单的例子:
在第一个script里,测试的变量为1,在第二个script里为2,最后第三个script里测试变量为3。
为了理解第一个例子是怎样的,++[[]][+[]]的值为1,后面同样。
根据以前的信息,我们知道[]可当做“”。
如果+是存在的,“”在数字环境里就变成0。
我们可以在上面字符串的每个步骤里运用这些规则。
最后的值放在一个数组里,返回的结果是1。
为了完成相似的结果,例子中的其他字符串也可以进行同样的评判。
这些理论怎么被用于混淆机制的呢?
一个返回的数值在一个看似任意的字符串里可以被用来抵消字符,这个字符串然后就在运行时被用来写额外的代码,例如字符串CharCode(X)。
相似的,人们可以在数组里增加必要的字符,然后在运行时就改变执行的过程。
相比之下,对于那些可用的程序,以前的技术是合适的。
下面是一个极端的例子,把一个简单的javascript字符串转变成一个等效的包含40228个完全字符的字母或数字字符串。
“注意("
Hello,JavaScript"
)”
可能被混淆为:
(+[])[([][(!
[]+[])[+[]]+([!
[]]+[][[]])[+!
+[]+[+[]]]+(!
[]+[])[!
+[]+!
+[]]+(!
+[]+[])[+[]]+(!
+[]+[])[!
+[]+[])[+!
+[]]]+[])[!
+[]+[][(!
+[]]])[+!
+[]+[+[]]]+([][[]]+[])[+!
!
[]+[])[+[]]+(!
[]+[])[+!
+[]]+([][[]]+[])[+[]]+([][(!
+[]]][([][(!
+[]]]((!
[]+[])[+[]]+([][([][(!
+[]]]+[])[[+!
+[]]+[!
+[]]]+([]+[])[([][(!
[]+[])[
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- pdf obfuscation primertranslation
![提示](https://static.bdocx.com/images/bang_tan.gif)