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

访客5年前黑客资讯1040


写在前面的话
了解歹意软件的实在代码对歹意软件剖析人员来说对错常有优势的,由于这样才干够实在了解歹意软件所要做的工作。但不幸的是,咱们并不总是能够得到“实在”的代码,有时歹意软件剖析人员或许需求相似反汇编东西或调试器之类的东西才干“估测”出歹意软件的实在行为。不过,当歹意软件运用的是“解说型言语”开发的话,例如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]  黑客接单网

相关文章

子域名收集思路与技巧整理

前语 本文合适Web安全爱好者,其中会说到8种思路,7个东西和还有1个小程序,看本文前需求了解相关的Web基础知识、子域名相关概念和Python 程序的基础知识。 感谢我的老友龙哥的技巧大放送以及Or...

运用Burp的intruder功用测验有csrf维护的应用程序

许多Web运用会有避免跨站恳求假造的战略,比方经过request恳求传一个当时页面有用或许当时会话有用的参数(假如他们没有,那就很值得研讨)。这些参数用来证明这个恳求是从预订用户宣布的,而不是进犯者那...

高手对决 -- 博客服务器被黑的故事

  每一个高手在生长路上, 都需要与墙作足够的对立. 要么你成功, 站在国际之颠, 然后纵情罗致到尖端的常识; 或许或被它打趴下, 成为芸芸众生中的一人, 然后对它习以为常. 我也不破例. 前不久,...

根据时延的盲道研讨:受限环境下的内容回传信道

在一次缝隙赏金活动中,挖到个指令注入的洞,我先以时延作为证明向厂商提交该缝隙,厂商以国内网络环境差为由(确实得翻墙)拒收,几回交流,奉告若我能取回指定文件 secret.txt 才认可。方针是个受限环...

进犯检测和防备办法之日志剖析

1.  导言 针对linux服务器进犯首要包含溢出提权进犯、端口扫描、后门程序植入等进犯手法,而针对web运用程序的进犯则掩盖愈加广泛,包含SQL注入、XSS、指令履行、文件包含、木马上传等缝隙。本文...

记载一次使用事务规划缺点缝隙的精彩实战测验

前语 前次的那篇文章《一名代码审计新手的实战阅历与感悟》得到了不少读者的支撑,也得到了FreeBuf这个渠道的必定,这给了我这个菜的不能再菜的小菜鸟很大的决心。可是,不足之处仍是许多,比方文章中呈现的...