【总结】对大量函数进行trace调用流程+国际AIS3题

现在混淆的主要目的之一就有让逆向分析人员不清楚函数的调用流程,给你一堆函数,加了高强度的OLLVM,更不能看了。那么Trace跟踪技术就显得很重要的,如果清楚了函数调用流程,那么逐个分析,距离成功不就很快了。

万事开头难,逆向程序难在不知道从哪开始。

前几天做了一道AIS3的题目,内含50个加密函数,加密的流程很简单,关键是对这50个加密函数进行了ollvm控制流平坦化魔改(去除也很简单),主要是想抛砖引玉,锻炼和练习trace的技术。这样在以后遇到高强度的混淆干扰也能有一战的能力。

题目附件如下:

[stateful]

本文的重点在于总结trace技巧,题目本身不算很难。

分析

打开题目,进入main函数

图片

{width="5.75in" height="3.4270833333333335in"}

发现逻辑不是很难,进入state_machine函数

好家伙,一大坨

图片

{width="5.75in" height="3.4166666666666665in"}

尝试使用OBPO插件去除,发现直接卡死。使用D810也是卡死。

更高级的玩法使用Unicorn进行去除,类似deflat

本文的重点是在不去除平坦化的前提下去trace函数调用流程

图片

{width="5.75in" height="3.09375in"}

发现有50多个state函数,并且每个函数的功能很简单,我们的目的是:

trace每一个函数,并在梳理调用流程的过程中,输出关键的加密流程,从而写出解密流程

注意调试的时候,记得传入参数

图片

{width="5.75in" height="2.4895833333333335in"}

Trace

方法一:手动trace

最简单粗暴的方法,对每一个state函数下断点,然后运行程序,逐一拿到调用流程。

如果函数过多,这种方法就不太行了

图片

{width="5.75in" height="2.1770833333333335in"}

最终笔者运行拿到了调用的流程


 a1[14] += a1[35] + a1[8];a1[9] -= a1[2] + a1[22];*a1 -= a1[18] + a1[31];a1[2] += a1[11] + a1[8];a1[6] += a1[10] + a1[41];a1[14] -= a1[32] + a1[6];a1[16] += a1[25] + a1[11];a1[31] += a1[34] + a1[16];a1[9] += a1[11] + a1[3];a1[17] += *a1 + a1[7];a1[5] += a1[40] + a1[4];a1[37] -= a1[29] + a1[3];a1[23] += a1[7] + a1[34];a1[39] -= a1[25] + a1[38];a1[27] += a1[18] + a1[20];a1[20] += a1[19] + a1[24];a1[15] += a1[22] + a1[10];a1[30] -= a1[33] + a1[8];a1[1] -= a1[29] + a1[13];a1[19] += a1[10] + a1[16];*a1 += a1[33] + a1[16];a1[36] += a1[11] + a1[15];a1[24] += a1[20] + a1[5];a1[7] += a1[21] + *a1;a1[1] += a1[15] + a1[6];a1[30] -= a1[13] + a1[2];a1[1] += a1[16] + a1[40];a1[31] += a1[1] + a1[16];a1[32] += a1[5] + a1[25];a1[13] += a1[25] + a1[28];a1[7] += a1[10] + *a1;a1[21] += a1[34] + a1[15];a1[21] -= a1[13] + a1[42];a1[18] += a1[29] + a1[15];a1[4] += a1[7] + a1[25];*a1 += a1[28] + a1[31];a1[2] += a1[34] + a1[25];a1[13] += a1[26] + a1[8];a1[41] -= a1[3] + a1[34];a1[37] += a1[27] + a1[18];a1[4] += a1[27] + a1[25];a1[23] += a1[30] + a1[39];a1[18] += a1[26] + a1[31];a1[10] -= a1[12] + a1[22];a1[4] += a1[6] + a1[22];a1[37] += a1[12] + a1[16];a1[15] += a1[40] + a1[8];a1[17] += a1[38] + a1[24];a1[8] += a1[14] + a1[16];a1[5] += a1[37] + a1[20];

其实手都快残了

方法二:IDA-trace

程序动态调试的时候才可以使用trace功能

图片

{width="5.75in" height="2.40625in"}

图片

{width="5.75in" height="2.8854166666666665in"}

