Polar MISC (中)
加点什么2.0
foremost提取后出来一个没有后缀的文件,是ELF
在一个函数FLAG发现疑似flag内容:372658619JI0707I8G64HF2400F96991
IDA分析原函数:
for ( i = 0; ciphertext[i]; ++i ){if ( ciphertext[i] <= 64 || ciphertext[i] > 90 ){if ( ciphertext[i] <= 96 || ciphertext[i] > 122 )plaintext[i] = ciphertext[i];elseplaintext[i] = ((ciphertext[i] - 97 - K) % 26 + 26) % 26 + 97;}else{plaintext[i] = ((ciphertext[i] - 65 - K) % 26 + 26) % 26 + 65;}std::operator<<<std::char_traits<char>>(&std::cout, (unsigned int)plaintext[i]);}
模仿这个写个解密的python即可
plain=''
K=4
cipher='372658619JI0707I8G64HF2400F96991'
for i in cipher:if ord(i)<=64 or ord(i)>90:if ord(i)<=96 or ord(i)>122:plain+=ielse:plain=chr(((ord(i) - 97 - K) % 26 + 26) % 26 + 97)else:plain+=chr(((ord(i) - 65 - K) % 26 + 26) % 26 + 65)
print(plain.lower())
爱人的眼睛是第八大洋
参考了PolarD&N misc部分爱人的眼睛是第八大洋题解_ctf爱人的眼睛是第八大洋-CSDN博客
和官方题解
先填充一下颜色看菲菲公主

我们打开这个题目的图,这是一个幻影坦克图,我们在菲菲公主的眼中能若隐若现看出来ggbond,用oursecret工具解密
然后是零宽。这里太坑了,出来的base64不能继续解密!直接套上flag
文物追回
图片隐藏有压缩包,现在怀疑wav有信息
wav不是摩斯电码,那就是无线电。用RX SSTV提取
先配置好环境:RX-SSTV与MMsstv配置-CSDN博客
转码出一张图片
这个估计就是密码
it'stooexpensive
然后将他的软件拖进雷电模拟器。点击图片--》揭示图片价格即可
flag:5ba2c63a15dcfecb5297f4688bfc6516
旧事
首先deepsound提取出一个压缩包,里面是一个exe程序
里面的txt是一大段的base64,转为文件看看在线Base64转文件、文件转Base64工具 - BTool 在线工具软件,为开发者提供方便。
是一个具有密码的压缩包

这个应该就是密码
看官网WP说是AES,但是我没看到密钥在哪里,所以直接爆破
爆破出密码:zaijian
然后我们解压

还是隐藏有压缩包,解密,程序拖入IDA分析,在flag函数下看到其实是一个特别简单的加密,写出解密脚本即可】
a='ci^dxfilsbrfk^klqebotloiaz'
b=''
for i in a:b+=chr(ord(i)+3)
print(b)
KFC Crazy Thursday(暂时没有解决)
一眼取证题目,新学到这个工具恢复密钥

里面有一个kgb。kgb就是个压缩包。
kgb这个软件支持KGB、KGE两个格式。这个是KGe,改成KGE,发现需要密码,还得打开内存取证
后面需要从里面提取一张图片,我的坏了,提取不出来
那个图片就是解压密码,然后是foremost分离,LSB隐写。
有待复现
为什么关机又关机
BAT改为TXT,文字下面是零宽隐写AES。

这道题有点坑啊,必须在这个网站解码
文字隐藏加密/解密 - 蜻蜓在线工具
然后得到压缩包密码
同时参考了2025polarctf夏季赛misc复盘全解 - n1tro - 博客园
千万不要直接运行这个Sbexe,否则又要关机
pyc文件提取,这个不会的可以看我以前的逆向博客
里面只是一个关机代码,啥也没有
看属性,有对不起已关机,没想到这个就是压缩包的解压密码。
然后进去用steghide解,密码是女王的威力...有点脑洞了
look_me
参考了官方WP,打开文档提示有宏,wps打开发现说不适用WPS,那我们用自带的打开

右键文件,属性,点击解除绑定,就可以在office启用宏
点击视图->宏,点击宏管理器发现模块1

