冠军Writeup大放送 | DataCon2022涉网犯罪分析赛道之“N0nE429”战队

WriteUp 1年前 (2023) admin
563 0 0
冠军Writeup大放送 | DataCon2022涉网犯罪分析赛道之“N0nE429”战队


由奇安信集团、清华大学网络研究院、蚂蚁集团、腾讯安全大数据实验室、Coremail论客主办的DataCon2022大数据安全分析竞赛线上赛和决赛已圆满落幕,五大赛道第一名也已各归其主。今天要为大家分享的是涉网犯罪分析赛道排名第一的N0nE429战队writeup。


来自武汉大学的N0nE429战队由3人组成,分别是JackNoire、Jiryu和Scorpion,师从傅建明教授。战队成员均来自武汉大学国家网络安全学院,主要研究方向为恶意代码检测与软件逆向。N0nE429战队曾多次参加数据安全和CTF比赛,经验丰富,成员JackNoire曾获全国大学生信息安全竞赛作品赛一等奖。

冠军Writeup大放送 | DataCon2022涉网犯罪分析赛道之“N0nE429”战队

[温馨提示:本文篇幅较长
欢迎收藏转发,随时浏览查看
]


第一部分 攻击者画像



一、题目介绍
1.1 题目背景
主办方在冬奥重保期间中活跃的恶意IP,并提供了这些IP在我们云端(非冬奥现场的数据)的waf告警日志,以及这些IP相关的其他数据。
选手需要实现一个攻击者分析模型,通过分析web类告警日志(主要的http字段、告警类型)、告警IP拓展出的外部数据(IP属性、IP上相关的DNS信息等)以及部分简单加工处理过的数据(如攻击载荷中提取的域名、识别到使用的黑客工具等)对攻击者进行画像分析,能够有效识别出攻击者组织(关联出来自同一攻击者的攻击IP),并识别攻击者类型(僵尸网络、黑产黑客、安全公司、已知互联网应用、APT组织等),通过风险评级的方式,帮助冬奥的前程人员筛选出需要值得关注的潜在攻击者。
1.2 攻击者身份分类说明
  • 安全公司:一般为明确基础设施的攻击者(团伙),能力或高或低,但通常可以通过调查基础设施明确为某个具体安全公司。
  • 非恶意互联网应用:一般为互联网资产测绘、互联网搜索引擎爬虫,其攻击记录均为误报或非主动攻击,不具备攻击性。
  • 僵尸网络:一般为批量化攻击(团伙),目的明确为挖矿或控制僵尸网络达到经济目的。通常攻击方式有较明显的自动化特征。通常可以分析到具体的僵尸网络团伙。
  • 黑产团伙:一般为明确目的的黑产团伙,能力或高或低,根据历史安全事件和攻击特征推断出目的为通过网络攻击盈利的团伙。我们建议对大部分黑产团伙进行持续活动跟踪。
  • 白帽黑客:一般为安全爱好者,通过攻击特征和历史攻击事件判定。我们建议对高能力的白帽黑客进行持续活动跟踪。
  • 雇佣黑客:一般表现为较强的攻击能力或较强的针对性,通过调查发现具备高可疑身份背景,如境外组织、政治目的强等特点。如 APT 团伙、境外政治目的黑客均为此分类攻击者。对于该分类的攻击者我们建议持续进行活动跟踪。
  • 未知属性:现有数据视野无法确认该攻击者的类别,我们建议对 2 级以上能力的攻击者进行持续活动跟踪
