【问题标题】:The confusing base address between kernel32.dll and kernelbase.dllkernel32.dll 和 kernelbase.dll 之间令人困惑的基地址
【发布时间】:2014-03-24 15:10:32
【问题描述】:

据说struct PEB_LDR_DATA的偏移量0x1C上存储了指向In InitializationOrderModuleList的头指针,对吗?

除此之外,In InitializationOrderModuleList 的第二个节点应该是kernel32.dll,但是,当我找到第二个节点时,发现它不是kernel32.dll 的基地址,而是类似于@987654326 @,怎么解释?

谢谢!

【问题讨论】:

    标签: windows kernel32


    【解决方案1】:

    您依赖于未记录的实现细节,并且遇到了更新的实现。

    不保证实现细节保持不变。

    此特定细节似乎已更改为使用缓冲区溢出错误提供针对代码注入攻击的深度防御。

    【讨论】:

    • 具体来说,如何编写汇编代码来定位kernel32.dll的基地址?这个问题困扰了我好几天...
    • @RichardMorning:与在 C 代码中的做法相同:将字符串 "kernel32.dll" 从同一系统上的任何进程传递给 GetModuleHandleA。有意地远程执行注射不再容易。这就是 ASLR 的全部意义所在。
    • 谢谢。但是我正在尝试将一段代码插入到溢出的缓冲区中……如果我使用反汇编的C代码,会带来太多的开销,加上缓冲区不够大……
    • @RichardMorning:我希望你不会感到惊讶,现代操作系统的功能旨在防止缓冲区溢出允许任意代码执行,事实上,使使用缓冲区溢出执行任意代码变得更加困难.
    • 我刚才尝试了一下,又失败了……下面是我的汇编代码:xor edx,edxmov ebx,fs:[0x18]mov ebx,[ebx+0x30]mov ecx,[ebx+0x0c]mov ecx,[ecx+0x1c]mov ecx,[ecx+0x1c]mov ecx,[ecx]mov ebx,[ecx+0x08]@987654331 @。它应该找到TEB,然后是PEB,然后是struct PEB_LDR_DATA,然后是InInitializationOrderModuleListkernel32.dll 应该是列表的第二个。然而这段代码又找到了kernelbase.dll...这很令人沮丧...
    【解决方案2】:

    这里的 cmets 是正确的,您正在对动态加载 kernel32.dll 的 Windows 进行新的(此时实际上已经很老了)更改。您尝试的策略在 Vista 之后停止工作。

    当然,这并不意味着你不能。这个策略对我很有效:

    http://blog.harmonysecurity.com/2009_06_01_archive.html

    【讨论】:

      猜你喜欢
      • 2011-08-09
      • 2010-12-23
      • 2022-01-21
      • 2022-01-17
      • 2018-02-26
      • 1970-01-01
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      相关资源
      最近更新 更多