逆向心法修炼之道 Flare on 6TH WriteUp

格物实验室专注于工业互联网、物联网和车联网三大业务场景的安全研究。实验室以“格物致知”的问学态度,致力于以智能设备为中心的漏洞挖掘和安全分析,提供基于业务场景的安全解决方案。积极与各方共建万物互联的安全生态,为企业和社会的数字化转型安全护航。

薄技在身 三重门开

法门提示

修炼之道

1.下载附件文件。

2.密码“flare”解压缩,获得exe文件。

3.运行主程序,这是一个小游戏,一共有3关,每个关口对应不同的Code。

4.使用dnspy进行反编译发现需要过三关。

a.第一关代码如下:

从判定条件可以知道过这一关的KEY为“RAINBOW”。

b.第二关的代码如下:

此部分可以看出是一个简单的异或算法,将结果数据提取出来,利用同样的算法计算一下可以获得通过此关的KEY为“Bagel_Cannon”,解密代码如下:

enc_arr1=['\x03','"','"','"','%','\x14','\x0e','.','?','=',':','9']
enc_str1=""
for i in enc_arr1:
    enc_str1+=i

slen=len(enc_str1)
key=''
for i in range(0,slen):
    key+=chr((65+i*2)^ord(enc_str1[i])&0xff)
print "KEY: %s" % key

 

c.第三关的代码如下:

通过分析发现此关使用了标准的RC4算法,将比较的结果内容提出并代入到如下的RC4解密算法代码中。

import base64
from Crypto.Cipher import ARC4
enc_arr=[95,193,50,12,127,228,98,6,215,46,200,106,251,121,186,119,109,73,35,14,20]
enc_str=""
for i in enc_arr:
    enc_str+=chr(i)
rc4_key=base64.b64encode(key)
cipher = ARC4.new(rc4_key)
print "Stage 2: The key is: %s" % cipher.decrypt(enc_str)

运行脚本后获得的KEY为“Defeat_them_with_love”。

5.运行解压后的原始程序,分别按照顺序输入得到的KEY,最后获得含有flag的图片。

 

初出茅庐 小试牛刀

法门提示

修炼之道

1.下载附件文件。

2.密码“flare”解压缩,获得exe文件。

3.运行程序,查看程序输出,很明显,后面应该还跟着一段字符串,但是被隐藏了。

4.IDA查看关键代码,可以发现有一段解密代码,但是发现解密长度和输出长度对不上,密文应该更长一些。

5.函数sub_401160的第三个参数保存了解密数据的长度,将其修大一些,这里改为0x110,运行即可把后面的flag继续输出出来。

 

博观约取 厚积薄发

法门提示

修炼之道

1.下载附件文件。

2.密码“flare”解压缩,获得apk文件。

3.试着使用模拟器运行该文件,可以看到这是一个熊宝宝游戏,有三个操作,分别是喂食,玩耍,清洁卫生。

4.通过JEB反编译apk文件的代码,找到关键代码如下:

a.这里为判定成功的条件,三个状态必须满足:

b.接下来的三个操作分别对不同状态的改变代码:

Clean:

Feed:

Play:

5.建立一个三元一次方程组,求解每一种操作需要多少次才能成功。

6.解得clean 2次,feed 8 次,play4次,通过操作之后,游戏成功通关,得到flag。

 

狼烟四起 火光冲天

法门提示

修炼之道

1.下载附件文件。

2.密码“flare”解压缩,获得Linux 可执行文件。

3.试着运行,这是一个棋类游戏,通过和服务器通信获取下一步的信息。

4.打开附件里面的数据包文件,可以看到数据都是走DNS隧道,其中发送的数据附加到子域名中,返回的数据则是在DNS响应的地址域里面。

5.使用IDA打开so,可以发现解析逻辑在getNextMove函数里面。当所有数据包解析完成后,flag_4060就解密出flag。

6.编写脚本,提取出数据包的数据,模拟当时数据包的解析状态,即可得到flag。

