二进制明文字符串加密:还原与反还原

news/2024/5/18 22:39:05/文章来源:https://blog.csdn.net/Joliph/article/details/133983549

背景

上一篇文章中介绍了xorstr的原理和最小化验证概念的代码,这篇文章来看下这种已经被广泛应用于各恶意样本以及安全组件中的技术如何还原,如果还没看上篇建议先看下了解其实现后再看本篇文章

xorstr的现状

随着相关技术的应用越来越广,各种攻击样本都用上了这一工具,威胁样本分析变得越来越耗时。这就是为什么需要一个对抗上述混淆技术的还原工具的原因,两个开源的还原工具flare-floss和AntiXorstr,工具的应用让这种二进制隐藏的字符串还原难度大幅降低

还原方案分析

flare-floss是mandiant公司开发并开源出来的针对病毒分析的自动化二进制字符串启发式查找工具,针对此类加密方式flare-floss提供了两种还原逻辑(stack string & tight string),两者基于不同的假设,但都可以用来处理上述加密,下面给出他的实现原理的简要分析摘要

stack string:flare-floss的这种还原方式基于一种非常宽的假设,即这种字符串必须基于栈,在栈上构造并解密。所以他使用模拟执行的方式对每个函数逐汇编代码的进行模拟执行,并在遇到函数调用指令时对当前栈进行全dump,最后使用字符串明文算法在dump中查找疑似的明文字符串,保存结果。

由于其假设过宽,致使其几乎拥有对当前开源的xorstr类似项目拥有100%的覆盖率,但过宽的假设导致大量的误报,对安全分析来说过多的垃圾信息反而干扰了正确的判断,这个误报在其代码中特别标注为“don’t run this on functions with tight loops as this will likely result in FPs”

floss-stack stringfloss-stack string
覆盖率优+
绕过难度优+
误报率差-
精确性差-

tight string:而flare-floss为了解决上述解决方案过宽假设带来的大量False Postive的问题,在去年更新了floss2加入tight string还原模式,这种模式基于这样的假设:存在栈加密字符串的函数存在一个循环Block块,这个Block块出去时栈为解密状态,也即他瞄准的时上述代码中的decrypt内联函数部分,decrypt中的for循环结构即为tight string关注的循环Block,而他也从每个函数调用转为每个循环block出口时对函数栈进行dump并搜索明文字符串

floss-tight stringfloss-tight string
覆盖率优-
绕过难度中+
误报率中+
精确性差-

AntiXorstr:去年写这个工具的时候并没有关注到floss项目因此实现的逻辑和他完全不同。区别于tightstring对decrypt特征的关注,该工具关注的是类构造函数。基于这样的假设:“栈加密字符串的加密数值必须是编译期计算出来的”。工具会对函数的栈进行预分析,并对栈进行立即数染色,被非0立即数染色过的联通区域标记为高可疑区域,并在后续的模拟执行过程中关注此类区域的读写并输出结果

AntiXorstrAntiXorstr
覆盖率中+
绕过难度优-
误报率优+
精确性优+

tight string的绕过

在对floss的tight string逻辑分析的过程中发现他的假设实际上并非是栈字符串的必须的,但确实是当前几乎所有开源的实现一定会存在的特征,即解密函数流程图中表现为环的形式。所以对floss-tight string的绕过即实现一个不会成环的字符串解密函数。首先我们先看下当前常规字符串的解密逻辑的反汇编流程图特征,demo如下

在这里插入图片描述

这里的loc_1400010A0即为一个循环的Block,Block中的代码就是for循环中解密原始数据的decrypt函数的汇编码。这里让decrypt函数内部不生成循环即可实现对此还原方式的绕过,那么如何消环呢?这里用模板编程的思路去考虑一下,可以把循环使用模板递归展开的方式在编译期给消除掉,最终需要的效果如下

__forceinline char* decrypt()
{for (auto index = 0; index < N; index++){encBuffer[index] -= 1;}return encBuffer;
}//N = 5
__forceinline char* decrypt_noloop()
{encBuffer[0] -= 1;encBuffer[1] -= 1;encBuffer[2] -= 1;encBuffer[3] -= 1;encBuffer[4] -= 1;return encBuffer;
}

剩下就是如何使用C++模板生成decrypt_noloop代码,使用递归展开的方式生成并对N=0做个特化终止即可消除loop环,并且还有一些细节这里限于篇幅不做展开,实现DEMO已开源:xorstr_s.h

测试demo

void test()
{printf(Enc("Samsung\n"));wprintf(Enc(L"Apple\n"));printf(Enc("Xiaomi\n"));wprintf(Enc(L"Oppo Group\n"));printf(Enc("vivo\n"));wprintf(Enc(L"Transsion\n"));std::cout << Enc("Honor") << std::endl;std::wcout << Enc(L"Realme") << std::endl;std::cout << Enc("Motorola") << std::endl;std::wcout << Enc(L"Huawei") << std::endl;std::cout << Enc("Others") << std::endl;
}