1.3 攻击者风险评级说明
  • 基本可信:此分类中存在的攻击组织为基本可信,对承击目标基本无威胁,攻击组织攻击意图可信任,攻击手段不存在恶意攻击或破坏目的。通常为已授权进行安全检测的组织或人员、互联网网络资产测绘项目、非攻击目的的互联网应用爬虫等。
  • 低风险威胁:此分类中存在的攻击组织为低风险威胁,对承击目标产生的攻击威胁较低,造成的影响较小,其存在一定的攻击意图,但能力较弱,破坏力较小,且攻击属于无差别攻击,攻击手段多为自动化扫描。通常为攻击手段单一,且使用老旧漏洞的僵尸网络、黑产团伙等,手段较少且以测试为目的的白帽子,无法明确可信的安全公司或互联网应用,云端及本地中较多误报且表现出的综合能力较弱的未知意图身份者。
  • 中风险威胁:此分类中存在的攻击组织为中风险威胁,对承击目标的攻击有一定威胁,攻击或将造成影响,有明确的恶意攻击意图,使用高风险攻击手段,破坏力较大,且攻击不具备针对性。通常为自动化攻击但基础设施多、能力较强的僵尸网络、黑产团伙等,攻击手段多样、能力较强的白帽子或未知身份者。
  • 中高风险威胁:此分类中存在的攻击组织为中高风险威胁,对承击目标产生的威胁程度较高,攻击或将造成较大影响,有明确的攻击意图,能力强,破坏性大,攻击具备特定针对性。通常为有明确目的的雇佣黑客、APT 组织,能力强的未知身份者。
  • 高风险威胁:此分类中存在的攻击组织为极高风险威胁,对受害者威胁程度极大,攻击或将造成较大影响,有明确的攻击意图,能力强,破坏性大,攻击具备特定针对性。通常为有明确目的的雇佣黑客、APT 组织。
  • 特殊:此分类中存在的攻击组织威胁程度未知,对受害者的影响程度未知。通常为云端情报无相关记录,需要结合其他情报的辅助进行二次分析的未知身份者。
1.4 日志说明
攻击者日志(attack-log):attack-log本次题目的主要日志,该日志是waf上的web类告警日志,以拦截攻击为主要目的,所以并没有返回包。
文件名称是IP+日期进行划分,因为在我们系统中,最小的分析单位是IP*day为切片,并将切片的分析结果汇聚(存在关联的切片)成攻击者。
waf是在CDN上运行的,因而的较多非标准的web类告警,比如host解析失败,或者host字段不在waf保护范围内,相关告警类型判定为(type字段为protocol invalidation),相关内容需要对matchdata进行分析。
具体说明如下:
冠军Writeup大放送 | DataCon2022涉网犯罪分析赛道之“N0nE429”战队
其他日志(frame-tag)是我们分析攻击切片时,在外部数据源拓展出的外部数据、通过分析本地数据简单分析得到。
domain-info-host:攻击IP上绑定的域名信息
冠军Writeup大放送 | DataCon2022涉网犯罪分析赛道之“N0nE429”战队
ip-info:IP相关信息
冠军Writeup大放送 | DataCon2022涉网犯罪分析赛道之“N0nE429”战队
payload-domain-parser:从攻击内容中提取的链接
冠军Writeup大放送 | DataCon2022涉网犯罪分析赛道之“N0nE429”战队
attack-timeline:攻击记录摘要信息
冠军Writeup大放送 | DataCon2022涉网犯罪分析赛道之“N0nE429”战队
hack-tool:从告警日志、以及攻击者发起的DNS数据中识别到的攻击者使用的黑客工具
冠军Writeup大放送 | DataCon2022涉网犯罪分析赛道之“N0nE429”战队
special-behavior:攻击者IP主动发起的DNS数据中,根据本地编写的规则命中的域名
冠军Writeup大放送 | DataCon2022涉网犯罪分析赛道之“N0nE429”战队
1.5 答案判断说明
以人工审核过的一部分攻击者结果作为样本对答案文件的准确率进行验证:
自动化判分(50%)
  • 验证攻击者身份判定准确度
  • 验证威胁等级判定准确度(常见类型的攻击者身份实际上会影响风险评级的:如非恶意互联网应用为基本可信,详细参考赛题描述)
人工审核判分(50%)
  • 对于攻击者同源关联结果进行判断(属于同一攻击者的攻击IP是否关联在一起)
  • 是否存在恶意提交(如将答案全设置为某一类型攻击者、某一威胁等级来测试答案)
  • 对部分错误判断进行酌情扣分,对将明显的无恶意、或者低危的攻击者(如僵尸网络、搜索引擎等)判定为较高危的进行扣分(同样的 把高危险的攻击者判定为未知、特殊,不扣分)
  • 对有自动化判断结果有异议处,根据选手对攻击者的判断理由进行复核