import dpkt
import socket
import binascii
path = 'capture.pcap'
f = open(path, 'rb')
flag=bytearray('\x00'*64)
pcap = dpkt.pcap.Reader(f)
index=0
key=bytearray(binascii.a2b_hex('79 5A B8 BC EC D3 DF DD  99 A5 B6 AC 15 36 85 8D 09 08 77 52 4D 71 54 7D A7 A7 08 16 FD D7 41 20'.replace(' ',"")))
for ts, buf in pcap:
    
    #make sure we are dealing with IP traffic
    try:
        eth = dpkt.ethernet.Ethernet(buf)
    except:
        continue
    if eth.type != 2048:
        continue
    #make sure we are dealing with UDP protocol
    try:
        ip = eth.data
    except:
        continue
    if ip.p != 17:
        continue
    #filter on UDP assigned ports for DNS
    try:
        udp = ip.data
    except:
        continue
    if udp.sport != 53 and udp.dport != 53:
        continue
    #make the dns object out of the udp data and
    #check for it being a RR (answer) and for opcode QUERY
    try:
        dns = dpkt.dns.DNS(udp.data)
    except:
        continue
    if dns.qr != dpkt.dns.DNS_R:
        continue
    if dns.opcode != dpkt.dns.DNS_QUERY:
        continue
    if dns.rcode != dpkt.dns.DNS_RCODE_NOERR:
        continue
    if len(dns.an) < 1:
        continue
    #process and print responses based on record type
    
    for answer in dns.an:
        if answer.type == 1: #DNS_A
            print 'Domain Name: ', answer.name, '\tIP Address: ',socket.inet_ntoa(answer.rdata)
            ipdata=bytearray(answer.rdata)
            if ipdata[0]==0x7f and ipdata[3]&1==0:
            
                index=ipdata[2]&0xf

                flag[2*index]=ipdata[1]^key[2*index]
                flag[2*index+1]=ipdata[1]^key[2*index+1]
            else:
                index=0
        index+=1
print str(flag)

flag为:LooksLikeYouLockedUpTheLookupZ@flare-on.com

 

魑魅魍魉 钟馗之眼

法门提示

修炼之道

1.下载附件文件。

2 .密码“flare”解压缩,获得exe可执行文件。

3.试着运行,这是d3dx的demo程序,首先猜测flag应该是隐藏起来了。

4.由于主程序加壳了,所以让程序运行起来再dump出来才能用ida静态分析。可以看到应该是有两个绘制对象,一个是隐藏的flag,一个是显示的logo。

5.尝试交换两个绘制对象的位置,让原本不显示的flag显示出来。

6.得到一个镜像的flag图片,反转后就是正常的flag图片。

 

暗礁险滩 苍龙开道

法门提示

修炼之道

1.下载附件文件。

2.密码“flare”解压缩,获得exe可执行文件。

3.exe是将文件隐藏到图片中,而image.bmp是要提取文件的图片,这题应该是先分析图片的隐写算法,再从图片中提取出flag。

4.使用dnspy打开exe,可以看到4个处理的地方,动态hook和修改了IL代码,导致静态分析代码和动态运行的运行结果不同。

5.Hook两处,将a函数修改成b函数,将c函数修改成d函数。

6.修改了IL代码,将h函数原本调用f函数地方改成调用g函数,同时修改g函数中的两个常数。

7.分析之后就可以编写提取算法,首先将数据从图片中提取处理,将数据解密之后就是原来被隐写的数据。

提取代码如下:

解密代码如下:

8.最后提取出包含flag图片文件:

 

小成智慧 大成毅力

法门提示

修炼之道

1.下载附件文件。

2.密码“flare”解压缩,获得exe可执行文件。

3.试运行程序如下:

4.试玩游戏,使用help命令查看支持的命令,list games查看游戏种类,play <game>选择要玩的游戏,根据提示选择“GLOBAL THERMONUCLEAR WAR”游戏,之后需要输入攻击目标城市名和启动代码。

5.使用IDA加载查看程序发现其为使用PyInstaller打包的python代码。

6.使用pyinstallerextractor解压打包的exe文件。

工具下载地址:https://sourceforge.net/projects/pyinstallerextractor/

7.根据解包提示的入口代码信息,分析相关的pyc文件。其中pyiboot02_cleanup为主要的程序功能代码,该文件缺少16字节的pyc头部信息,修复pyc直接将pyimod01_os_path文件的头部16字节添加到pyiboot02_cleanup的文件头部,并重命名为pyc。

8.利用uncompyle6反编译pyc代码。

工具下载地址:https://github.com/rocky/python-uncompyle6/

9.分析获取到的python源码。

  • 程序开始读取了this目录下的key文件。
  • 将print与exec函数互换。
  • 取程序的__doc__数据,并进行解密解压操作。
  • 之后直接调用print函数执行解密的代码。

10.解密下一阶段要执行的python代码:

  • 手工提取doc数据(在pyiboot02_cleanup文件到0x13d偏移到0x8f83)。
  • 提取key,位于解压文件夹exe_extracted中this目录下的key文件。
  • 解密解压获取py代码。

提取的wopr.py代码如下:

11.分析py代码。

  • 输入正确的launch_code时,保证“b == h”成立即进入正确的解密流程。
  • b包含16个字节,lanuch_code包含16个字节。
  • b 与 launch_code 存在16个相关的约束方程组。

12.只要知道完整的b,就可以通过解方程的方式获取到launch_code。

13.获取flag的需要满足条件“b==h”,下面是与h数据的相关代码(wrong函数)。

