绕过win2003堆栈保护机制的新方法

Windows内存保护机制及绕过方法 0 目录 GS编译 SafeSEH机制 SEH覆盖保护 数据执行保护(DEP) 地址随机化(ASLR) 1 GS编译 1.1 基本原理 Windows操作系统为解决栈溢出漏洞的问题引入了一个对策——GS编译保护技术。 GS编译保护技术是通过编译时添加相关代码而实现的,开启GS 编译选项后会在函数的开头和结尾添加代码... 阅读详情

最近两年来windows的堆栈溢出问题变得愈来愈流行了。本文向读者介绍了常用的堆栈漏洞发现方法为啥对新平台(xp sp2和win 2003)不适用了,因为微软修改了winxp,winxp sp1,和win2000的堆栈保护机制。文章告诉读者如何绕过第一层保护,来触发内存中的数据覆写。

Windows的堆栈溢出的概览

堆栈是一块块连续的内存结合,当一个程序要动态分配内存时,分配的动作将发生在堆栈中,象malloc(),GlobalAlloc(), LocalAlloc()和HeapAlloc()等功能函数只是核心函数RtlAllocateHeap()的外衣,由ntdll.dll文件提供的 API负责在堆栈中分配内存。还有其他的Rtl*Heap()函数,负责生成和撤销堆栈,以及处理堆栈中的内存块。每个内存块都含有一个头,这个头详细描述了本块和前一块的大小,块是否正在忙的状态,以及该块位于内存的哪个段位中,块头一般是8位长,接着是块在实际存储区域。如果块空闲,则有两个针指向该标准头,这些针叫Flink和Blink,就是'前连'和'后连'的意思。参考图

当溢出发生时,当前临近块的指示头的结构就被覆写了,通过伪造‘恶意’值,将引起后续的堆栈操作,就可能触发一个任意的4字节内存覆写。其实这只是发现堆栈机制的一个简单方法-叫做'切断连接'。假设我们来溢出一个自由块中的内容,以下2条汇编指令可以完成'切断连接'的过程:

mov [reg1], reg2 ; reg1=Flink

mov [reg2+4], reg1 ;reg2=Blink



这样伪造了Flink和Blink并导致4字节内存覆写后,下一步就可以获得控制权了。

Windows堆栈保护简介

常见的堆栈保护技术在windows XP,windows XP SP1和win2000等操作系统中使用得很好。但是随着windows 2003的出现,微软为了在分配和解除内存块之前验证块的有效性,对堆栈的管理例程和结构进行了修改,主要有:

在块头部分引入了‘安全标记项’(security cookie),块一旦被分配,该项就被检查以确保没有溢出发生;

执行'切断连接'动作时,Flink和Blink指针也要作同样的检验,如果想发现堆栈溢出,黑客就必须克服这个标记验证项。同时微软还引入了其他一些保护措施,主要是进程环境块随机化、特殊指针重新编码等,目的都是要减少那些‘固定的’和‘大家都知道的’函数指针的数量,这些指针通常能被全局的系统进程使用,也成为了黑客喜欢利用的目标特权。

新机制仍有缺陷

新保护机制并非100%免疫堆栈溢出,第一个公布的绕过新堆栈保护机制的方法,是针对了'边查表'(lookaside)列表的不存在校验的缺点提出的。'边查表'的第一个dword项,作为内存块简单连接表的开始,被标记为‘忙’ 的状态,但却可以随时接受内存分配。当内存分配发生时,返回值可能是相应的'边查表'的开始区域:在'边查表'中只是用新分配区域块的Flink指针简单替换'边查表'中原先的Flink指针。过程见图

 :

这种破解新机制的方法理论上不错,但实现起来比较麻烦,而且难以使用。如果我们需要做n个字节的覆写内存动作,必须执行以下6条:

1.分配n字节的区域(n<1016字节)

2.解除该区域:该区域在边查表中有登记

3.溢出发生在当前临近的区域中:我们可以用Flink指针操作当前空闲的区域

4.n个字节的区域被分配:我们伪造出来的指针被写进'边查表'

5.n个字节的第二个区域被分配:我们伪造的指针返回

6.从控制输入拷贝一个操作到缓冲区执行:这些字节被写进我们选中的位置。