IDA自动进行trace跟踪,然后稍等片刻

图片

{width="5.75in" height="2.6041666666666665in"}

可以发现成功的trace了调用了流程

图片

{width="5.75in" height="2.4375in"}

但是有一点不方便的是,有了调用流程,但是我们还要进入每一个函数,提取加密的流程才行。

IDA快捷键Ctrl+F5可以导出整个程序的伪代码

然后进一步提取和分析

图片

{width="5.75in" height="3.6875in"}

这里可以使用IDA-python自动下断点


  Goimport idcbpt_addr = 0x5599F331ADA7bpt_size=1idaapi.add_bpt(bpt_addr,bpt_size)print("Final")

当然还不够,我们要达到的效果是,触发断点然后输出相关加密信息到output函数窗口,就是有断点回调函数


  import idaapi# 定义回调函数def my_bpt_callback(bptno):print("Breakpoint %d hit!" % bptno)# 添加断点bpt_addr = 0x5599F331ADA7bpt_size=1bpt = idaapi.add_bpt(bpt_addr,bpt_size)# 设置断点回调idaapi.add_bpt_chngev_cnd(bpt, idaapi.BPT_EXEC, my_bpt_callback)#设置执行断点-----------------------------------------------------------------------idaapi.BPT_EXEC 表示执行事件

方法三:trace_natives

https://github.com/Pr0214/trace_natives

按照说明,进行输出,发现是这样的效果(IDA中,Edit-Plugins-traceNatives)

图片

{width="5.75in" height="1.125in"}

解密

有了调用流程,剩下的就很简单了


 #define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <iostream>int main() {unsigned char a1[] ={0x0F, 0x77, 0xEC, 0x33, 0x44, 0x16, 0x13, 0x59, 0x1D, 0x42,0x84, 0x75, 0x5F, 0xE4, 0x83, 0xC0, 0x3B, 0xC1, 0x95, 0xCF,0xDB, 0x33, 0x6C, 0xD2, 0xED, 0x72, 0x5F, 0x0D, 0x74, 0x41,0x5B, 0x73, 0xA0, 0x33, 0x53, 0x24, 0x02, 0x59, 0x74, 0x60,0x33, 0xCC, 0x7D};a1[5] -= a1[37] + a1[20];a1[8] -= a1[14] + a1[16];a1[17] -= a1[38] + a1[24];a1[15] -= a1[40] + a1[8];a1[37] -= a1[12] + a1[16];a1[4] -= a1[6] + a1[22];a1[10] += a1[12] + a1[22];a1[18] -= a1[26] + a1[31];a1[23] -= a1[30] + a1[39];a1[4] -= a1[27] + a1[25];a1[37] -= a1[27] + a1[18];a1[41] += a1[3] + a1[34];a1[13] -= a1[26] + a1[8];a1[2] -= a1[34] + a1[25];*a1 -= a1[28] + a1[31];a1[4] -= a1[7] + a1[25];a1[18] -= a1[29] + a1[15];a1[21] += a1[13] + a1[42];a1[21] -= a1[34] + a1[15];a1[7] -= a1[10] + *a1;a1[13] -= a1[25] + a1[28];a1[32] -= a1[5] + a1[25];a1[31] -= a1[1] + a1[16];a1[1] -= a1[16] + a1[40];a1[30] += a1[13] + a1[2];a1[1] -= a1[15] + a1[6];a1[7] -= a1[21] + *a1;a1[24] -= a1[20] + a1[5];a1[36] -= a1[11] + a1[15];*a1 -= a1[33] + a1[16];a1[19] -= a1[10] + a1[16];a1[1] += a1[29] + a1[13];a1[30] -= a1[33] + a1[8];a1[15] -= a1[22] + a1[10];a1[20] -= a1[19] + a1[24];a1[27] -= a1[18] + a1[20];a1[39] += a1[25] + a1[38];a1[23] -= a1[7] + a1[34];a1[37] += a1[29] + a1[3];a1[5] -= a1[40] + a1[4];a1[17] -= *a1 + a1[7];a1[9] -= a1[11] + a1[3];a1[31] -= a1[34] + a1[16];a1[16] -= a1[25] + a1[11];a1[14] += a1[32] + a1[6];a1[6] -= a1[10] + a1[41];a1[2] -= a1[11] + a1[8];*a1 += a1[18] + a1[31];a1[9] += a1[2] + a1[22];a1[14] -= a1[35] + a1[8];printf("%s", a1);return 0;}