14.通过分析wrong函数代码后,重构wrong函数代码。

  • 取exe的.text段的数据。
  • 取exe的.reloc段的数据。

15.运行重构后的完整py。

获取到正确到h = [115, 29, 32, 68, 106, 108, 89, 76, 21, 71, 78, 51, 75, 1, 55, 102],即b = [115, 29, 32, 68, 106, 108, 89, 76, 21, 71, 78, 51, 75, 1, 55, 102]。

16.利用z3求解方程获取正确的launch_code。

LAUNCH CODE: 5C0G7TY2LWI2YXMB

17.再次试玩“GLOBAL THERMONUCLEAR WAR”游戏,输入正确的Launch code,获取到flag。

 

天机楼阁 箭由心发

法门提示

修炼之道

  1. 下载附件文件。
  2. 密码“flare”解压缩,获得nes文件。
  3. 通过网络查找,发现使用fceux可以打开nes,调试贪吃蛇游戏。

工具下载地址:http://www.fceux.com/web/download.html

  1. 通过对游戏观察分析发现游戏中“蛇”吃的“苹果数”保存在内存0x25地址,对0x25地址设置读写访问断点。

5 .设置断点后,继续运行程序,当“蛇”吃到“苹果“时,调试器中断了下来,断到00:C82A处。

6.分析代码发现程序中对比了当前“苹果“数是否为0x33,直接修改内存中的苹果数为0x32。之后继续运行程序,当”蛇“再次吃到”苹果“时,中断下来,接着单步调试。

7.程序判断”苹果数”为0x33,成功后,在地址00:C1B0地址处获取0x26地址的数据,并将其保存的数据与0xF0对比。

8.这里直接修改0x26地址保存的数据为0xF0。

9.继续运行程序,获取到最终的flag。

 

明修栈道 暗度陈仓

法门提示

修炼之道

  1. 下载附件文件。
  2. 密码“flare”解压缩,获得exe可执行文件。
  3. 使用IDA进行静态分析,函数sub_FFFF10D0处包含Key验证代码。

  1. 分析后确定Key为RoT3rHeRinG。

  • 直接运行程序输入Key,输出显示错误Wrong key。

  1. 判断程序中存在反调试技术。用调试器分析程序,最终定位到0x112D0的函数。

6.当程序运行到check点时,直接修改跳转条件,使其调试器检测失败。

7.之后运行定位到真正的解密流程:

  • 密文的数据内容为:
7A 17 08 34 17 31 3B 25 5B 18 2E 3A 15 56 0E 11 3E 0D 11 3B 24 21 31 06 3C 26 7C 3C 0D 24 16 3A 14 79 01 3A 18 5A 58 73 2E 09 00 16 00 49 22 01 40 08 0A 14
  • 使用输入的key对字符串进行分组xor解密。
  • 已知部分明文内容为 @flare-on.com。

  1. 使用已知部分明文内容与密文中对应的字节进行xor,获得key为3HeadedMonkey

9.直接运行程序,输入正确的Key,获取到最终的flag。

 

驱伪存真 假道灭虢

法门提示

修炼之道

  1. 下载附件文件。
  2. 密码“flare”解压缩,获得两个加密的图片文件和一个EXE文件。
  3. 初步分析一个勒索软件。勒索软件运行流程大致如下:
  • 获取主机名、IP地址、系统版本信息、用户名、系统安装目录、日期。
  • 请求访问:http://twitrss.me/twitter_user_to_rss/?user=ACenterForAnts内容,使用字符串(I&#x27;m done,Jaco. I got a prostate the size of a honeydew…and a head full of bad memories.) 对获取的用户主机相关信息循环分组异或加密,之后进行base64编码处理。
  • 将加密的数据通过POST方法发送到C&C服务器(flare-on.com)
  • C&C服务器回复特定格式的数据,其中,包含加密的0x14字节的加密key。
  • 之后解密加载dll,创建加密线程。

主线程创建窗口显示勒索界面,并通过邮槽\\\\.\\mailslot\\Let_me_show_you_Derelicte将C&C服务器下发的加密key(0x14 bytes)传输到加密线程中。

加密线程读取邮槽中的key(0x14 bytes),获取主机盘符信息,遍历目录对目录名为“really, really, really, ridiculously good looking gifs“下的gif文件进行加密并删除原始文件,加密文件文件名为原始文件名加上后缀 “.Mugatu“,加密完成后,释放txt文件。

  1. 通过分析加密算法发现为变形的Xtea算法,由于将Xtea算法中的dword ptr 改为 byte ptr导致密钥长度为4字节。

5.通过已知的gif头标识,爆破4字节的key,结果为 0x31, 0x73, 0x35, 0xb1,使用key解密gif.Mugatu文件。

 

飘渺之旅 雪山之巅

法门提示