可以看出,在程序中要实现上述绕过方法很难,因为堆栈必须有一个活动的而且是未上锁的'边查表'存在,才能使该方法奏效。

绕过堆栈保护机制的另外一个方法

这种方法至少覆写掉内存中的4个字节,通过溢出存储在进程默认堆栈中的特殊结构来实现。和系统生成的其他堆栈一样,进程默认堆栈被许多windows应用编程接口用来存放与进程相关的信息和环境值。当一个DLL库被加载后,主函数被执行,通常情况下数据可以被存放在进程堆栈中,如果这些数据片断被覆写该怎么办?

实际上即便是最简单的程序,象windows的记事本程序,也需要运行很多库文件来支持,仔细察看默认堆栈中的内存块,可以看到这些块有40个字节的长度,其中块头长度是8个字节。

结构如图

图中A是下一个40字节长的结构的地址,B是当前40字节长结构的地址。

注意:如果使用debugger创建这些结构,长度将变为56字节,多出的16字节是由"debug_process"标志产生的。

A和B行使了Blink和Flink指针的功能。X指向的结构实际上是'临街断面','临街断面'一旦初始化建立后,就会相应副产出一个40字节长的连接结构用来跟踪临街断面,这些结构有些位于ntdll.dll动态库文件的数据区;当他们都被使用了,连接结构就被生成在默认堆栈中了。

如图

显示了一个进程的所有'临界断面'是如何连接在一起的。双连接的表提醒我们堆栈管理例程应该如何解除内存区块(chunks),破坏一个‘临界断面 ’的过程中,我们也将把与之相应的连接结构从表中删除掉,如果我们交换A和B,我们就应该可以覆写掉4字节的内存。实际上,我们可以用debugger很容易地发现负责处理解除连接进程的代码。(使用debugger用错误地址把A和B交换,从而去除临界断面,引发内存冲突)。以下汇编行被 RtlDeleteCriticalSection执行,需要配合的ntdll.dll文件版本是5.1.2600.2180:



mov [eax], ecx ; eax=B

mov [ecx+4], eax; ecx=A

进程终止过程中,会导致临界断面的破坏,这一点将确保覆写动作可以发生。



取得控制权

基于堆栈的缓冲溢出攻击的第一步是覆写内存;第二和第三步是选用恰当的值和位置来执行覆写。XP SP2以后由于引入新内存保护机制,原先的两种攻击方法(固定调用指令指针异常处理法、负载指针进程环境区域函数指针):

原先的异常处理函数有固定的调用地址,由kernel32.dll文件提供的,SP2以后引入新保护机制,真实的调用地址被系统 NtQueryInformation进程生成的参数模糊掉了(xor-ed),新机制由ntdll.dll文件提供RtlEncodePointer函数;

进程环境区域的位置也是随机确定的,所以使用原先的固定调用地址法,象调用AcquireFastPebLock或 ReleaseFastPebLock来覆写内存将失效。新的保护机制同样被植入了windows 2003 sp1系统中,windows 2003 sp0系统仅采用了普通堆栈保护机制。

结论和参考代码

通常情况进程结束时临界断面结构将被销毁,这样就意味着为了引发覆写动作就必须强制生成一个能够摧毁程序的潜在攻击代码,而且溢出必须发生在进程默认堆栈中,需要一个最小的弹性方法来覆写一个联表机构。但是在最新版的windows系统中生成一个内存覆写动作也是可能的,内存覆写是实现堆栈溢出攻击的前提步骤.

实现该方法的参考代码:

/*

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

Simulates a heap overflow in a critical section linking structure,

and trigger a memory overwrite

Works with Microsoft Windows XP SP2 and Windows 2003 SP1

(c) Nicolas Falliere, 2005

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

*/

#include

#include



// Saved initial "Cookie" buffer

const BYTE  init_buffer[] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxx";

// "Cookie" buffer

BYTE  buffer[] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxx";

LONG UEF(EXCEPTION_POINTERS *pEx)

{

printf("/n-- In Final Exception Filter... ---/n");

printf("Cookie=%s/n", buffer);

getchar();

ExitProcess(-1);



// Useless

return EXCEPTION_CONTINUE_SEARCH;

}



int main(void)

