:首先依然是申请内存0xf0字节然后接着取用户参数地址的值,不是魔数就跳转,是魔数就向下走,填充魔数和固定的回调到结构里,然后填充申请内存的多余部分最后,判断值,如果输入的地址的值是0,则调用偏移4的回调函数...,该漏洞是由未初始化和保存回调而导致的,该漏洞的控制码是:0x222033漏洞利用控制分页内存要按照上面的思路去进行利用,这里需要解决的一个问题就是,如何从用户层去控制该分页内存申请的位置之前在池溢出利用那里...,使用了CreateEvent大量创建事件对象(非分页内存池),制造内存合适大小的空洞使得申请的内存被精准投放到事件对象前面根据参考资料[1-2],了解到事件对象本身分配给了非分页池,但是最后一个参数LPCTSTR...字节是不受控的,我们完成本次利用需要控制偏移4的4字节内存,所以这里内存是从ListHeads List里申请的是没法实现的除了ListHeads List,还有个提高内存分配效率的Lookaside...List,使用单链表保存空闲块,所以这里希望能将释放的内存块插入到Lookaside List里,然后再分配出来首先,第一步,需要确保Lookaside是启用的,该表将会在系统启动2分钟之后惰性启动,需要开机后等两分钟在进行实验然后
流程: 使用CreateFileMapping->MapViewOfFile映射一个ntdll 自己实现一个GetProcAddress函数 使用自写GetProcAddress函数获取nt函数其实就是打开一个新的...如何使用 这里是使用了NtAllocateVirtualMemory,从新的ntdll创建的 pNtAllocateVirtualMemory NtAllocateVirtualMemory = (pNtAllocateVirtualMemory...所以我们里的思路是: 新挂起进程的内存是干净的,没有被 hook 的 所有的系统 dll 在被加载时的内存空间都是一样的启动一个进程,挂起它,读取他的干净的ntdll,然后自己使用。...ghhlp64 运行的时候也就正常的走到了kernel32,ntdll中,没有其他的操作了。...ntdll的内存分配的那函数后也就出现了爆毒。
NULL时,就可能存在空指针解引用漏洞,这里我们将使用与上一节相同的技术来分配NULL页面,完成对空指针解引用漏洞的利用实验环境:•虚拟机:Windows 7 x86•物理机:Windows 10 x64...,如果是的话就把该值保存到edi地址里,然后往偏移4的位置保存一个函数指针,这个edi保存的是刚刚申请的内存首地址;如果取出来的值比对不成功,则释放刚刚申请的内存然后之后就是,把保存在申请内存偏移4的位置的函数指针取出来...,然后调用,如果不合理就释放内存,然后判断申请的内存指针里存的内容,如果是指定内容就调用指定函数,如果不是也直接调用这里存在的问题是,判断失败之后没有直接返回,反而跟着判断成功的逻辑继续执行,从而导致漏洞只需要往...0地址偏移4的位置写上4字节shellcode地址,即可完成执行漏洞利用利用思路就很简单了:使用上一篇HEVD池溢出相同的方法,进行0地址映射,这里只需要输入一个错误的4字节,就会进入漏洞触发区域,就会去执行...)GetProcAddress(hNtdll, "NtAllocateVirtualMemory"); // Allocate the Virtual memory NtAllocateVirtualMemory
首先获取了两个函数的地址 NtUserMNDragOver 和 NtAllocateVirtualMemory ,获取这两个函数的地址是因为参考栈回溯中是由 win32k!...NtUserMNDragOver 函数中开始调用后续函数的,但是这个函数没有被导出,所以要通过其他函数的地址来导出。NtAllocateVirtualMemory函数是用来后续分配零页内存使用的。...从空指针解引用到任意代码执行 触发了漏洞之后我们如何利用是个问题,首先的问题是把空指针解引用异常解决掉,在 windows7 版本上可以使用 ntdll!...NtAllocateVirtualMemory 来分配零页内存。可以看到在申请零页内存之后不会产生异常导致crash了。 ?...后记 通过这个漏洞的分析和复现也学到了不少在内核模式下的操作。分析到这里已经算结束了,但是如何达到在野外实现的浏览器沙盒逃逸的功能,还有之前提出的问题都是还需要思考的。
利用Vmware进行双机调试 使用管理员模式运行cmd bcdedit /copy {current} /d “Windwos7[DEBUG]” 开启调试bcdedit /debug ON和bcdedit...利用 x86的win 7 不存在 零页内存分配保护和SMEP。 所谓SMEP是一种安全措施,就是不能在内核态执行用户态的代码。...,但是当BaseAddress指定为0时,系统会寻找第一个未使用的内存块来分配,而不是在零页内存中分配。...再会看第二点,寻找edi的来源,发现其实edi是可控。 ? 可以发现edi来源与[[ebp+arg_4]+748h]不过此时[ebp+arg_4]是0,所以我们可以分配零页内存控制748h的数据。...程序要走到我们能控制的地方需要图中红框的条件成立,经调试si=1。看到eax其实是0,所以需要控制590h和592h的值均为1。
,也是用来动态分配内存的。...因为是动态分配,所以分配的内存位置就会不固定,在用户层有堆喷射这样的技术来辅助突破动态地址,这里则需要在内核里也找到一种方法来修改内存池,以便在内存区域精准调用shellcode本例中的程序将用户缓冲区分配在了非分页内存池里...根据参考资料[2]中论文的介绍,我们可知:内核池空闲池块保存在一个链表结构里,当进行申请该池的内存的时候,会从链表里找到合适大小的池块进行分配,如果找不到,则会寻找相近大小的池块进行切割然后再分配;当空闲链表里有位置相邻的空闲池块...shellcode那么,我们的目标就是把TypeIndex的偏移量从0xc改成0x0,第一个指针是空指针,不被使用的,在Windows7中有一个漏洞,可以调用NtAllocateVirtualMemory...)GetProcAddress(hNtdll, "NtAllocateVirtualMemory"); // Allocate the Virtual memory NtAllocateVirtualMemory
1.前言 接触安全已经一年多了,在实习工作中跟进项目的时候,以前我的弱项也逐步暴露出来,并越发明显,我不懂免杀与工具开发,钓鱼、下马的工作无法顺利进行,几乎就是面向google的渗透测试工程。...图片 使用windbg进行调试,可以看到TEB结构体中是存在PEB进程环境块的,此处使用的是x64程序进行演示。...时,进程加载的模块遍历完毕。...dt -r1 00007ffdac05c4c0 _PEB_LDR_DATA 图片 跟进_LDR_DATA_TABLE_ENTRY结构,可以注意到BaseDllName的值为乱码,这是因为内存对齐问题...然后GetProcAddress做IAT隐藏 3.2 代码实现 我们在进行操作时,需要定义一个与syscall相关联的数据结构:_VX_TABLE_ENTRY事实上每一个系统调用都需要分配一个这样的结构
如果Windows内核模式驱动程序不正确地处理内存中的对象,则存在一个特权提升漏洞。成功利用此漏洞的攻击者可以运行内核模式中的任意代码。...其中CVE-2014-4113就是Win32k.sys中的一个漏洞,该漏洞的根本问题是函数xxxMNFindWindowFromPoint的返回值验证不正确。...tagWND地址的时候程序正常执行,但当返回-1,-5的时候传递给xxxSendMessage将造成蓝屏。... = GetProcAddress( GetModuleHandleW(L"ntdll"), "NtAllocateVirtualMemory"); if (NtAllocateVirtualMemory...申请0页内存空间,在该空间建立一个畸形的win32k!
Windows系统上安装的所有应用程序均以所谓的用户模式运行。 内核和设备驱动程序以所谓的内核模式运行。用户模式下的应用程序无法访问或操作内核模式下的内存部分。...通过修补来自内存中被操纵的NTDLL.dll的其他JMP指令,Cylance的分析代码将永远不会被执行。因此,无法进行检测/阻止: ?...因此,每当Microsoft发布更改时,您都需要构建新的implant/tool 分解所有Windows API函数需要很多工作,并且需要大量时间/工作 但是使用这种技术将使我们能够绕开Userland-Hooking...我在摆弄所有需要的所有NTDLL.dll函数,例如NtOpenProcess,NtAllocateVirtualMemory,NtWriteVirtualMemory和CreateThreadEx,但不幸的是无法成功使我的...我们可以使用此模板,并将ired.team网站中的C ++ PoC嵌入其中,并且在Nim中有一个可以正常工作的NTDLL.dll取消对PoC的绑定: when not defined(cpp):
这篇文章的目的 这篇文章将介绍如何使用 LoadLibrary 执行基本的 dll 注入,然后深入探讨 LoadLibrary 如何在幕后工作,并完成手动映射和将 DLL 注入进程的步骤。...这个过程可以分为5个步骤: 阅读和解析 将文件读入内存 获取标题 分配内存 获取和更新图像大小 将标题复制到内存中 用新的基础更新新的标头 复制部分 遍历节标题 分配或复制部分数据 使用新地址更新节标题...首先,我们将尝试在标头中指定的图像库中分配内存,如果我们无法做到这一点,我们将让系统决定在哪里分配内存: // Attempt to allocate memory at the image base...分配内存的最后一步是将标头复制到我们分配的内存中,然后使用分配内存的位置更新这些标头中的 ImageBase。...这很重要,因为我们之前执行 VirtualAlloc 时可能无法在 ImageBase 分配内存: // Copy the headers from the data into the allocated
/windows/system32/calc.exe 以下指令win10某些版本无法使用 conhost "asddas c:\windows\system32\calc.exe" explorer.exe...这里涉及到winhttp.h的一些函数的使用。 源码借用一下 卿 的代码。它的代码是直接把shellcode的十六进制以字符串形式直接放到远程服务器上。...,以HTTP的方法获取远程服务器上的shellcode(此时shellcode在内存中是按照编码结果存储的,如下图,左边是内存原文,右边是内存解码(shellcode)) 2.开辟一段内存,然后通过sscanf...等方法读取存储shellcode变量的内容,将内存解码信息录入新的内存空间,使shellcode存在于内存中 3.执行shellcode,可以用指针执行等方法执行。...\n"); } 进程镂空 动态调用API void* ntAllocateVirtualMemory = GetProcAddress(LoadLibraryA("ntdll.dll"), "NtAllocateVirtualMemory
如果DLL使用DllMain函数对进程的每个线程执行初始化,则运行时动态链接可能会导致问题,因为对于调用LoadLibrary或LoadLibraryEx之前存在的线程,不会调用入口点。...如果DLL已在TLS插槽中存储了指向已分配内存的指针,则它应利用此机会释放内存。系统使用此值调用所有当前加载的DLL的入口点函数。该调用是在退出线程的上下文中进行的。...构造注入程序 LoadLibrary是Windows API中的一个函数,它可以将一个DLL加载到调用进程和调用的内存中DLLMain(将指定的模块加载到调用进程的地址空间中) 使用语法 C ++ HMODULE...在TEXT()中可以确保我们使用的是正确的编码。 然后使用VirtualAllocEx 函数在指定进程中提交内存区域。...%d\n", bufferAddressInTargetProcess); return 0; } 使用GetModuleHandle和GetProcAddress找到目标进程中需要调用的函数的地址
介绍Artifact Kit的地址为: https://www.cobaltstrike.com/help-artifact-kit 使用之前我们先build一下: 查看编译好的字符串: 发现以下敏感字符串...微软、卡巴不行 写在后面:该文为笔记文,可能目前的免杀效果已经没有那么好了,可以使用下面的项目进行使用或者二次修改来增加免杀性。...https://github.com/ORCA666/artifact64 https://github.com/ORCA666/artifact32 横向移动 在使用其横向移动功能时可能会遇到被杀软拦截的情况...在Resource Kit中的template.x86.ps1,template.x64.ps1和compress.ps1有: [Byte[]]$var_code = [System.Convert...而对于横向移动的 绕过方法为使用Gzip或者反射或者之前的AMSI绕过加入进去即可绕过(只针对具有AMSI检测的杀软),可以参考: https://github.com/rasta-mouse/AmsiScanBufferBypass
4.使用 OpenProcess 函数打开指定 PID 的进程,并分别使用 VirtualAllocEx 函数在该进程中分配内存空间,分别保存注入代码和 Param 结构体的数据。...它通过将内存中的数据和代码区分开来,从而使得攻击者无法在数据区执行代码。DEP保护通过硬件和软件两种方式来实现。硬件实现通过CPU硬件中的NX位,禁止在数据区执行代码。...它通过在每次程序运行时随机地分配内存地址,使得攻击者难以确定内存地址的位置,从而难以实现攻击。...ASLR可以在操作系统内核、编译器和二进制代码等多个层面实现,如在编译时生成随机堆栈和堆地址、加载时随机化内存基地址等。 这两种技术都可以增强操作系统的安全性,防止恶意代码的攻击和利用。...通过 OpenProcess 函数打开目标进程,使用 VirtualAllocEx 函数在目标进程中分配内存,并使用 WriteProcessMemory 函数将代码和参数复制到目标进程的内存中。
4.使用 OpenProcess 函数打开指定 PID 的进程,并分别使用 VirtualAllocEx 函数在该进程中分配内存空间,分别保存注入代码和 Param 结构体的数据。...它通过将内存中的数据和代码区分开来,从而使得攻击者无法在数据区执行代码。DEP保护通过硬件和软件两种方式来实现。硬件实现通过CPU硬件中的NX位,禁止在数据区执行代码。...它通过在每次程序运行时随机地分配内存地址,使得攻击者难以确定内存地址的位置,从而难以实现攻击。...ASLR可以在操作系统内核、编译器和二进制代码等多个层面实现,如在编译时生成随机堆栈和堆地址、加载时随机化内存基地址等。这两种技术都可以增强操作系统的安全性,防止恶意代码的攻击和利用。...通过 OpenProcess 函数打开目标进程,使用 VirtualAllocEx 函数在目标进程中分配内存,并使用 WriteProcessMemory 函数将代码和参数复制到目标进程的内存中。
在之前的文章中,我们实现了一个正向的匿名管道ShellCode后门,为了保证文章的简洁易懂并没有增加针对调用函数的动态定位功能,此类方法在更换系统后则由于地址变化导致我们的后门无法正常使用,接下来将实现通过...的内存地址,而GetProcAddress是在kernel32.dll模块中的导出函数,所以我们可通过查找kernel32.dll的导出表来找到GetProcAddress函数的内存地址。...,最终可得到如下所示的一段自定位ShellCode代码片段,该片段运行后则可将我们所需要的函数内存地址枚举出来并放到临时变量中,等待我们使用; #include #include 和PE,而且因为系统分配某个空间时,总要从一个分配粒度的边界开始,在32位下,这个粒度是64KB。...所以我们搜索时,可以按照64kb递减往低地址搜索,当到了MZ和PE标志时,也就找到了Kernel32的基地址。
在之前的文章中,我们实现了一个正向的匿名管道ShellCode后门,为了保证文章的简洁易懂并没有增加针对调用函数的动态定位功能,此类方法在更换系统后则由于地址变化导致我们的后门无法正常使用,接下来将实现通过...kernel32.dll模块的内存地址0x75B20000,输出效果图如下所示;图片既然拿到了当前模块的基地址,下一步则是通过该地址寻找到GetProcAddress的内存地址,而GetProcAddress...是在kernel32.dll模块中的导出函数,所以我们可通过查找kernel32.dll的导出表来找到GetProcAddress函数的内存地址。...此外由于Kerner32模块也是可执行文件,其开始标志同样是MZ和PE,而且因为系统分配某个空间时,总要从一个分配粒度的边界开始,在32位下,这个粒度是64KB。...所以我们搜索时,可以按照64kb递减往低地址搜索,当到了MZ和PE标志时,也就找到了Kernel32的基地址。
函数返回NTSTATUS类型的状态码,其中STATUS_SUCCESS表示成功执行。 在使用这个函数时,你需要提供足够大的缓冲区来存储工作空间大小。...函数返回NTSTATUS类型的状态码,其中STATUS_SUCCESS表示成功执行。 在使用这个函数时,你需要提供足够大的缓冲区来存储压缩后的数据。...可以按照以下步骤使用该函数: 加载ntdll.dll库。 获取RtlCompressBuffer函数地址。 定义变量并分配内存用于存储未压缩的数据和压缩后的数据。 定义变量用于存储工作空间。...在使用这个函数时,你需要提供足够大的缓冲区来存储解压后的数据。可以按照以下步骤使用该函数: 加载ntdll.dll库。 获取RtlDecompressBuffer函数地址。...定义变量并分配内存用于存储待解压的数据和解压后的数据。 调用RtlDecompressBuffer函数,将数据进行解压。 处理解压后的数据。