欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

运用DLL加载延迟达到远程代码注入的方法

来源:本站整理 作者:佚名 时间:2017-09-25 TAG: 我要投稿

在本文中,咱们将为读者详细先容一种新型的长途代码注入技巧,实际上,这类技巧是我在鼓捣提早加载DLL时发觉到的。经由进程该技巧,只需这些进程实现了本文所应用的功效:提早加载DLL,攻击者可以或许将随意率性代码注入到正在运转的任何长途进程中。更精确的说,这并不是一个破绽漏洞bug应用,而是一种潜入其余进程的战略。
当代的代码注入技巧平日依赖于两个分歧的win32 API挪用的变体:CreateRemoteThread和NtQueueApc。然则,近来有人颁发了一篇异常棒的文章[0],详细先容了十种进程注入的方法。固然,这些方法并不是都能注入到长途进程中,特别是那些已经在运转的进程,但那篇文章针对最罕见的各类注入技巧停止了异常过细的讲授,这一点是难能可贵的。而本文先容的这个战略更像是inline hooking技巧,不外咱们没有用到IAT,而且也不哀求咱们的代码已经位于该进程中。咱们不必要挪用NtQueueApc或CreateRemoteThread,也不必要挂起线程或进程。然则,凡事都邑或多或少有一些限定,详细情况将在后文中详细先容。
提早加载DLL
提早加载是一种链接器战略,即容许提早加载DLL。可履行文件平日会在运转时加载一切必须的静态链接库,而后履行IAT修复。 然则,提早加载技巧却容许这些库直到挪历时才加载,为此,可以或许在第一次调时应用伪IAT停止修复处置。这个进程用下图来停止完美的阐释:

上图来自1998年Microsoft宣布的一篇异常棒的文章[1],只管该文所描写的战略已经异常棒了,然则这里咱们会想法让它更上一个台阶。
平日PE文件中都含有一个名为IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT的数据目次,您可以或许应用dumpbin/imports或windbg停止检查,其布局描写详见delayhlp.cpp中,读者可以或许在WinSDK中找到它:
struct InternalImgDelayDescr {
    DWORD           grAttrs;        // attributes
    LPCSTR          szName;         // pointer to dll name
    HMODULE *       phmod;          // address of module handle
    PImgThunkData   pIAT;           // address of the IAT
    PCImgThunkData  pINT;           // address of the INT
    PCImgThunkData  pBoundIAT;      // address of the optional bound IAT
    PCImgThunkData  pUnloadIAT;     // address of optional copy of original IAT
    DWORD           dwTimeStamp;    // 0 if not bound,
                                    // O.W. date/time stamp of DLL bound to (Old BIND)
    };
这个表内寄存的是RVA,而不是指针。 咱们可以或许经由进程剖析文件头来找到提早目次的偏移量:
0:022> lm m explorer
start    end        module name
00690000 00969000   explorer   (pdb symbols)         
0:022> !dh 00690000 -f
File Type: EXECUTABLE IMAGE
FILE HEADER VALUES
[...]
   68A80 [      40] address [size] of Load Configuration Directory
       0 [       0] address [size] of Bound Import Directory
    1000 [     D98] address [size] of Import Address Table Directory
   AC670 [     140] address [size] of Delay Import Directory
       0 [       0] address [size] of COR20 Header Directory
       0 [       0] address [size] of Reserved Directory
第一个entry及其提早链接的DLL可以或许在如下内容中看到:
0:022> dd 00690000+ac670 l8
0073c670  00000001 000ac7b0 000b24d8 000b1000
0073c680  000ac8cc 00000000 00000000 00000000
0:022> da 00690000+000ac7b0
0073c7b0  "WINMM.dll"
这意味着WINMM是静态地链接到explorer.exe的,因为是提早加载,以是在导入的函数被挪用以前,它是不会被加载到进程中的。一旦加载,赞助函数将经由进程应用GetProcAddress来定位目标函数并在运转时修复这个表,从而实现IAT的修复事情。
援用的伪IAT与尺度PE IAT是离开的;该IAT专用于提早加载功效,并经由进程提早描写符停止援用。比方,就WINMM.dll来讲,WINMM的伪IAT为RVA 000b1000。第二个提早描写符entry的伪IAT具备零丁的RVA,其余依此类推。
下面咱们应用WINMM来讲明提早加载,资本管理器会从WINMM中导入一个函数,即PlaySoundW。在我实验中,它没有被挪用,以是伪IAT尚未修复。 咱们可以或许经由进程转储的伪IAT条款来检查这一点:

[1] [2] [3] [4]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载