{

HANDLE            hHeap;

DWORD             *p;

INT               i;

CRITICAL_SECTION  cs[100];



hHeap = GetProcessHeap();

SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)UEF);

printf("Cookie=%s/n/n", buffer);

// Createa a critical section

for(i = 0; i < 300; i++)

{

InitializeCriticalSection(&cs[i]);

p = (DWORD *)(cs+i);

// Checks the linking structure is located on the heap

// Pre-allocated linking structures in ntdll's data section get

// busy pretty quickly

if((p[0] > (DWORD)hHeap) && (p[0] < ((DWORD)hHeap + 0x10000)))

break;

}

printf("=> Critical section created/n");

printf("=> Linking structure at: %08x/n", p[0]);



p = (DWORD *)p[0];

printf("=> Before modification : A=%8X B=%8X/n", p[2], p[3]);

p[2] = 0x41414141;

p[3] = (DWORD)buffer;

printf("=> After modification  : A=%8X B=%8X/n", p[2], p[3]);



// This triggers the overwriting, and the exception

DeleteCriticalSection(cs+i);

// You should not see that (

printf("=> Critical section deleted/n");

return 0;

}

代码结尾

Windows调试和利用第部分:NTQuerySystemInformation 本文介绍了NTQuerySystemInformation函数的用法,并提供了获取进程列表的示例代码。然后,我们再次调用NtQuerySystemInformation函数来获取实际的系统进程信息。在Windows操作系统中,NTQuerySystemInformation函数是一个强大的调试和利用工具。本文将详细介绍NTQuerySystemInformation函数的用法,并提供相应的源代码示例。需要注意的是,NTQuerySystemInformation函数的使用需要管理员权限或系统调试权限。 阅读详情

相关推荐

手把手教你用UM982搭建厘米级RTK定位系统(附避坑指南)

本文详细介绍了如何使用UM982模组搭建厘米级RTK定位系统,涵盖硬件连接、软件配置和深度优化技巧。UM982支持BDS、GPS、GLONASS和Galileo等多系统全频点信号,特别适合精准农业、无人机导航等高精度应用场景。通过实战案例和避坑指南,帮助开发者快速实现厘米级定位精度。

y7z8a的博客 1407

linux关闭栈保护机制,禁用GCC中的堆栈保护不起作用

我正在尝试使用带有strcpy的经典溢出使用此函数重新创建堆栈缓冲区溢出:#include #include void main(int argc, char **argv) {char buf[100];strcpy(buf,argv[1]);printf("Done!\n");}我已经尝试使用所有各种标志进行编译,以便删除堆栈保护gcc -o vuln vuln.c -fno-stack-pr...

weixin_42129970的博客 2044

深入解析Linux Suspend/Resume机制——从用户态到内核态的完整流程

本文深入解析Linux Suspend/Resume机制,从用户态触发到内核态执行的完整流程。详细介绍了三种挂起模式(Freeze、Standby、Suspend to RAM)的实现原理,包括系统调用入口、状态验证、设备挂起流程及平台相关操作。同时提供实战调试技巧,帮助开发者解决电源管理中的常见问题。

weixin_29313239的博客 443

Microsoft Edge 和 Google Chrome更新后,出现错误代码:STATUS_STACK_BUFFER_OVERRUN,有效解决办法记录【已解决】

浏览器报错STATUS_STACK_BUFFER_OVERRUN有效解决方案

qq_41845402的博客 4594

从零到一:树莓派上的YOLO目标检测实战指南

本文详细介绍了如何在树莓派上部署和优化YOLO目标检测模型,从硬件选型到系统配置,再到模型转换与推理优化。通过对比不同树莓派型号的性能差异,提供实用的配置方案和代码示例,帮助开发者快速实现高效的边缘计算视觉系统。特别推荐使用ONNX格式进行模型转换,以提升在树莓派上的推理效率。

weixin_29046035的博客 1063

3. LangGraph快速入门

本示例中,我们将使用 Claude Sonnet 4.5 模型,并定义加法、乘法、除法工具。# 定义工具@toolArgs:"""@toolArgs:"""@toolArgs:"""# 为大模型绑定工具图的状态用于存储消息和大模型调用次数。LangGraph 中的状态在整个智能体执行过程中保持持久化。使用带的Annotated类型可以确保新消息追加到现有列表,而不是替换列表。模型节点用于调用大模型,并决定是否调用工具。return {],