修炼之道

  1. 下载附件文件。
  2. 密码“flare”解压缩,获得EXE文件。
  3. 程序需要输入2个参数。
  • 参数1的长度必须大于3、小于32,通过分析sub_140001610可以确定参数一为:“FLARE2019”。
  • 参数2的长度必须等于32。

4.虚拟机函数表如下:

  1. 虚拟机执行引擎代码。

6.Hook虚拟机执行引擎记录虚拟机执行日志,分析日志发现参数二运算处理后的最终结果会与“70 70 B2 AC 01 D2 5E 61 0A A7 2A A8 08 1C 86 1A E8 45 C8 29 B2 F3 A1 1E“进行比较,如果相等则成功。

7 .提取与参数二运算相关的操作指令“vpermd vpshufb vpmaddwd vpmaddubsw vpaddb“。

8.Google搜索发现其为AVX2实现的加速版Base64算法。对“70 70 B2 AC 01 D2 5E 61 0A A7 2A A8 08 1C 86 1A E8 45 C8 29 B2 F3 A1 1E“进行base64编码“cHCyrAHSXmEKpyqoCByGGuhFyCmy86Ee”,输入后获取到最终的flag。

 

拨开迷雾 奔向蓝天

法门提示

修炼之道

  1. 下载附件文件。
  2. 密码“flare”解压缩,获得一个dmp文件和一个网络数据包文件。
  3. 简单查看分析pcapng数据包,发现可疑的TCP通信端口4444,7777,6666,8888。

4.使用windbg查看dump文件,确定dump文件操作系统版本为win7_sp1。并且是由man.sys导致系统蓝屏。

5.使用volatility -f help.dmp –profile=Win7SP1x64 netscan查看系统网络连接相关信息。

6.进程876监听了TCP 4444端口,通过数据包分析获得的可疑通信均出自该进程。Dump进程876的内存“volatility -f help.dmp –profile=Win7SP1x64 memdump -p 876 -D .“。

7 .在Dump的876进程内存空间中,提取到如下几个模块。

名称 功能 描述
screenshotdll.dll 屏幕截图 截图信息发送到攻击者服务器的tcp 7777端口
networkdll.dll 网络操作 主动连接192.168.1.243
keylogdll.dll 键盘记录 键盘记录发送到攻击者服务器的tcp 8888端口(将大写字母转换为小写发送)
filedll.dll 文件操作 文件发送到攻击者服务器的tcp 6666端口
cryptodll.dll 压缩加密操作 Rc4加密,密钥为用户名 “FLARE ON 2019” + “\x00”,COMPRESSION_FORMAT_LZNT1压缩
m.dll 后门程序 监听tcp 4444端口,接受攻击者的控制指令并分发到驱动
stmedit.sys WFP过滤驱动 对数据包进行底层加解密
man.sys 主驱动 加载stmedit.sys,并进行功能分发
shellcodedriver.sys / /
  1. pcapng数据包中的加密流量详细分析。
端口 算法/密钥 功能
4444 Xor/5df34a484848dd23 攻击者发送控制指令
7777 Xor/4a1f4b1cb0d825c7 加密的屏幕截图
6666 Xor/ d56994fa25ecdfda

RC4/“FLARE ON 2019” + “\x00”

压缩/COMPRESSION_FORMAT_LZNT1

压缩加密的传输文件
8888 Xor/ f78f7848471a449c

RC4/“FLARE ON 2019” + “\x00”

压缩/COMPRESSION_FORMAT_LZNT1

压缩加密的键盘记录信息
  1. 解密后获取的屏幕截图信息(TCP 7777端口)如下:

  1. 通过查看屏幕截图可以获取到如下信息:
  • flag在kdb文件中。
  • kdb的打开主密码在键盘记录中。
  • 密码由18个字节组成。

11.解密分析发送到攻击者TCP 6666端口的数据,可以成功获取到kdb文件。

12.解密分析发送到攻击者TCP 8888端口的键盘记录信息:

  • 键盘记录中丢失了部分字符如“_”(对比屏幕截图来看)。
  • 加密kdb的密码小写可能包含“th1sth33nd111”。

  • 由于打开kdb的密码为18个字节,因此猜测密码的小写可能为“th1s_th3_3nd111”
  • 在dump文件中进行部分匹配查找发现可疑字符串“!s_iS_th3_3Nd!!!”

13.最终确认打开kdb的主密码为“Th!s_iS_th3_3Nd!!!“。

 

总结

挑战赛共计12道题目,历时40天时间。当所有的挑战通过后会提示如下:

本次的挑战赛中收获到的不仅仅是前所未知的知识,更重要的是再次对自己的挑战与超越,未来将会越来越好,期待下一年的更上一层楼。

Spread the word. Share this post!

Meet The Author

Leave Comment