1.6 答案提交说明
  • 攻击者id:int 自增的方式递增,当属于同一攻击者有多个ip时,该攻击者id会出现多次(同源关联的判分由人工审核判断)
  • IP:IP地址
  • 威胁等级:基本可信、低风险威胁、中风险威胁、中高风险威胁、高风险威胁、特殊
  • 身份分类:安全公司、非恶意互联网应用、僵尸网络、白帽黑客、雇佣黑客、未知属性
  • 判定理由:可为空。(可以补充说明,当出现异议时,主办方会参考判定理由酌情给分)
tips:攻击者分析模型可以帮我们筛选大部分常见的低风险攻击者,剩下少部分可以人工参与分析,得出结论。
1.7 示例提交

1,207.46.13.136,非恶意互联网应用,低风险威胁,与域名msnbot-207-46-13-136.search.msn.com存在解析关系,判断为微软bing的搜索引擎

1,207.46.13.129,非恶意互联网应用,低风险威胁,与域名msnbot-207-46-13-129.search.msn.com存在解析关系,判断为微软bing的搜索引擎

2,221.15.94.147:,僵尸网络,低风险威胁,攻击载荷中使用的url http://221.15.94.147:57572/mozi.m命中僵尸网络特征

3,1.1.1.4,白帽黑客,中高风险威胁,使用了国内公共dns隧道;无破坏性攻击规则命中……

1.8 补充说明
中风险和中高风险主要区分点是在针对性上。
目标的攻击有一定威胁:首选是确定该攻击者具有攻击性、有一定的能力(不是那种使用一键扫描器的脚本小子或者一些常见的恶意扫描器,或者其他能判定攻击者能力的地方,比如在一个新漏洞出来后,攻击者能在多久就利用上这个漏洞,甚至在公布前就使用上了),具有可能攻破目标的可能性
攻击具有针对性:不是对互联网上的各种设施进行广泛扫描,(例如 举例:从来没有在公共互联网蜜罐中捕捉过相关信息,但却频繁访问、攻击一些存在共性的目标的未知攻击者。就有一定针对性。)
二、解题思路
本次攻击者画像赛道,是采用基于统计的识别方法,首先对数据进行整合入库,然后设置一系列衡量指标,然后根据这些指标来对IP进行攻击者类型和风险等级的划分。总体架构如下:

冠军Writeup大放送 | DataCon2022涉网犯罪分析赛道之“N0nE429”战队