得到flag


AIS3{4re_YOu_@_sTATEfUl_0r_StA03L3S$_ctF3R}

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

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

相关文章

前段时间公司招人,面了一个要20K的,一问自动化只会点皮毛···

前段时间公司要招2个自动化测试&#xff0c;同事面了几十个候选人&#xff0c;发现了一个很奇怪的现象&#xff0c;面试的时候&#xff0c;如果问的是框架api、脚本编写这些问题&#xff0c;基本上个个都能对答如流&#xff0c;等问到实际项目的时候&#xff0c;类似“怎么从0开…

Spring - InitializingBean、@PostConstruct、@Bean(initMethod = “init“)和构造方法执行优先级比较

执行顺序优先级 构造方法 > postConstruct > afterPropertiesSet > init方法 代码案例 Component public class InitializingBeanTest implements InitializingBean {public InitializingBeanTest(){System.out.println("构造方法");}Overridepublic void…

Linux入门攻坚——16、Linux系统启动流程

CentOS5、6的启动流程 Linux&#xff1a;kernel rootfs&#xff0c;Linux系统就是内核加上根文件系统。 内核之上是库&#xff1a; 库&#xff1a;函数集合&#xff0c;function&#xff0c;函数具有调用接口&#xff0c;库函数不能单独执行&#xff0c;必须被其他程序调用…

【前端素材】推荐优质在线电影院商城电商网页Hyper平台模板(附源码)

一、需求分析 1、系统定义 在线电影商城是指一个通过互联网提供电影服务的平台&#xff0c;用户可以在该平台上浏览电影资源、租借或购买电影&#xff0c;以及观看在线影片。 2、功能需求 在线电影商城是指一个通过互联网提供电影服务的平台&#xff0c;用户可以在该平台上…

四川尚熠电子商务有限公司电商服务领域的佼佼者

在数字化浪潮席卷全球的今天&#xff0c;电子商务已成为推动企业转型升级、拓展市场渠道的重要力量。四川尚熠电子商务有限公司&#xff0c;作为一家专注于抖音电商服务的公司&#xff0c;凭借其独特的服务模式和创新的营销策略&#xff0c;在激烈的市场竞争中脱颖而出&#xf…

Linux 系统安装/卸载 Nginx教程

优质博文&#xff1a;IT-BLOG-CN 一、安装Nginx 【1】首先通过Nginx官网确定需要安装的版本&#xff0c;如果Linux联网则直接在Linux服务上使用wget命令将Nginx安装包下载到/usr/local/目录下&#xff1a; [rootxxx local]# wget -c http://nginx.org/download/nginx-1.22.1.…

【C++精简版回顾】14.(重载2)流重载

1.流重载 istream ostream 1.class class MM {friend ostream& operator<<(ostream& out, MM& mm);friend istream& operator>>(istream& in, MM& mm); public:MM() {}MM(int age,string name):age(age),name(name) {} private:int age;st…

Three.js-05坐标轴AxesHelper

1.构建对象 说明&#xff1a;参数一表示坐标轴的长度。红色代表 X 轴. 绿色代表 Y 轴. 蓝色代表 Z 轴. const axesHelper new THREE.AxesHelper( 1 ); 2.设置位置 axesHelper.position.y1 axesHelper.position.x1 axesHelper.position.z1 3. 网格 说明&#xff1a;立方体…

没有项目经历,该如何写简历?

没有项目经历&#xff0c;我该如何写简历 一、前言二、挖掘自己三、看现成的项目经验&#xff0c;转化成自己的语言1、硬件方面2、软件方面 四、最后 一、前言 相信有很多刚出来找工作的人会遇到这种情况&#xff0c;因为自身没有项目经历&#xff0c;投了很多的简历都石沉大海…

Day05:反弹SHELL不回显带外正反向连接防火墙出入站文件下载

目录 常规基本渗透命令 文件上传下载-解决无图形化&解决数据传输 反弹Shell命令-解决数据回显&解决数据通讯 防火墙绕过-正向连接&反向连接&内网服务器 防火墙组合数据不回显-ICMP带外查询Dnslog 思维导图 章节知识点&#xff1a; 应用架构&#xff1a;W…

Vue全家桶:vue2+vue3全部搞懂:第五篇,Vue的watch监视器

前提&#xff0c;建议先学会前端几大基础&#xff1a;HTML、CSS、JS、Ajax&#xff0c;不然不好懂 这一专栏知识将一次性将vue、vue2、vue3全部讲明白 一、何为watch监视器 其实我个人理解&#xff0c;就跟原本的表单的input事件一样&#xff0c;实时监视事件发生并同步更新数…

kswapd0挖矿病毒攻击记录

文章目录 一、起因与病毒分析1、起因2、阿里云告警2.1 恶意脚本代码执行12.2 恶意脚本代码执行22.3恶意脚本代码执行32.4 恶意脚本代码执行4 3、病毒简单分析3.1 病毒的初始化3.2 病毒本体执行 4、总结 二、ubuntu自救指南1、病毒清理2、如何防御 一、起因与病毒分析 1、起因 …

3D城市模型可视化:开启智慧都市探索之旅

随着科技的飞速发展&#xff0c;我们对城市的认知已经不再局限于平面的地图和照片。今天&#xff0c;让我们领略一种全新的城市体验——3D城市模型可视化。这项技术将带领我们走进一个立体、生动的城市世界&#xff0c;感受前所未有的智慧都市魅力。 3D城市模型通过先进的计算机…

Android的硬件接口HAL

我一直觉得&#xff0c;现代计算机不是一门科学&#xff0c;起码快算不上一门理科科学。上上下下全是人造&#xff0c;左左右右全是生意&#xff0c;用管理学&#xff0c;经济学去学计算机&#xff0c;也许更看得懂很多问题。HAL就是一个典型例子。 传统Linux绕开了微软的霸权…

图片的处理库Thumbnailator

摘要&#xff1a;最近遇到图片处理的问题&#xff0c;借助了Thumbnailator库&#xff0c;记录下使用步骤如下…… 图片处理&#xff0c;JDK中也提供了对应的工具类&#xff0c;不过处理较麻烦&#xff0c;Thumbnailator 是Google一个 开源Java 图像处理库&#xff0c;用于简化 …

Oracle临时表应用

1.参考 oracle两种临时表的创建及使用方法_oracle 临时表-CSDN博客 【SQL】全局临时表 GLOBAL TEMPORARY TABLE-CSDN博客 2.语句 CREATE GLOBAL TEMPORARY TABLE tablename (columns) [ ON COMMIT PRESERVE | DELETE ROWS ] 3.应用 CREATE GLOBAL TEMPORARY TABLE "SE…

初始Tomcat(Tomcat的基础介绍)

目录 一、Tomcat的基本介绍 1、Tomcat是什么&#xff1f; 2、Tomcat的配置文件详解 3、Tomcat的构成组件 4、Tomcat的顶层架构 5、Tomcat的核心功能 6、Tomcat的请求过程 一、Tomcat的基本介绍 1、Tomcat是什么&#xff1f; Tomcat 服务器是一个免费的开放源代码的Web …

【数据库管理系统】Mysql 8.0.36入门级安装

下载地址 官方网址&#xff1a;MySQL 注意事项 建议不要安装最新版本&#xff0c;一般找mysql5.0或mysql8.0系列版本即可&#xff1b;mysq1官网有.zip和.msi两种安装形式&#xff1b;zip是压缩包&#xff0c;直接解压缩以后使用的&#xff0c;需要自己配置各种东西&#xff…

【递归搜索回溯专栏】前言与本专栏介绍

本专栏内容为&#xff1a;递归&#xff0c;搜索与回溯算法专栏。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;递归搜索回溯专栏 &#x1f69a;代码仓库&#xff1a;小小unicorn的代…

分享6个解决msvcp110.dll丢失的方法,全面解析msvcp110.dll文件

msvcp110.dll 是一个动态链接库 (DLL) 文件&#xff0c;属于 Microsoft Visual C 库的一部分&#xff0c;具体来说是 Microsoft Visual C 2012 版本的运行时组件。这个 DLL 文件包含了在 Windows 环境下运行用 C 编写的程序所必需的一些函数和资源。当一个应用程序是使用 Visua…