操控流程完整性:给我们介绍一种“特殊”的Javascript反剖析技能

写在前面的话 了解歹意软件的实在代码对歹意软件剖析人员来说对错常有优势的,由于这样才干够实在了解歹意软件所要做的工作。但不幸的是,咱们并不总是能够得到“实在”的代码,有时歹意软件剖析...


写在前面的话
了解歹意软件的实在代码对歹意软件剖析人员来说对错常有优势的,由于这样才干够实在了解歹意软件所要做的工作。但不幸的是,咱们并不总是能够得到“实在”的代码,有时歹意软件剖析人员或许需求相似反汇编东西或调试器之类的东西才干“估测”出歹意软件的实在行为。不过,当歹意软件运用的是“解说型言语”开发的话,例如Java、JavaScript、VBS或.NET等等,咱们就有许多种方法来检查它们实在的原始代码了。
不幸的是,进犯者相同知道这些剖析技能,并且为了躲避安全剖析,他们还会选用许多混杂技能来搅扰研究人员的剖析进程。进犯者能够运用反剖析技能来判别歹意代码是否在虚拟机环境中运转,或许让自己的代码只在特定环境中运转以避免调试以及逆向剖析环境(包含反混杂),而今日咱们要评论了便是一种依据JavaScript的新式反逆向剖析技能。
JavaScript正邪对垒
关于进犯者来说,JavaScript现已变成一种十分重要的进犯向量了。它一般用于进犯的Payload感染阶段,它的运用十分多样化,编码方式也不像其他言语那样遭到各种约束,并且简直一切的歹意JavaScript代码都会进行混杂处理。下图显现的是一个通过了混杂处理的JavaScriptPayload样本:

关于歹意软件剖析人员来说,第一步便是要对这种代码进行反混杂处理。从最简略的复制粘贴,到更强大一点的“脚本替换”(触及函数和变量的重命名),研究人员需求想方设法让代码愈加明晰。但是在JavaScript中,咱们能够依据函数名的调用状况来了解函数的运转机制。比如说函数arguments.callee.caller(),在这个函数的协助下,咱们能够创立一个仓库盯梢,并将履行过的函数依照次序存储在列表中。获取到函数名之后,咱们就能够将它们当作密钥来对处理过的JavaScript代码进行动态“解密”了。这项技能能够让咱们得到隐式的操控流完整性,由于假如一个函数被重命名或许函数运转次序发生了改变,那么“成果哈希”肯定是不同的。假如哈希不同,生成的密钥也就不同,这样就能够进行解密并运转通过特别加密的代码了。
为了让我们更清楚地了解我在说什么,请我们看看下面这段没有通过混杂处理的样本代码【检查原始代码】:
var _= require("underscore");
 
function keyCharAt(key, i) {
    return key.charCodeAt( Math.floor(i %key.length) );
  }
 
  function xor_encrypt(key, data) {
    return _.map(data, function(c, i) {
      return c.charCodeAt(0) ^ keyCharAt(key,i);
    });
  }
 
  function xor_decrypt(key, data) {
    return _.map(data, function(c, i) {
      return String.fromCharCode( c ^keyCharAt(key, i) );
    }).join("");
  }
 
 
function cow001(){
eval(xor_decrypt(arguments.callee.name,[0,0,25,67,95,93,6,65,27,95,87,25,68,34,22,92,89,82,10,0,2,67,16,114,12,1,3,85,94,69,67,59,5,89,87,86,6,29,4,16,120,84,17,10,87,17,23,24]));
}
 
function pyth001(){
eval(xor_decrypt(arguments.callee.name,[19,22,3,88,0,1,25,89,66]));
}
 
function pippo(){
pyth001();
}
 
pippo();
代码运转进程中会对“特定内容”进行核算(eval()函数),在代码的第21和25行,函数cow001()和pyth001()会核算XOR后的解密内容。xor_decrypt函数能够接纳两个参数:decoding_key和需求解密的Payload。接下来,代码会运用arguments.callee.name()函数来将内部阶段的每一个函数名当作解密密钥来运用,假如函数名是“原始函数名”(进犯者用来解密Payload的函数名),那么加密后的代码就会正常运转,不会报错。换句话说,假如函数名通过了重命名,那么eval()函数将得到过错的成果,并导致进犯者转化代码运转途径(运用简略的try catch句子)。
在运用JavaScript代码施行进犯之前,进犯者需求开发歹意JavaScript代码并对其进行混杂处理,这样才干准备好所谓的“进犯途径”。代码混杂的进程中,进犯者需求运用额定的脚本(比如说下面这段代码-【检查原始代码】)并依据混杂后的函数名来加密Payload,然后用新加密的Payload替换之前的代码(加密后的Payload便是加密函数名所运用的密钥)。
"use strict"; 
 
var _= require("underscore");
 
function keyCharAt(key, i) {
    return key.charCodeAt( Math.floor(i %key.length) );
  }
 
  function xor_encrypt(key, data) {
    return _.map(data, function(c, i) {
      return c.charCodeAt(0) ^ keyCharAt(key,i);
    });
  }
 
  function xor_decrypt(key, data) {
    return _.map(data, function(c, i) {
      return String.fromCharCode( c ^ keyCharAt(key,i) );
    }).join("");
  }
 
var final_payload = "console.log('Malicious Content Triggers Here !')";
var k_final = "cow001";

[1] [2]  黑客接单网

  • 发表于 2021-04-08 11:48
  • 阅读 ( 193 )
  • 分类:互联网

0 条评论

请先 登录 后评论
腾龙楠哥
腾龙楠哥

642 篇文章

你可能感兴趣的文章

相关问题