Long_像风一样自由 842

使用ret2libc攻击方法绕过数据执行保护

本文介绍ret2libc攻击方法,可以绕过栈执行保护安全机制

海枫的专栏 2万+

30. 如何使用 SEGW 的 redefine 功能对 SAP 标准 OData 服务进行扩展

SAP 发布了很多标准的 Fiori 应用,可以通过笔者的文章里提到的进行浏览。比如 My Opportunities 就是 SAP CRM 领域的一个 Fiori 应用:下图是 Opportunity 明细页面的 Info 标签页:假设我们想在这些标准字段的末尾增添一个新字段 Created By,用来维护当前 Opportunity 的创建者。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1170

对抗栈溢出的安全机制及其绕过方法(作业)

栈溢出是一种常见且严重的安全漏洞,攻击者通过向栈中输入超出预期的数据,可能导致程序崩溃、数据泄露,甚至执行恶意代码。随着网络攻击技术的发展,反栈溢出安全机制不断演进,但攻击者也在寻找新的绕过方式。本文将详细探讨常见的对抗栈溢出的安全机制,分析其绕过手段,并结合一些近年的CVE漏洞实例,具体分析漏洞产生的原因和防御方法。

m0_74105111的博客 761

【MuJoCo】第一章 仿真环境的搭建与入门

它通过优化的接触动力学算法,能够高效处理复杂的多体交互,这使其成为从机械臂操控到足式机器人运动,再到大规模强化学习训练的理想选择。特别是与 JAX 集成的 MJX 的推出,将高性能仿真的边界推向了新的高度,使得在单台机器上并行数千个仿真环境成为可能。我们将通过编写您的第一个仿真程序,逐步拆解 MuJoCo 的工作流,让您亲手感受物理引擎的脉动。这种加速能力对于需要海量仿真样本的强化学习算法(如 PPO)是颠覆性的,它将原本需要数小时的训练缩短到几分钟。上的几何形状,用于碰撞检测和可视化。

u012133341的博客 368

Altium Designer (AD) 设计软件高频面试题及参考答案(3万字长文)

在Altium Designer(AD)中,设计复用是一种关键的策略,它允许设计师在多个项目中重复使用经过验证的设计元素,如原理图符号、PCB布局、元器件封装和设计规则集。在Altium Designer (AD) 中,手动布线和交互式布线是PCB设计中常见的两种布线模式,它们提供了设计师对布线路径的直接控制,特别是在处理复杂或关键信号路径时尤为有用。在Altium Designer (AD) 中进行电路级仿真是一项重要的设计验证步骤,它允许设计师在实际制造之前对电路的行为进行预测和分析。

大模型大数据攻城狮的专栏 4782

操作系统安全

操作系统安全

m0_75056154的博客 407

1.4 KFD 设备文件的获取与驱动握手协议

本文分析了OpenClose模块中libhsakmt与KFD内核驱动建立通信的过程。首先通过hsaKmtOpenKFD()函数打开/dev/kfd设备文件,建立用户态与内核态的通信通道。随后通过AMDKFD_IOC_GET_VERSION ioctl命令完成版本握手,确认双方的接口兼容性。KFD驱动采用Major.Minor二级版本号体系,当前主要版本为1,从1.1演进到1.19不断添加新功能。整个过程构成了用户态与内核态之间的"建连协议",是所有后续GPU操作的基础前提。

图形/计算GPU的驱动与虚拟化技术分享园地 600

[pwn]ROP:三道题讲解花式绕过Canary栈保护

文章目录绕过Canary栈保护Canary栈保护babystack writeupMary_Morton writeup 绕过Canary栈保护 Canary栈保护 Canary是一种栈保护手段,通常通过在栈中插入cookie信息(一般在ebp上方),在函数返回的时候检查cookie是否改变,如果改变则认为栈结构被破坏,则调用一个函数强制停止程序。当开启Canary保护的时候不能通过传统的栈溢出直...

Breeze的博客 1万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

异常堆栈信息丢失?到底是怎么回事?

