格物实验室专注于工业互联网、物联网和车联网三大业务场景的安全研究。实验室以“格物致知”的问学态度,致力于以智能设备为中心的漏洞挖掘和安全分析,提供基于业务场景的安全解决方案。积极与各方共建万物互联的安全生态,为企业和社会的数字化转型安全护航。
薄技在身 三重门开
法门提示
修炼之道
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。
天机楼阁 箭由心发
法门提示
修炼之道
- 下载附件文件。
- 密码“flare”解压缩,获得nes文件。
- 通过网络查找,发现使用fceux可以打开nes,调试贪吃蛇游戏。
工具下载地址:http://www.fceux.com/web/download.html
- 通过对游戏观察分析发现游戏中“蛇”吃的“苹果数”保存在内存0x25地址,对0x25地址设置读写访问断点。
5 .设置断点后,继续运行程序,当“蛇”吃到“苹果“时,调试器中断了下来,断到00:C82A处。
6.分析代码发现程序中对比了当前“苹果“数是否为0x33,直接修改内存中的苹果数为0x32。之后继续运行程序,当”蛇“再次吃到”苹果“时,中断下来,接着单步调试。
7.程序判断”苹果数”为0x33,成功后,在地址00:C1B0地址处获取0x26地址的数据,并将其保存的数据与0xF0对比。
8.这里直接修改0x26地址保存的数据为0xF0。
9.继续运行程序,获取到最终的flag。
明修栈道 暗度陈仓
法门提示
修炼之道
- 下载附件文件。
- 密码“flare”解压缩,获得exe可执行文件。
- 使用IDA进行静态分析,函数sub_FFFF10D0处包含Key验证代码。
- 分析后确定Key为RoT3rHeRinG。
- 在调试器里运行时输入Key,输出flag:N3v3r_g0nnA_g!ve_You_uP@FAKEFLAG.com
- 直接运行程序输入Key,输出显示错误Wrong key。
- 判断程序中存在反调试技术。用调试器分析程序,最终定位到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。
- 使用已知部分明文内容与密文中对应的字节进行xor,获得key为3HeadedMonkey
9.直接运行程序,输入正确的Key,获取到最终的flag。
驱伪存真 假道灭虢
法门提示
修炼之道
- 下载附件文件。
- 密码“flare”解压缩,获得两个加密的图片文件和一个EXE文件。
- 初步分析一个勒索软件。勒索软件运行流程大致如下:
- 获取主机名、IP地址、系统版本信息、用户名、系统安装目录、日期。
- 请求访问:http://twitrss.me/twitter_user_to_rss/?user=ACenterForAnts内容,使用字符串(I'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文件。
- 通过分析加密算法发现为变形的Xtea算法,由于将Xtea算法中的dword ptr 改为 byte ptr导致密钥长度为4字节。
5.通过已知的gif头标识,爆破4字节的key,结果为 0x31, 0x73, 0x35, 0xb1,使用key解密gif.Mugatu文件。
飘渺之旅 雪山之巅
法门提示
修炼之道
- 下载附件文件。
- 密码“flare”解压缩,获得EXE文件。
- 程序需要输入2个参数。
- 参数1的长度必须大于3、小于32,通过分析sub_140001610可以确定参数一为:“FLARE2019”。
- 参数2的长度必须等于32。
4.虚拟机函数表如下:
- 虚拟机执行引擎代码。
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。
拨开迷雾 奔向蓝天
法门提示
修炼之道
- 下载附件文件。
- 密码“flare”解压缩,获得一个dmp文件和一个网络数据包文件。
- 简单查看分析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 | / | / |
- 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 |
压缩加密的键盘记录信息 |
- 解密后获取的屏幕截图信息(TCP 7777端口)如下:
- 通过查看屏幕截图可以获取到如下信息:
- 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天时间。当所有的挑战通过后会提示如下:
本次的挑战赛中收获到的不仅仅是前所未知的知识,更重要的是再次对自己的挑战与超越,未来将会越来越好,期待下一年的更上一层楼。