攻防世界reverse_html

Sher10ck 发布于 2026-01-18 324 次阅读


题目只给了一个challenge文件

因为没给后缀,我们直接拖到010中查看文件头如下图所示,可以看出文件开头为ITSF标准的chm文件头

确定完文件格式之后,用windows自带的hh.exe解包得到里面内容

hh.exe -decompile tmp/ challenge

解包可以得到几个文件,找到doc.htm在开头发现一段很奇怪的代码,同时有一串很长的base64代码,解密查看一下

用cyberchef解密的时候会有nul在中间,原因是编码方式不对,在base之后插入decode text(文本解密)改成utf-16小端就可以复制粘贴了

先进行base64解码,然后转为字节流,通过Deflate解压缩字节流,然后终端读取并以ascII写入

可以发现题目是对doc.chm进行读取,然后在8*x的位置进行记录,并将此后的字节打印出来进行base64解码,用cyberchef初步解码发现有很多提示,确定就是一个exe文件,解出文件拖入ida查看

import base64
import os

def extract_and_fix_payload(source_file, output_name="fixed_payload.exe"):
    marker = b"xxxxxxxx"
    try:
        print(f"[*] 正在读取 {source_file} ...")
        with open(source_file, "rb") as f:
            content = f.read()

        # 1. 寻找标记
        offset = content.find(marker)

        # 2. 截取数据
        raw_payload = content[offset + 8:]

        # 3. Base64 解码
        try:
            decoded_data = base64.b64decode(raw_payload)
            print(f"[+] 解码成功,原始数据大小: {len(decoded_data)} 字节")
        except Exception as e:
            print(f"[-] Base64 解码失败: {e}")
            return
        # 检查当前开头是不是已经是 MZ (防止重复添加)
        if decoded_data.startswith(b'MZ'):
            print("[!] 警告: 看起来原本就有 MZ 头?脚本将跳过修复,直接保存。")
            final_data = decoded_data
        else:
            print("[*] 检测到缺失 MZ 头,正在进行修复 (Prepend 'MZ')...")
            # 在最前面拼接 b'MZ' (0x4D 0x5A)
            final_data = b'MZ' + decoded_data

        # 5. 保存文件
        with open(output_name, "wb") as out_f:
            out_f.write(final_data)

        print(f"[+] 修复完成! 文件已保存为: {output_name}")
        print(f"[*] 修复后数据大小: {len(final_data)} 字节")
        print("[>] 现在你可以尝试分析这个 exe 文件了。")

    except Exception as e:
        print(f"[-] 发生错误: {e}")

if __name__ == "__main__":
    extract_and_fix_payload("doc.chm")

进入发现是一个结构很清晰的加密逻辑

同时一眼看出是aes轮密钥手法直接解密得到flag即可

解密即可得到flag: flag{thisisit01}

此作者没有提供个人介绍。
最后更新于 2026-01-18