我们点击创建宏,进去的界面找到了以下代码:
Sub ModifyMysteriousFileOnDesktop()On Error GoTo ErrorHandlerDim fs As Object, ws As ObjectDim desktopPath As StringDim targetFilePath As StringDim newFileName As StringDim fileStream As ObjectDim fileData() As ByteDim hexValues As VariantDim i As IntegerDim fileSize As Long' 创建必要对象Set fs = CreateObject("Scripting.FileSystemObject")Set ws = CreateObject("WScript.Shell")' 获取桌面路径desktopPath = ws.SpecialFolders("Desktop")targetFilePath = fs.BuildPath(desktopPath, "神秘的文件最神秘")' 检查文件是否存在If Not fs.FileExists(targetFilePath) ThenMsgBox "你找谁?"Exit SubEnd If' 获取文件大小fileSize = fs.GetFile(targetFilePath).SizeIf fileSize < 16 ThenMsgBox "什么事儿等会儿说,这地方太小了,下不了脚", vbExclamationExit SubEnd If' 设置要写入的16进制值 (504B030414000808)hexValues = Array(&H50, &H4B, &H3, &H4, &H14, &H0, &H8, &H8)' 以二进制模式读取文件Set fileStream = CreateObject("ADODB.Stream")fileStream.Type = 1 ' 二进制模式fileStream.OpenfileStream.LoadFromFile targetFilePathfileData = fileStream.ReadfileStream.CloseFor i = 0 To 7fileData(i) = hexValues(i)Next inewFileName = fs.BuildPath(desktopPath, "look_me.jar")If fs.FileExists(newFileName) Thenfs.DeleteFile newFileName, TrueEnd IffileStream.OpenfileStream.Write fileDatafileStream.SaveToFile newFileName, 2MsgBox "是的,现在神秘的我,神秘的出现在了你的桌子上", vbInformation, "变身成功"Exit SubErrorHandler:MsgBox "发生错误:" & vbCrLf & _"错误号: " & Err.Number & vbCrLf & _"错误描述: " & Err.Description & vbCrLf & _"请确保文件未被占用且有足够权限", vbCritical, "运行时错误"
End Sub
大概意思是将一串十六进制读取到文件之中,那应该就是题目附件,我们修改16进制,得到一个压缩包

看起来是一个Java程序,后缀改为jar,进去让输入账号密码,我们用jadx分析main.class无果,而后分析login开头的class

上图是我截取的关键代码,第一个md5可以直接查询到,第二个是输入一个密码,就会往bytes数组添加一个1或者0,最终的字符串需要满足md5值,只能写爆破脚本了。这里丢给豆包写了,关键函数就是product。我自己懒得写了。
import hashlib
from itertools import product
import stringdef brute_force_prefix(target_str, target_hash, max_len=5, charset=None):"""在目标字符串前添加前缀进行爆破,匹配目标MD5哈希:param target_str: 基础字符串(如 'es_it's_password'):param target_hash: 目标MD5哈希值(需替换为实际值):param max_len: 前缀最大长度(建议从1开始测试,过大会很慢):param charset: 前缀字符集(默认包含数字、大小写字母、常见符号):return: 匹配的完整字符串(前缀+目标字符串)"""# 枚举前缀长度(从1到max_len,0表示无前缀)for prefix_len in range(0, max_len + 1):print(f"正在测试前缀长度: {prefix_len}(共 {len(charset) **prefix_len} 种组合)")# 生成该长度下所有可能的前缀组合for prefix_tuple in product(charset, repeat=prefix_len):prefix = ''.join(prefix_tuple)# 拼接前缀和目标字符串full_str = f"{prefix}{target_str}"# 计算MD5哈希md5_hash = hashlib.md5(full_str.encode('utf-8')).hexdigest()# 匹配目标哈希if md5_hash == target_hash:print(f"\n✅ 找到匹配!完整字符串: {full_str}")print(f"MD5哈希: {md5_hash}")return full_strprint("\n❌ 未找到匹配的组合")return Noneif __name__ == "__main__":# 目标基础字符串base_str = "es_it's_password"# 目标MD5哈希(请替换为你要匹配的实际哈希值)target_md5 = "7a4de030c6b8511f03233f36b4efd7af" # 例如:"d41d8cd98f00b204e9800998ecf8427e"# 执行爆破(前缀最大长度建议先从3开始测试,再逐步增大)brute_force_prefix(target_str=base_str,target_hash=target_md5,max_len=3, # 可根据实际情况调整(长度越大,耗时指数级增加)# 可选:限制字符集(如只保留数字和小写字母)charset=string.digits + string.ascii_lowercase)
下一步看官网WP
其实这一步找密码官方做法不是这样子。我们右键docm属性,看到这一串

解压这个docm,提取出里面的gif,用工具查看帧间隔,替换就是摩斯密码

出来的摩斯密码可解开软件的登录密码,(这里怀疑是md5碰撞)登陆密码根据刚才加密逻辑对应了一个二进制串,我们拼接后就是我的脚本爆破出的内容。
随后,我们解压jar文件,提取出里面的媒体资源。用deepsound提取wav内隐藏文件,oursecret‘提取mp4隐藏文件,foremost提取png隐藏文件。他们是一个压缩包分成了三部分,用010组合到一起即可。解压密码就是我刚才爆破出的内容
with open('part1','r+b') as p1, open('part2','r+b') as p2, open('part3','r+b') as p3,open("result.zip",'wb') as result:a=p1.read()b=p2.read()c=p3.read()result.write(a+b+c)
这里太坑了,foremost提取的不对,因为后面还有个损坏的504B干扰咱们。必须手工筛选。

无限解
压缩包打开后下方备注有一串0x6E 0x69 0x78 0x75 0x79 0x61 0x6F 0x6E 0x61 0x6F 0x7A 0x69。翻译出来是你需要脑子,这不是嘲讽我吗