2.1 确定分析对象
冬奥会期间指的是2.4至2.20,因此先以2.4到2.20期间的IP为对象进行分析,后续可以拿相同的代码跑所有IP。由于日志文件是以IP + 日期来命名的,且最小切片就是天,因此直接以天为单位对IP进行筛选。
2.2 读取相关日志
这里利用了一个数据结构,来记录ip对应的所有攻击日志。然后依次进行读取,进行相关的数据处理。
冠军Writeup大放送 | DataCon2022涉网犯罪分析赛道之“N0nE429”战队
2.3 数据处理
数据分为两大部分,一部分为attack_log,即攻击者的web请求被WAF记录下来的日志,包括目标host,攻击使用的URL等,一部分为frame_tag,即通过历史记录对IP信息的一些补充,比如曾经被解析的域名等。目标是利用后者来对前者的信息做一些扩展,最终得出结论。
由于数据量比较大,而且数据类型比较灵活,选择借助MongoDB来进行存储,但是由于MongoDB自身限制,每条记录长度受限,因此读取时要忽略掉较大的日志文件,后续再进行单独处理。
2.4 分析示例
首先读取冬奥会期间(2.4~2.20)的日志,确定在冬奥会期间被记录下来的ip,共有602个。然后将所有的ip与对应的日志文件对应起来,此时就可以看出某个ip存活的时间跨度,有的ip只出现过两三次,攻击日志很少;有的ip出现次数很多,而且攻击日志庞大等。从这里可以得到某个ip攻击的时间跨度和出现频率。同时根据某个ip的攻击目标,其攻击时使用的url等信息就可以大概了解这个ip作为攻击者的能力和目的。
结合这两方面就可以对攻击者做一个简单的判断了。此时还需要读取frame-tag部分,确定该ip地址的类型(家庭IP,云服务器等)、历史解析域名、攻击载荷中使用的域名等,从而更加准确的对攻击者进行画像。
2.5 制定指标
指标制定主要根据经验规则,例如:
is_dangerous:是否从该ip的日志中检测到了一般扫描器中不会集成的漏洞。
is_proxy,is_gateway,is_tor:该ip是否为代理、网关或者匿名网络。
is_gov_targeted:该ip的日志是否集中于攻击政府网站(.gov.cn)
has_webshell:是否从该ip的日志中检测到了webshell连接。
has_hacktool,has_scanner:是否从该ip的日志中检测到了黑客工具或者扫描器。
has_vuln_xx:是否从该ip的日志中检测到了xx漏洞(行为)。
等等。
根据这些指标可以制定一系列规则来对攻击者进行分类和风险等级划分。
2.6 制定规则
制定规则主要以判断风险为主,然后再区分攻击者类型。
基本可信:非恶意互联网应用和安全公司。非恶意互联网应用一般是攻击日志量大,同时具有一些明显特征。而安全公司则是可以通过调查基础设施明确为某个具体安全公司。
低风险:主要是一些“脚本小子”或者无法明确身份的互联网应用。这些ip能够对目标产生一定数量的扫描,但是不能进一步侵入目标,不会对目标造成威胁。
中风险:中风险的ip则有了一定的入侵能力,能够通过webshell等方式与服务器进行交互,或者能产生大规模访问来影响服务器正常服务。主要是一些白帽黑客,黑产团伙。
中高风险:如果符合中风险条件的ip,在攻击时有一定的倾向性,比如专注于攻击政府网站,则将其判定为中高风险ip,类别不变。
高风险:这一类不进行自动判别,仅仅在观察到可疑ip且无法符合上述规则时,手工进行判断。
2.7 同源分析
同源分析由于时间紧张,只进行了非常粗略的估计,将相同风险,相同身份且ip地址主机号相差不大的ip判定为同一攻击者。
2.8 不足
1、由于整体是基于统计的分析,没有对单个ip进行完整的行为刻画,无法更加精确的判断ip的风险等级。
2、预先数据收集不足,影响指标制定和衡量。
3、由于时间不足,没有从日志中获取相关信息来判断同源。


第二部分 恶意样本IOC自动化提取



三、题目
3.1 题目
选手需要实现一个自动化分析恶意样本工具,实现从批量样本中快速提取IOC信息。本次以Botnet样本为研究对象,对mirai家族的恶意样本做研究分析,提供以x86、arm32架构为主的mirai家族样本集和其他家族样本集,对于提供的样本集,开发一个自动化提取工具,在所提供的虚拟环境中,实现下列要求:
1. 自动识别出mirai家族样本,非mirai家族样本不做提取
2. 单个mirai样本的平均提取时间不超过20秒
3. 提取mirai C2的域名/IP及对应端口信息
4. 提取mirai加密字符串信息
3.2 Mirai分析
阅读Mirai的源代码,找到域名/IP及对应端口信息的位置。
在Mirai源代码的git仓库中可以找到ForumPost:
https://github.com/jgamblin/Mirai-Source-Code/blob/master/ForumPost.md
作者讲了配置CNC域名的方法:即修改table.c里table_init中的add_entry,CNC对应的域名和端口号在加密的table中的id分别为TABLE_CNC_DOMAIN和TABLE_CNC_PORT。
接下来,在源代码中搜索TABLE_CNC_DOMAIN,可找到resolve_cnc_addr函数,而该函数会在anti_gdb_entry中出现。
anti_gdb_entry这个函数在main函数中出现,它在Release版和Debug版中被调用的方式不同。
在Release版中,anti_gdb_entry会作为一个参数传入signal函数。而在Debug版中,anti_gdb_entry会被直接调用。
四、解题思路
4.1 提取ip/端口
基本思路是定位到main函数->定位到anti_gdb_entry函数和resolve_cnc_addr函数->分析resolve_cnc_addr函数,提取域名/IP及端口
定位main函数
我们使用idapython实现上述功能。在ARM中,main函数的地址通常会出现在start(或_start)函数的LDR R0,=main这条语句中:

冠军Writeup大放送 | DataCon2022涉网犯罪分析赛道之“N0nE429”战队

遍历start函数中的指令,找到一条指令满足LDR R0, =sub_XXXX,然后就可以认为sub_XXXX是main函数的地址。而在X86当中,main函数地址出现的方式为push offset main; call sub_XXXX:

冠军Writeup大放送 | DataCon2022涉网犯罪分析赛道之“N0nE429”战队

搜索call指令,找到该指令前面的一条push指令,即可找到main函数的地址:
定位anti_gdb_entry和resolve_cnc_addr
在Release版本中,anti_gdb_entry会传入signal函数。所以,要先找到signal函数。main函数中发生了两次signal的调用:signal(SIGCHLD, SIG_IGN);signal(SIGTRAP, &anti_gdb_entry);
SIGCHLD=17, SIG_IGN=1,所以可以在main函数中找到一个函数调用满足两个参数为17和1,该函数即为signal函数。定位到signal函数后,再找到signal(SIGTRAP, &anti_gdb_entry)的调用,SIGTRAP=5,所以搜索signal第一个参数为5的调用,即可找到anti_gdb_entry的地址。anti_gdb_entry中只有一条赋值语句,反编译后找到这条赋值语句,即可获取resolve_cnc_addr的地址。而在Debug版本中,anti_gdb_entry会被main函数直接调用。对Debug版本样本反编译后,发现anti_gdb_entry发生了函数展开,在main中就是一条赋值语句,所以直接在main函数中搜索赋值语句,赋值语句两侧均为cot_obj即全局变量,即可找到resolve_cnc_addr的地址。

冠军Writeup大放送 | DataCon2022涉网犯罪分析赛道之“N0nE429”战队

分析resolve_cnc_addr
虽然Mirai源代码中resolve_cnc_addr会从table解密并获取CNC服务器的域名/IP和端口号,但是分析实际样本后,发现很多样本都会修改resolve_cnc_addr的内容。resolve_cnc_addr设置域名/IP和端口号主要有以下三种形式:
1、直接赋值:直接将IP地址和端口号赋值给全局变量srv_addr中的成员
冠军Writeup大放送 | DataCon2022涉网犯罪分析赛道之“N0nE429”战队
2、字符串传参:将域名/IP字符串作为参数传入一个函数,将函数返回值赋值给全局变量

冠军Writeup大放送 | DataCon2022涉网犯罪分析赛道之“N0nE429”战队

3、table加密:从table中解密获取域名/IP和端口号

冠军Writeup大放送 | DataCon2022涉网犯罪分析赛道之“N0nE429”战队

首先在resolve_cnc_addr中搜索所有给全局变量赋值的语句。由于端口号和IP地址是放在sockaddr_in类型结构体里的,在内存中sin_addr比sin_port高两个字节,所以当赋值语句左式地址相距两个字节时,即可得知低地址的为sin_port,高地址的为sin_addr。不过,也有一些样本会在resolve_cnc_addr中给sin_family赋值,sin_family比sin_port低两个字节。所以,如果遇到对三个全局变量赋值,相邻两个全局变量间隔2字节的情况时,需要认为全局变量由低到高依次为sin_family、sin_port、sin_addr。
接下来再看对应的赋值语句右式,如果右式是数字,就说明属于上述的直接赋值情况,可以通过右式提取出IP地址和端口号。这里需要注意的是,可能出现分多次赋值的情况,例如端口号有2个字节,但是在反编译结果中,两个字节可能会分开赋值,也就是有两个赋值语句,例如上面直接赋值示例的就是这种情况。
对于第二种情况,即域名/IP字符串作为参数传入函数的情况,可以遍历函数调用的参数,查看是否有字符串参数,并用正则表达式判断字符串是否为域名或IP。
而对第三种情况,即从table中解密的情况,需要获取域名/IP和端口号在table中对应的id。注意到resolve_cnc_addr中有table_retrieve_val(TABLE_CNC_DOMAIN, NULL)和table_retrieve_val(TABLE_CNC_PORT, NULL)这种形式的函数调用,反映到反编译结果中就是两个参数均为数字,且第二个参数为0。所以,可以搜索两个参数都为cot_num,且第二个参数为0的函数调用,此时第一个参数就是table中的id。当table中的字符串被解密后,根据id在table中找到对应的解密字符串。如果字符串的长度等于2,则认为这是端口号,如果字符串长度大于2,则认为这是域名/IP地址。对于端口号,需要注意使用ntohs将其由网络字节序转换为主机字节序。
4.2 识别加密函数
加密函数即table.c中的toggle_obf以及enc.c中的x函数(代码都是一样的),主要为异或运算。
在table_unlock_val和table_lock_val中,这个函数通常会内联展开。识别加密函数的目的是获取table的地址和table_key的值,因此需要定位到包含加密运算的函数。(即如果toggle_obf发生了内联展开,则定位到table_unlock_val或table_lock_val)
通过统计某一类型指令个数的方法识别加密函数。基于特征观察,加密函数基本都是一样,逻辑运算指令一般为8个,算术运算指令一般为3个。
具体来说,对ARM的样本,统计下面三类指令:

