能力值:
( LV2,RANK:10 )
|
-
-
2 楼
原则上对于一段指定的二进制数据是无法判断是否是可执行的机器码。
如你所述,对于123。。等这样数据,机器都会尝试着逐条解析为指令进行执行。。无非就是能不能解析出来,或者说解析出来后的指令是否有效的问题,但无法区分一般数据和机器码。
|
能力值:
( LV8,RANK:120 )
|
-
-
3 楼
如果能区分数据和代码,还会有那么多漏洞吗
|
能力值:
( LV3,RANK:20 )
|
-
-
4 楼
额,最近在写论文,想从学术角度区分出代码来,比如检测网络数据包中的恶意代码?
正因为冯诺依曼当初没有区分数据和代码,所以我的研究才有意义呀。
能找着个差不多的算法就行,准确率90%就ok了,做学术没有100%的事情,吼吼~
|
能力值:
( LV13,RANK:530 )
|
-
-
5 楼
machine learning?
|
能力值:
( LV4,RANK:50 )
|
-
-
6 楼
A)提取feature
1、反汇编二进制数据为指令序列
2、提取频度信息。 add指令的比例,mov的比例,间接寻址的比例、寄存器使用频度等等维度的信息。
3、将 2种得到的feature,归一化到0.0~1.0区间,得到一个vector
B)采集模板样本集合
1、从现实世界中(各种可执行文件)使用A方法提取样本,得到样本集合R.
2、如果R是简单集合(比如都是从PE入口点提取指令),则可以计算出R的中心点(或者有几个中心点,即编译器特征)。如果R有明显的多个聚簇,则使用自动聚合方法寻找中心点。
3、2中得到的中心点集合,暂称为X,即为模板样本集合
C)判定
对待判断的二进制数据Y,提取feature,得到vector a,计算 a 与 X 中每个点的距离(d1,d2,d3,d4,...dn),如果d1~dn中存在小阀值的数,则认为Y是指令。具体匹配精度,由阀值据诶的那个
|
能力值:
( LV4,RANK:50 )
|
-
-
7 楼
具体处理方法有很多,思路想通,其上仅为距离。实际应用有各种实际问题要处理,但写paper应该够了
|
能力值:
( LV4,RANK:50 )
|
-
-
8 楼
再说一种更简单直接的处理思路,我没试过,不过应该只对稍微大点的数据块有用
A、对二进制数据提取feature
反汇编二进制数据,提取每种机器码的前缀的出现频度,得到vector a。
需要对指令翻译有些认识,不需要处理所有可能的机器码的前缀,大部分即可。对于X86指令:单字节指令/单字节扩展指令的第一个字节,双字节指令/双字节扩展指令的前两个字节,三字节指令的前3个字节。
判定方法:
对待判定的数据,按照A方法提取得到vector a,把a当成数据,计算信息熵值。对于指令数据(有意义序列)熵值应该偏低,对于非指令数据,熵值应该偏高。
这种方法,对于那些XOR之类的单表替换加密,是直接无视的。
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
能找着个差不多的算法你的研究就有意义了吗?
|
能力值:
( LV5,RANK:60 )
|
-
-
10 楼
@whtyy 涛哥爱玩高科技
|
|
|