攻破160个CrackMe 挑战之 046:破解keyme1 x64dbg 调试 + GetVersionExA
2023-09-05 00:28:54
在信息安全领域中,逆向工程是一项必不可少的技能,它可以让我们深入了解软件的内部运作,识别漏洞,并制定安全策略。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 操作系统的内部机制有了更深入的了解。