☆ SampSecretSessionKey
http://scz.617.cn/windows/200401131432.txt
SampSecretSessionKey是samsrv.dll中定义的一个全局变量,参看flashsky、Nicola Cuomo的文章([11]、[13])理解它的意义。
Nicola Cuomo在主页上本来只提供了二进制文件下载以及一小篇简短分析。我写信问 他可否将源代码给我,这位老兄相当热情,说没问题,只是需要清理一下源代码再发 布,让我一周内检查他的主页。过了一周,我都搞清楚这整个过程了,他还没动静, 就又写了封信问他,顺便将我已经搞清楚的部分告诉他,这次他倒爽快,说是自己一 向比较懒,现在已经发布全套源代码。
逆向分析samsrv.dll中如下函数,验证flashsky、Nicola Cuomo的结论:
SampInitializeSessionKey KEDecryptKey
ACCOUNT_F_VALUE : 02 00 01 00 00 00 00 00 C0 4D 55 34 10 BC C2 01 : D8 00 00 00 00 00 00 00 00 80 A6 0A FF DE FF FF : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 : 00 CC 1D CF FB FF FF FF 00 CC 1D CF FB FF FF FF : 00 00 00 00 00 00 00 00 EC 03 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00 01 00 00 00 03 00 00 00 : 01 00 00 00 01 00 01 00 01 00 00 00 38 00 00 00 : 0E 13 6D 8F 01 17 04 DE D8 71 1A 32 43 92 8A A0 : 54 30 21 81 56 76 7B D5 D6 EC 9D AD FE 7A 8E 16 : 50 7D 76 53 CC A3 54 CD 33 4D 67 BD C3 F0 C6 52 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 : (HKEY_LOCAL_MACHINE\SECURITY\SAM\Domains\Account\F) ACCOUNT_F_VALUE_A : 0E 13 6D 8F 01 17 04 DE D8 71 1A 32 43 92 8A A0 MagicStringA : 21 40 23 24 25 5E 26 2A 28 29 71 77 65 72 74 79 : 55 49 4F 50 41 7A 78 63 76 62 6E 6D 51 51 51 51 : 51 51 51 51 51 51 51 51 29 28 2A 40 26 25 00 : ("!@#$%^&()qwertyUIOPAzxcvbnmQQQQQQQQQQQQ)(@&%") BOOTKEY/SYSKEY : EE 88 3F 3D C1 F2 AF DE C5 75 1F 31 75 5F 4B 0D MagicStringB : 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 : 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 : 32 33 34 35 36 37 38 39 00 : ("0123456789012345678901234567890123456789") MD5/RC4KEY : 83 B3 19 2F 34 41 FB 10 2D CB 8C AC 98 FE DD 8E ACCOUNT_F_VALUE_B/RC4 IN : 54 30 21 81 56 76 7B D5 D6 EC 9D AD FE 7A 8E 16 : 50 7D 76 53 CC A3 54 CD 33 4D 67 BD C3 F0 C6 52 RC4 : CA 7C 56 6F 36 9F 17 64 CC 30 77 3E 00 A5 67 60 : 7E DC AC CD F7 D5 01 72 E8 63 4A 26 58 28 D5 BF SampSecretSessionKey : CA 7C 56 6F 36 9F 17 64 CC 30 77 3E 00 A5 67 60
读取"HKEY_LOCAL_MACHINE\SECURITY\SAM\Domains\Account\F"的数据,取偏移0x70 处的16字节,即ACCOUNT_F_VALUE_A,取偏移0x80处的32字节,即ACCOUNT_F_VALUE_B。
按上述顺序将ACCOUNT_F_VALUE_A、MagicStringA、BOOTKEY、MagicStringB拼接到一 个缓冲区中,对该缓冲区求MD5单向哈希值,生成的16字节做为RC4KEY。
将ACCOUNT_F_VALUE_B做为RC4的输入数据,求出32字节的RC4输出数据,前16字节即 传说中的SampSecretSessionKey。可用SoftICE跟踪getlmhashdll到lsass.exe中,观 察全局变量是否与所求得的值一致。
上述数据是经严格验证过的、来自实际环境的,可做为验证集存在。有时候单纯的自 然语言描述、C语言描述并不比一个直接演示的效果好,我这次费了老劲了,就因为 缺乏验证集。
☆ 参考资源
[11] SAM的散列存储加密解密算法以及SYSKEY的计算 - flashsky[2003-06-04] http://www.xfocus.net/releases/200306/a550.html
[13] Windows 2k/NT/XP's syskey encryption - Nicola Cuomo http://studenti.unina.it/~ncuomo/syskey/syskey.txt