01 即时编译优化Java程序在运行初期是通过解释器来执行,当发现某块代码运行特别频繁,就会将之判定为热点代码(Hot Spot Code), 虚拟机会将这部分代码编译成本地机器码,并对...

HollisChuang's Blog 1437

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

WindowsAPI ——NtQueryInformationProcess

NtQueryInformationProcess 获取指定文件大小,in byte。 函数原型 DWORD GetFileSize(__kernel_entry NTSTATUS NtQueryInformationProcess( HANDLE ProcessHandle, PROCESSINFOCLASS ProcessInformationClass, PVOID ProcessInformation, ULONG ProcessInformationLength, PULONG ReturnL

qq_38933606的博客 2339

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

程序编译保护&堆栈溢出保护机制

程序编译保护&堆栈溢出保护机制

wkshwbw的博客 2105

使用 NtQuerySystemInformation 遍历进程信息

通过遍历系统进程信息,我们可以了解系统中运行的各种进程的详细信息,从而更好地进行系统管理和性能优化。本文介绍了一种通过调用 Windows 系统API来获取并遍历系统进程信息的技术,并提供了一段示例代码以帮助读者理解该技术的实现方法。

溡漪幽博客 3097

NtQueryInformationProcess (反调试)

文章目录0x01 NtQueryInformationProcess ()一、NtQueryInformationProcess ()二、CheckRemoteDebuggerPresent() 0x01 NtQueryInformationProcess () 一、NtQueryInformationProcess () ​ 函数原型: NTSYSAPI NTSTATUS NTAPI NtQueryInformationProcess (   IN HANDLE         ProcessHandl

lwhaaaa的博客 3249

栈保护机制

一、CANNARY(栈溢出保护) ​ 栈溢出保护是一种用缓冲区溢出攻击环节手段,当函数存在缓冲区溢出漏洞时,攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行。当启用栈保护后,函数开始执行的时候就会向往栈里插入cookie信息,当函数真正返回的时候回验证cookie信息是否合法,若果不合法就会停止程序运行。攻击者在覆盖返回地址的时候往往也会将cookie信息给覆盖掉,导致栈保护检查失败...

hollk’s blog 6487

Kernel Stack栈溢出攻击及保护绕过

本文介绍Linux内核的栈溢出攻击,和内核一些保护的绕过手法,通过一道内核题及其变体从浅入深一步步走进kernel世界。

2401_84466325的博客 1170

使用NtQuerySystemInformation遍历进程信息[详细篇]

使用NtQuerySystemInformation遍历进程信息[详细篇]

weixin_42270114的博客 7865

NtQuerySystemInformation

Native API乃Windows用户模式中为上层Win32 API提供接口的本机系统服务。平常我们总是调用MS为我们提供的公用的Win32 API函数来实现来实现我们系统的功能。今天我们要谈的是如何通过本机系统服务(Native API)来探测本机系统信息。当然,微软没有为我们提供关于本机系统服务的文档 (Undocumented),也就是不会为对它的使用提供任何的保证,所以我们不提倡使用Na

不完美星空 820

NtQuerySystemInformation参数详解

NtQuerySystemInformation函数,其中SystemBasicInformation(0号功能)返回的结果是一个SYSTEM_BASIC_INFORMATION结构,其中的域bKeNumberProcessors将返回系统CPU的个数。 下面是该函数的具体说明: /×---------------------------------------------------

oldmtn的专栏 2万+

防范缓冲区溢出攻击的方法

当程序向缓冲区写入数据时,如果输入的数据量超过了缓冲区的容量,多余的数据会覆盖相邻的内存区域。缓冲区溢出攻击是计算机安全领域的一种常见攻击方式,它利用了程序中的缓冲区溢出漏洞。缓冲区溢出是指当一个程序向缓冲区写入数据时,如果输入的数据量超过了缓冲区的容量,多余的数据会溢出到相邻的内存区域。例如,GCC编译器提供的`-fstack-protector`选项可以在函数的堆栈帧中添加一个保护区域,用于检测缓冲区溢出攻击。通过综合运用这些技术和方法,可以提高系统的安全性,减少缓冲区溢出攻击的风险。

SXXYNHHXX的博客 1640
上一篇: Kernel-mode backdoors for Windows NT
下一篇: window系统下的远程堆栈溢出----shellcode编写
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值