测试结果:STACK & TIGHT 绕过,DECODED模式还原出一部分

 ─────────────────────FLOSS STACK STRINGS──────────────────────────────────────────FLOSS TIGHT STRINGS────────────────────────────────────────────FLOSS DECODED STRINGS───────────────────────
Samsung
Apple
Xiaomi
Oppo Group
vivo
Transsion
Honor

更鲁棒的绕过策略

上述通过详细分析floss还原策略写的xorstr_s似乎显得不是很鲁棒,仅仅针对一个开源的工具去实现定制化的绕过方案显得成本过高,那么是否有更鲁棒的反还原方式呢,暂时有两种方式,其中一种的核心原理是:”基于堆的明文展开“,使得Floss这样对堆明文做监控的模式彻底失效。

读过上一篇文章的应该可以知道栈中保存了字符串密文,但并不是一定要就地解密,完全可以对栈数据只读而解密后的明文写入堆中,并利用临时对象的析构函数完成堆的释放即可。实现DEMO已开源:xorstr_h.h,测试FLOSS的效果如下

FLOSS STACK STRINGS─────────────────────
o]QOIR[6<
}<L<L<P<Y<6<<<
dU]SQU6<
s<L<L<S<
<{<N<S<I<L<6<<<
JUJS6
h<N<]<R<O<O<U<S<R<6<<<
tSRSN
n<Y<]<P<Q<Y<<<
qSHSNSP]<
t<I<]<K<Y<U<<<
sHTYNO<─────────────────────FLOSS TIGHT STRINGS────────────────────────────────────────────FLOSS DECODED STRINGS───────────────────────
o]QOIR[6<

测试结果:Floss所有模式下的绕过

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_376423.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于RuoYi-Flowable-Plus的若依ruoyi-nbcio支持多实例自定义条件的流程流转

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 1、前端代码&#xff0c;主要修改下面这个文件&#xff0c;如下&#xff1a; 说明几点&#xff1a; 1.1 …

Python Opencv实践 - 车辆统计(2)检测线绘制,车辆数量计数和显示

针对我所使用的视频&#xff0c;对上一节的代码进行了修改&#xff0c;增加了更多参数。 Python Opencv实践 - 车辆统计&#xff08;1&#xff09;读取视频&#xff0c;移除背景&#xff0c;做预处理_亦枫Leonlew的博客-CSDN博客示例中的图像的腐蚀、膨胀和闭运算等需要根据具…

微机原理与接口技术-第七章输入输出接口

文章目录 I/O接口概述I/O接口的典型结构基本功能 I/O端口的编址独立编址统一编址 输入输出指令I/O寻址方式I/O数据传输量I/O保护 16位DOS应用程序DOS平台的源程序框架DOS功能调用 无条件传送和查询传送无条件传送三态缓冲器锁存器接口电路 查询传送查询输入端口查询输出端口 中…

err -110 while initial SD card failed enmmm否系解决方案

1.情况表述 之前把 sd卡从小容量换成了大容量 且运行正常 过了一两个月 发现启动失败 报错&#xff1a;mmc0: error -110 whilst initialising SD card 给出报错图片 2.相关解决方案 给出链接 讲的很有道理&#xff0c;但是 我在bash中没有找到对应内核的驱动文件 SD卡…

【JavaScript】JavaScript基础详解(文末送书)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

Java 线程池调度周期性任务“异常“探究

背景 在做性能监控需求的过程中&#xff0c;会存在很多监控任务需要定时执行。比如在卡顿监控的实现中&#xff0c;我们需要每50ms 执行一次主线程调用栈的任务&#xff0c;此时由于任务本身可能存在一些耗时&#xff0c;可能需要对任务下次调度的时间做一些调整&#xff0c;避…

有没有人声和背景音乐分离的神器?

做视频剪辑&#xff0c;二次创作的朋友&#xff0c;需要去除视频中的背景音乐&#xff0c;保留人声&#xff1b;或者去除人声&#xff0c;保留背景音乐。随着用户需求的增多&#xff0c;科技的发展&#xff0c;让我们能通过智能的人声分离软件来实现&#xff0c;下面就来看看如…

XPS的锂电池表征技巧-科学指南针

XPS作为一种表面表征手段&#xff0c;这是它一个很大的限制&#xff0c;同时也是它一个很大的优势&#xff0c;正所谓“其术专则其艺必精”。限于笔者专业背景&#xff0c;此次主要讲述XPS在锂离子电池中的应用。 而由于XPS测试是一种表面分析手段&#xff0c;故其在锂离子电池…

Qt中QFile、QByteArray QDataStream和QTextStream区别及示例

在Qt中&#xff0c;QFile、QByteArray、QDataStream和QTextStream是常用的文件和数据处理类。 主要功能和区别 QFile&#xff1a; QFile是用于读写文本和二进制文件以及资源的I/O设备。可以单独使用QFile&#xff0c;或者更方便地与QTextStream或QDataStream一起使用。 通常在…

最新2023版完美可用的聚合支付系统源码,全开源无后门,适合二开

最新2023版完美可用的聚合易支付系统源码&#xff0c;全开源无后门&#xff0c;真正安全可用。 更新日志&#xff1a; 1.新增微信公众号消息提醒功能 2.重构转账付款功能&#xff0c;支持通过插件扩展 3.商户后台新增代付功能 4.后台新增付款记录列表 5.支付宝插件新增预…

嵌入式养成计划-46----QT--简易版网络聊天室实现--QT如何连接数据库

一百一十九、简易版网络聊天室实现 119.1 QT实现连接TCP协议 119.1.1 基于TCP的通信流程 119.1.2 QT中实现服务器过程 使用QTcpServer实例化一个服务器对象设置监听状态&#xff0c;通过listen()函数&#xff0c;可以监听特定的主机&#xff0c;也可以监听所有客户端&#x…

C++23:多维视图(std::mdspan)

C23&#xff1a;多维视图&#xff08;std::mdspan&#xff09; 介绍 在 C23 中&#xff0c;std::mdspan 是一个非拥有的多维视图&#xff0c;用于表示连续对象序列。这个连续对象序列可以是一个简单的 C 数组、带有大小的指针、std::array、std::vector 或 std::string。 这…

外汇天眼:如何快速玩转外汇市场?这个技巧你必须知道!

在外汇市场中&#xff0c;决定交易成功与否的关键在于投资者的技能和知识扎不扎实&#xff0c;这对投资者获取利润至关重要。然而对于投资者来说&#xff0c;外汇交易市场又是一个复杂且多变的市场&#xff0c;要在外汇市场中获得成功并不容易&#xff0c;需要深入地了解、不断…

部署Vue项目到githubPage中

上传Vue项目到githubPage 例如: 看我发布的地址 前提条件 1. github上有一个仓库并且仓库下有两个分支(main 和 gh-pages) 1.1 main分支保存你的vue项目源码(react或者其他框架的都行) 1.2 gh-pages分支保存的是你项目打包之后的代码(如Vue项目打包完之后是个dist包,…

【Javascrpt】比较,逻辑运算符

目录 比较运算符 逻辑运算符 &&(与&#xff09; ||&#xff08;或&#xff09; 两真&#xff08;||左侧为真&#xff0c;||右侧为真&#xff09; 两假&#xff08;||左侧为假&#xff0c;右侧为假&#xff09; 一真一假&#xff08;||一侧为假&#xff0c;另一侧为…

数据集的特征提取

1、 特征提取 1.1、 将任意数据&#xff08;如文本或图像&#xff09;转换为可用于机器学习的数字特征 注&#xff1a;特征值化是为了计算机更好的去理解数据 字典特征提取(特征离散化)文本特征提取图像特征提取&#xff08;深度学习将介绍&#xff09; 2 特征提取API sklear…

物联网AI MicroPython传感器学习 之 GC7219点阵屏驱动模块

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 一、产品简介 LED-8 * 32点阵屏显示板由 4 块单色 8x8 共阴红色点阵单元组成&#xff0c;通过 SPI 菊花链模式将多块显示屏连接后可以组成更大的分辨率显示屏幕&#xff0c;任意组合分辨率。可用于简单仪表显…

1、VMware虚拟机及网络配置

一、VMware虚拟网络编辑器 1、选择NAT模式并配置子网 2、进入NAT设置&#xff0c;配置网关 3、宿主机网络适配器设置 二、创建虚拟机 在这里插入图片描述 三、开启虚拟机&#xff0c;安装操作系统 在该网段内配置静态ip&#xff0c;指定网关为前面NAT配置的网关地址…

Java8 BiConsumer<T, U> 函数接口浅析分享(含示例,来戳!)

文章目录 Java8 BiConsumer<T, U> 函数接口浅析分享&#xff08;含示例&#xff0c;来戳&#xff01;&#xff09;源码accept 方法示例示例一示例二 andThen 方法示例示例一示例二 示例相关代码类dohandler 方法student.javaStudentScore.javaStudentScoreDto.java Java8…

运行报错(三)git bash报错fatal: detected dubious ownership in repository at

报错现象 在运行git 命令时&#xff0c;出现报错 “fatal: detected dubious ownership in repository at” 报错原因 文件夹的所有者和现在的用户不一致 栗子&#xff1a; 文件夹的所有者是root&#xff0c;而当前用户是admin 解决方案 方法一、 将文件夹的所有者替换成ad…