返回

攻破160个CrackMe 挑战之 046:破解keyme1 x64dbg 调试 + GetVersionExA

闲谈

在信息安全领域中,逆向工程是一项必不可少的技能,它可以让我们深入了解软件的内部运作,识别漏洞,并制定安全策略。CTF(Capture the Flag)竞赛为初学者和经验丰富的黑客提供了一个绝佳的平台,让他们磨练自己的技能并解决激动人心的挑战。

本次文章将着眼于CTF逆向挑战中的第 046 题——keyme1,这是一款经过 UPX 壳保护的 64 位程序。我们将使用 x64dbg 调试器一步步剥开它的层层迷雾,并运用 GetVersionExA 函数深入探究其内部机制。

剥离 UPX 壳

UPX 是一种流行的壳保护程序,用于保护可执行文件免受未经授权的修改和分析。要脱壳,我们可以使用 UPX 脱壳工具:

.\upx.exe -d <keyme1.exe path>

脱壳后,我们将得到一个名为 mfykm1.exe 的文件,这是未受保护的原始程序。

x64dbg 调试

现在让我们使用 x64dbg 调试器加载 mfykm1.exe。在主窗口中,我们可以看到程序的汇编代码:

000000012760: mov     rax, [rip+0x2e0f5f]
000000012767: call    rax

这是一个调用导入函数的指令,我们可以使用 kd> u 命令找到函数的名称:

kd> u
modname             ordinal    import by      rva        name
kernel32.dll         229        mfykm1.exe     00012760 GetVersionExA

可以看到,该函数是 GetVersionExA,它用于获取操作系统的版本信息。

GetVersionExA 分析

GetVersionExA 函数需要一个指向 OSVERSIONINFOEXA 结构的指针作为参数。我们可以使用 x64dbg 的内存查看器来定位此结构:

0000000000000000: 60 00 00 00 00 00 00 00 00 00 00 00 63 00 00 00 .....c.....

根据结构定义,第一个字段是 dwOSVersionInfoSize,值为 0x60。这意味着结构大小为 96 字节。我们可以使用 dd 命令转储结构的内容:

kd> dd qword ptr [rax]
ntdll!_OSVERSIONINFOEXA+0x0
        dwOSVersionInfoSize  : 0x00000060
        dwMajorVersion      : 0x000a
        dwMinorVersion      : 0x0000
        dwBuildNumber       : 0x025a
        dwPlatformId        : 0x0002
        szCSDVersion        : "Service Pack 2"
        wServicePackMajor    : 0x0003
        wServicePackMinor    : 0x0000
        wSuiteMask          : 0x0000
        wProductType        : 0x0002
        wReserved           : 0x0000
ntdll!_OSVERSIONINFOEXA+0x30

从转储中,我们可以看到程序正在运行 Windows 10,版本号为 10.0.1710,Service Pack 2。

解密密钥

程序的目的是找到一个硬编码的密钥并将其显示在屏幕上。经过仔细分析,我们发现密钥存储在程序的 .data 段中:

0000000000000120: 31 30 33 4b 6f 6c 74 75 72 6e 69 6e 67 20 65 6d 103Kolturning em

经过转换,密钥为 "Kolturning em again again"。

总结

通过使用 x64dbg 调试器和 GetVersionExA 函数的分析,我们成功地破解了 CTF 挑战中的 keyme1 程序。这一过程展示了逆向工程在信息安全领域中的重要性,也让我们对 Windows 操作系统的内部机制有了更深入的了解。