Windbg调试win登录用户密码验证过程

来源:互联网 发布:中国植物信息数据库 编辑:程序博客网 时间:2024/05/01 15:46

写在前面:

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.com/Articles/79241/Bypassing-Windows-XP-Logon-Password-using-bootkit

 

winlockpwn 项目中利用1394修改物理内存的MsvpPasswordValidate代码绕过windows密码:

http://esec-lab.sogeti.com/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.com/showthread.php?t=156643&highlight=sekurlsa

http://bbs.pediy.com/showthread.php?t=163383&highlight=sekurlsa+dllWindbg调试win登录用户密码验证过程

0 0
原创粉丝点击