返回介绍

侦查挑战

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

好,就如前面提到的,我们在本文将进行栈溢出挑战。HackSysTeam 提供给了我们驱动的源代码,我们也可以看看相关的部分!

NTSTATUS TriggerStackOverflow(IN PVOID UserBuffer, IN SIZE_T Size) {
  NTSTATUS Status = STATUS_SUCCESS;
  ULONG KernelBuffer[BUFFER_SIZE] = {0};
 
  PAGED_CODE();
 
  __try {
    // Verify if the buffer resides in user mode
    ProbeForRead(UserBuffer, sizeof(KernelBuffer), (ULONG)__alignof(KernelBuffer));
 
    DbgPrint("[+] UserBuffer: 0x%p\n", UserBuffer);
    DbgPrint("[+] UserBuffer Size: 0x%X\n", Size);
    DbgPrint("[+] KernelBuffer: 0x%p\n", &KernelBuffer);
    DbgPrint("[+] KernelBuffer Size: 0x%X\n", sizeof(KernelBuffer));
 
#ifdef SECURE
    // Secure Note: This is secure because the developer is passing a size
    // equal to size of KernelBuffer to RtlCopyMemory()/memcpy(). Hence,
    // there will be no overflow
    RtlCopyMemory((PVOID)KernelBuffer, UserBuffer, sizeof(KernelBuffer));
#else
    DbgPrint("[+] Triggering Stack Overflow\n");
 
    // Vulnerability Note: This is a vanilla Stack based Overflow vulnerability
    // because the developer is passing the user supplied size directly to
    // RtlCopyMemory()/memcpy() without validating if the size is greater or
    // equal to the size of KernelBuffer
    RtlCopyMemory((PVOID)KernelBuffer, UserBuffer, Size);
#endif
  }
  __except (EXCEPTION_EXECUTE_HANDLER) {
    Status = GetExceptionCode();
    DbgPrint("[-] Exception Code: 0x%X\n", Status);
  }
 
  return Status;
}

这里展示了含有漏洞的代码,同时也给出了解决的方案。 RtlCopyMemory 使用一个指向 kernel buffer 的指针,一个 input buffer 的指针以及一个指定拷贝字节数的整型数。显然这里有点故事,在有漏洞的版本中,buffer 尺寸是基于 input buffer 的尺寸,而安全版本中尺寸被严格限制到了 kernel buffer 的大小。如果我们调用到该函数,传递一个尺寸大于 kernel buffer 的 input buffer,就会发现一些端倪。

好,让我们看看 IDA 中的 IrpDeviceIoCtlHandler 表,这里驱动程序比较了输入的 IOCTL 码,找到识别它的例程。

有相当数量的 IOCTL!转到图形的左侧可以看到下面的内容:

可以看到如果 IOCTL 码是 0x222003,我们就会转入到 TriggerStackOverflow 函数的调用分支。花些时间来调查一下这一 switch 语句。最基本的,输入 IOCTL 通过比较大小来进行匹配,一路递减直到找到一个合法的码值或干脆命中最后的"Invalid IOCTL…"。

看看 TriggerStackOverflow 函数,我们或多或少可以看到在源码中发现的内容,注意到 kernel buffer 长度为 0x800(2048)。

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

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

发布评论

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