airthmetic: ‘ADD’, ‘ADDS’, ‘SUB’, ‘SUBS’, ‘ADC’, ‘RSB’, ‘RSC’, ‘SBC’, ‘MLA’, ‘MUL’

shift: ‘ASR’, ‘LSR’, ‘LSL’, ‘ASL’, ‘ROR’, ‘RRX’
logic: ‘AND’, ‘EOR’, ‘ORR’
如果logic类型指令个数在[7, 9]区间内,airthmetic类型指令在[2, 4]区间内,则认为这是加密函数。
对X86的样本,统计下面三类指令:
airthmetic: ‘add’, ‘sub’, ‘adc’, ‘sbb’, ‘mul’, ‘imul’
shift: ‘sar’, ‘shr’, ‘shl’, ‘sal’, ‘rol’, ‘ror’, ‘rcl’, ‘rcr’
logic: ‘and’, ‘xor’, ‘or’
如果logic类型指令个数在[6, 8]区间内,shift类型指令在[2, 4]区间内,则认为这是加密函数。
需要注意的是,上述方法得到的结果不一定准确,例如不是加密函数也有可能符合上述规则,因此符合上述规则的多个函数,依次尝试后续的提取table地址和密钥操作,如果后续操作失败了就说明这个函数很可能并不是加密函数,需要继续尝试下一个函数,直到找到一个函数可以成功提取出table地址和密钥。
4.3 提取密钥
在加密函数结尾找table_key的方法快速便捷,但是存在以下几个问题:
1、该方法仅适用于ARM的样本;
2、识别加密函数的算法结果不一定准确,可能导致这里table_key提取结果有错误。
为解决上述问题,使用分析反编译代码的方法提取table和table_key。
在加密函数的反编译代码中,table和table_key都会出现在赋值语句的右式。table的出现方式有:
(char *)&table + ((8 * a1) & 0x7FF)
&table[2 * a1]
它们的共同点是都有取地址符&,即cot_ref类型。当搜索到cot_ref时,即可进一步分析找到table的地址。
而对于table_key,在反编译代码中的特点是,在赋值语句右式出现次数较多,通常不少于4次。因此可以遍历赋值语句右式,统计右式中全局变量出现的次数。如果右式某个全局变量出现次数达到3次,即可认为该全局变量为table_key。由于table_key可能会出现在函数调用、类型转换、移位运算当中,因此我们采用递归的方法分析赋值语句右式的元素,找到全局变量并统计个数。
4.4 提取加密字符串
加密的字符串会在table_init函数中被添加到table表里。table_init的特点为:
1、不包含if、while等分支循环语句,函数流程图的基本块通常只有1个;
2、会多次调用同一个函数。
对于第一个特点,可以使用idaapi.FlowChart()得到函数流程图,并得到基本块个数,对基本块个数进行判断,过滤掉不是table_init的函数。不过,部分样本的table_init基本块个数有2个,例如样本6bd2053912890f8b58ed0347d43cd30a函数末尾是B sub_9964,而不是BX LR,因此IDA会认为这里的基本块有2个。
对于第二个特点,在ARM样本中可以遍历所有BL指令,统计函数调用次数;在X86样本中则是遍历所有call指令。如果发现同一个函数在该函数中被调用超过3次,则认为该函数可能为table_init,并作进一步分析。
源代码中,table_init会多次调用add_entry函数,add_entry会要求传入三个参数,分别为id、加密字符串、加密字符串长度。而在样本当中,add_entry通常会内联展开:
冠军Writeup大放送 | DataCon2022涉网犯罪分析赛道之“N0nE429”战队
这里实际上是将add_entry展开为malloc、util_memcpy,以及对table中的成员赋值的操作,上图中sub_14110就是malloc,而sub_12D20就是util_memcpy:
冠军Writeup大放送 | DataCon2022涉网犯罪分析赛道之“N0nE429”战队
无论是add_entry还是util_memcpy,它们都有三个参数,且第二个参数为加密字符串,第三个参数为字符串长度。所以,进一步分析table_init时,先遍历调用次数超过3次的函数,看参数个数和类型是否满足要求。
这个时候已经知道加密字符串的地址、长度,以及table_key了,所以此时已经可以解密得到IOC中的configs这一项了。但是,如果域名/IP或端口号被加密了,之前的分析只能知道它们在table中的id,如果要解密的话还需要建立id和加密字符串之间的关系。
如果add_entry没有被展开,直接被调用,那么直接从第一个参数就可以知道id,但是如果发生了展开,那么在反编译代码中table成员被赋值,会被解析成全局变量被赋值。因此,在这种情况下需要继续分析反编译代码中的赋值语句。
如果赋值语句右式为局部变量,就说明这个应该是malloc函数的返回值,此时赋值语句的左式即为table[id].val。val是table[id]的第一个成员,所以它的内存地址就等于table[id]的内存地址,把所有table[id].val的内存地址先存起来。之前的分析已经知道了table的基地址,这个时候就可以计算出这些table[id]到table基地址的偏移。然后,再求这些偏移的最大公约数,即可知道table数组中的一项table_value结构体占几个字节。
知道了table数组中一项的大小后,这个时候再拿到一个table[id]的内存地址,就可以计算出id的值了。此时再看形如dword_1ECD0 = v0的赋值语句,即可建立v0局部变量到id的对应关系。然后,看哪次util_memcpy调用的第一个参数为v0,即可建立id到加密字符串之间的对应关系,这样就能解密出域名/IP和端口号了。
4.5 脱壳
主要参考https://github.com/NozomiNetworks/upx-recovery-tool
l_info
通常情况下,l_info的l_magic为‘UPX’。常见的反脱壳手段即为更改l_magic。因此只需要检查并更改为UPX即可。
冠军Writeup大放送 | DataCon2022涉网犯罪分析赛道之“N0nE429”战队
p_info
struct p_info // 12 字节的打包程序头跟随 stub loader 
 {  
uint32_t p_progid ;
uint32_t p_filesize ;  
uint32_t p_blocksize ;
 } ;
p_filesize和p_blocksize都应存储相同的大小值,而常见的反脱壳手段则可能将其置零或使其不匹配。但文件大小和块大小的值也会存储在文件尾部。[end]

【往期回顾】

冠军Writeup大放送 | DataCon2022涉网犯罪分析赛道之“N0nE429”战队

冠军Writeup大放送 | DataCon2022涉网犯罪分析赛道之“N0nE429”战队

冠军Writeup大放送 | DataCon2022涉网犯罪分析赛道之“N0nE429”战队

添加DataCon小助手微信
微信号:DataConofficial
获取更多大数据安全知识
进群还有超多活动、福利
DataCon定制服饰、背包等精彩好礼
等你来拿!

原文始发于微信公众号(DataCon大数据安全分析竞赛):冠军Writeup大放送 | DataCon2022涉网犯罪分析赛道之“N0nE429”战队

版权声明:admin 发表于 2023年1月11日 下午4:10。
转载请注明:冠军Writeup大放送 | DataCon2022涉网犯罪分析赛道之“N0nE429”战队 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...