第二章、Windows下ShellCode编写初步
shellcode入门
利用这个技术,可以用于任何DLL,而不仅限于kernel32.dll。一旦LoadLibraryA被解析出来,你就可以加载你所需要的模块(modules)和也可以解析出你要的API函数。那么前言里说的GetProcAddress函数也就用不到了,是不是很开心呢??
第二章第二,三节
}
在这里仅列出我们关心的三个成员。
Export Table的设计是为了方便PE装载器工作。首先,模块必须保存所有输出函数的地址,供PE装载器查询。模块将这些信息保存在AddressOfFunctions域所指向的数组中,也就是说,如果模块引出40个函数,则AddressOfFunctions所指向的数组必定有40个元素。如果有的函数是通过名字引出的,那么模块必定也在文件中保留了这些信息,这些文件的相对虚拟地址(RVA)存放在一个数组中,供PE装载器查询。该数组由AddressOfNames指向。OK,现在已经有了名字数组和地址数组,但两者之间还没有联系的纽带,还需要一些联系函数名及其地址的东西。PE参考指出,使用其地址数组的索引作为连接,因此PE装载其在名字数组中找到匹配名字的同时,她也获取指向地址表中对应元素的索引,这些索引保存在AddressOfNameOrdinals域所指向的另一个数组。由于该数组起到联系名字和地址的作用,所以其元素数目必定和名字数组相同。例如,每个名字有且仅有一个相关地址,反过来则不一定:每个地址可以有好几个名字来对应。因此,给同一个地址取“别名”,为了起到连接作用,名字数组和索引数组必须并行成对使用。(哎呀,这里有张图,没办法传上来……怎么回事??) 其实讲到这里,通过EDT来定位API函数的原理,大家应该有个概念了,简单说就是在名字数组中hash我们所需要的API函数名,一旦hash成功,我们也就可以找到其在地址数组中的序号,那么接下来要做的就相当的简单了,把基地址和相对虚拟地址相加,我们就能得到该API函数的虚拟内存地址(VMA)。
windows shell编程指南与实例
windows shell编程指南与实例Windows Shell是Windows操作系统中的一个重要组件,它可以让用户通过命令行界面与操作系统进行交互。
本文将为读者介绍Windows Shell编程的基本知识和实例,帮助读者更好地理解和使用Windows Shell。
## 一、Windows Shell简介Windows Shell是Windows操作系统的用户界面,它提供了一种与操作系统进行交互的方式。
在Windows系统中,用户可以通过Shell来执行命令、管理文件和目录、配置系统等操作。
Windows Shell有多种版本,包括命令提示符(Command Prompt)和Windows PowerShell等。
## 二、Windows Shell编程基础### 1. 命令提示符命令提示符是Windows Shell的一种基本形式,它提供了一种简单的命令行界面,用户可以直接在命令提示符窗口中输入命令并执行。
下面是一些常用的命令提示符命令:- `dir`:显示当前目录下的文件和子目录。
- `cd`:切换当前目录。
- `mkdir`:创建新目录。
- `del`:删除文件。
- `copy`:复制文件。
### 2. Windows PowerShellWindows PowerShell是Windows操作系统的高级命令行工具,它提供了更强大和灵活的功能。
与命令提示符不同,Windows PowerShell支持使用脚本语言编写批处理脚本,可以实现更复杂的操作。
下面是一个简单的Windows PowerShell脚本示例:```$files = Get-ChildItem -Path "C:\Folder" -Recurse -File foreach ($file in $files) {if ($file.Length -gt 1024) {Write-Host "$($) is larger than 1KB."}}```上述脚本使用`Get-ChildItem`命令获取指定目录下的所有文件,并遍历每个文件,如果文件大小大于1KB,则输出文件名。
windows下的shellcode剖析浅谈
标题: 【原创】windows下的shellcode剖析浅谈作者: snowdbg时间: 2009-10-06,11:12:47链接: /showthread.php?t=99007学习了好些日子了,思路总是乱乱的,这几天决定养成个好习惯,把自己学习的一些东西做一些总结写篇文章,以便归纳和总结,并从中能够更深刻更系统化的理解其技术原理。
今天,就从shellcode来下手吧!说到shellcode可能都有些迷茫,不知它是什么东西,可能觉得也很神秘,对于它的专业解释也很少有人提及,今天我们就从以下几个方面来对windows下的shellcode做一个全剖析:1. shellcode的发展历史以及定义2. 现今常见的windows下的shellcode种类3. 动手编写一个简单的shellcode4. shellcode的存在形式以及编码方式5. exploit中的shellcode好了,下面我们就逐一来弄清楚这些问题吧!1. shellcode的发展历史以及定义:对于shellcode的发展历史,failewest兄的《0day安全:软件漏洞分析技术》一书中讲的很明白,这里就引用一小段:“1996年,Aleph One在Underground发表了著名论文《SMASHING THE STACK FOR FUN AND PROFIT》,其中详细描述了Linux系统中栈的结构和如何利用基于栈的缓冲区溢出。
在这篇具有划时代意义的论文中,Aleph One演示了如何向进程中植入一段用于获得shell 的代码,并在论文中称这段被植入进程的代码为’shellcode’。
后来人们干脆统一用shellcode这个专用术语来通称缓冲区溢出攻击中植入进程的代码。
这段代码可以是出于恶作剧目的的弹出一个消息框,也可以是出于攻击目的的删改重要文件、窃取数据、上传木马病毒并运行,甚至是出于破坏目的的格式化硬盘等等。
”其实,现在shellcode的应用也很广泛,甚至有些远程控制软件也把自己能做成一个shellcode 形式,我们只要理解这个是溢出之后干坏事的一段代码。
shellcode的生成流程
shellcode的生成流程Shellcode generation is a crucial aspect of cybersecurity and offensive security as it involves creating executable code that can be injected into a target system to carry out various tasks. The process of generating shellcode can be complex and requires a deep understanding of computer architecture, assembly language, and exploit development techniques. This code is typically designed to exploit vulnerabilities in software or systems to gain unauthorized access or control.创建Shellcode 是网络安全和进攻性安全领域的重要组成部分,它涉及创建可执行代码,可以注入到目标系统中以执行各种任务。
生成Shellcode 的过程可能复杂,并需要对计算机架构、汇编语言和利用程序开发技术有深刻的理解。
这段代码通常设计用于利用软件或系统中的漏洞,以获取未经授权的访问或控制。
One of the first steps in generating shellcode is identifying the vulnerability or exploit that will be targeted. This could involve reverse engineering a piece of software, analyzing network traffic, or examining a system for potential weaknesses. Once a vulnerability isidentified, the next step is to develop an exploit that can be used to take advantage of it. This exploit will typically involve crafting a payload that will be injected into the target system to execute the desired actions.生成Shellcode 的第一步之一是确定将要针对的漏洞或利用程序。
编写shellcode的全过程
编写shellcode的全过程1、很简单的一段代码,功能就是打开Windows自带的计算器程序。
而我要实现的shellcode的功能就是这个。
1.#include <windows.h>2.3.int main()4.{5.LoadLibraryA("kernel32.dll");6.7.WinExec("calc.exe", SW_SHOW);8.9.return 0;10.}2、将WinExec("calc.exe", SW_SHOW);改成汇编后的样子。
1.#include <windows.h>2.3.int main()4.{5.char str[]="calc.exe";6.char* p = str;7.8.LoadLibraryA("kernel32.dll");9.10.__asm11.{12.push 0;13.14.mov eax,p;15.push eax;16.17.mov eax,0x7c86250d; //WinExec的地址18.call eax;19.}20.21.return 0;22.}3、在堆栈中构造字符串,经典!这招是我在书上学来的,并非本人原创 -_-。
1./*2.* Author: Leng_que3.* Date: 2009年10月12日11:02:404.*E-mail:******************.cn5.* Description: 一段通过WinExec运行calc.exe的shellcode 雏形I6.* Comment: 在WindowsXP SP3 + VC6.0环境下调试通过7.*/8.9.#include <windows.h>10.11.int main()12.{13.//因为WinExec这个API函数在kernel32.dll这个动态链接库里,所以要先加载它14.LoadLibraryA("kernel32.dll");15.16.__asm17.{18.push ebp;19.mov ebp,esp;20.21.//在堆栈中构造字符串:calc.exe22.xor eax,eax;23.push eax;24.25.sub esp,08h;26.mov byte ptr [ebp-0ch],63h;27.mov byte ptr [ebp-0bh],61h;28.mov byte ptr [ebp-0ah],6Ch;29.mov byte ptr [ebp-09h],63h;30.31.mov byte ptr [ebp-08h],2Eh;32.mov byte ptr [ebp-07h],65h;33.mov byte ptr [ebp-06h],78h;34.mov byte ptr [ebp-05h],65h;35.36.//执行WinExec,启动计算器程序37.push 0;38.39.lea eax,[ebp-0ch];40.push eax;41.42.mov eax,0x7c86250d; //WinExec的地址43.call eax;44.45.//平衡堆栈46.mov esp,ebp;47.pop ebp;48.}49.50.return 0;51.}4、具有shellcode特点的汇编代码完成了!值得一提:在这一步我这么也得不到LoadLibrary(在原来的代码中我是写这个的)的地址,于是只好先去吃饭,在来回饭堂的校道上,我突然想到了,原来自己一时忘记,于是犯了一个低级错误,其中在Kernel32.dll里是没有LoadLibrary这个函数的,只有LoadLibraryA 和LoadLibraryW,它们的区别在于传入的参数是ANSI编码的还是Unicode编码的,但是为什么我们在平时的编程中写LoadLibrary又可以正常运行呢?那是因为其实这个LoadLibrary只是一个宏而已啦,在VC6.0下选中这个LoadLibrary函数(当然,应该叫宏更准确些),然后右键->"Go To Definition"一下就知道了。
使用windows系统调用编写shellcode
Quote:
IF(CPUIDSEPbitisset)
THENIF(Family=6)AND(Model<3)AND(Stepping<3)
THEN
SYSENTER/SYSEXIT_NOT_SUPPORTED
FI;
ELSESYSENTER/SYSEXIT_SUPPORTED
翻译作者:无敌最寂寞[E.S.T]
本文来源:邪恶八进制信息安全团队()
注意:转载请保持文章的完整性和文章作者网络版权已经出台个别人士请注意自己的举做
简介
写此文的用意,是想让大家知道在windows系统下我们完全可以写出不依赖于标准API调用的shellcode。当然,对于每一种编写思路,都有它的优缺点。在本文中,我将会带领大家学习一下这种shellcode并介绍一些实际的例子。在阅读本文前,我假设你已经懂得一些IA-32下的汇编知识。
SP4 0x3 0x5 0x7
SP5 0x3 0x5 0x7
SP6 0x3 0x5 0x7
Windows2000SP00x8 0xa 0xc
SP1 0x8 0xa 0xc
SP2 0x8 0xa 0xc
Quote:
.text:77E7E358;---------------SUBROUTINE-------------------------
.text:77E7E358
.text:77E7E358
.text:77E7E358;LPSTRGetCommandLineA(void)
.text:77E7E358publicGetCommandLineA
2、由于你是直接向内核提交请求而跳过了win32子系统的所有指令,那么shellcode的执行速度肯定是非常快的。(当然,现在的CPU速度都是那么快,谁又会在乎这点速度呢)
Window中的shellcode编写框架(入门篇)
Window中的shellcode编写框架(⼊门篇)Shellcode定义 是⼀段可注⼊的指令(opcode),可以在被攻击的程序内运⾏。
特点 短⼩精悍,灵活多变,独⽴存在,⽆需任何⽂件格式的包装,因为shellcode直接操作寄存器和函数,所以opcode必须是16进制形式。
因此也不能⽤⾼级语⾔编写shellcode。
在内存中运⾏,⽆需运⾏在固定的宿主进程上。
Shellcode的利⽤原理 将shellcode注⼊缓冲区,然后欺骗⽬标程序执⾏它。
⽽将shellcode注⼊缓冲区最常⽤的⽅法是利⽤⽬标系统上的缓冲区溢出漏洞。
Shellcode⽣成⽅法编程语⾔编写:汇编语⾔,C语⾔shellcode⽣成器Shellcode编写原则杜绝双引号字符串的直接使⽤ 关闭VS⾃动优化没有使⽤到的变量 ⾃定义函数⼊⼝动态获取函数的地址 GetProAddress 从dll中获取函数的地址 参数1:调⽤dll的句柄,参数2:函数名 Bug:error C2760: 语法错误: 意外的令牌“标识符”,预期的令牌为“类型说明符” 打开项⽬⼯程-> 属性 -> c/c++ --> 语⾔ -> 符合模式修改成否即可如果这样设置将⽆法使⽤c函数。
这个⽐较关键,否则使⽤printf就直接崩溃或者是编译报错 最佳⽅案是:修改平台⼯具集通过获得Kernel32基址来获取GetProcAddres基址避免全局变量的使⽤ 因为vs会将全局变量编译在其他区段中结果就是⼀个绝对的地址不能使⽤static定义变量(变量放到内部函数使⽤)确保已加载使⽤API的动态链接库编写shellcode前的准备修改程序⼊⼝点:链接器-⾼级。
作⽤:去除⾃动⽣成的多余的exe代码关闭缓冲区安全检查,属性->C/C++ ->代码⽣成->安全检查禁⽤设置⼯程兼容window XP :代码⽣成 ->运⾏库选择 debug MTD release MT清除资源:链接器->调试->清单⽂件关闭调试功能如下:属性->常规->平台⼯具集选择xp版本C/C++->代码⽣成->运⾏库选择MT安全检查禁⽤链接器->⾼级->⼊⼝点修改为EntryMain函数动态链接调⽤ 在编写shellcode时,所有⽤到的函数都需要动态调⽤,通过LoadLibrary函数加载动态链接库,GetProAddress获取动态链接库中函数的地址。
Shellcode的原理及编写(基础)
Shellcode的原理及编写(基础)展开全文1.shellcode原理Shellcode实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限。
另外,Shellcode一般是作为数据发送给受攻击服务的。
Shellcode是溢出程序和蠕虫病毒的核心,提到它自然就会和漏洞联想在一起,毕竟Shellcode只对没有打补丁的主机有用武之地。
网络上数以万计带着漏洞顽强运行着的服务器给hacker和Vxer丰盛的晚餐。
漏洞利用中最关键的是Shellcode的编写。
由于漏洞发现者在漏洞发现之初并不会给出完整Shellcode,因此掌握Shellcode编写技术就显得尤为重要。
如下链接是shellcode编写的基础,仅供参考/uid-24917554-id-3506660.html缓冲区溢出的shellcode很多了,这里重现下缓冲区溢出。
[cpp] view plain copy1.int fun(char *shellcode)2.{3.char str[4]="";//这里定义4个字节4.strcpy(str,shellcode);//这两个shellcode如果超过4个字节,就会导致缓冲区溢出5.printf("%s",str);6.return 1;7.}8.int main(int argc, char* argv[])9.{10.char str[]="aaaaaaaaaaaaaaaaaaa!";11.fun(str);12.return 0;13.}如上程序,会导致缓冲区溢出。
程序运行后截图如下如上可以看出来,异常偏移是61616161,其实自己观察61616161其实就是aaaa的Hex编码因为调用函数的过程大致是1:将参数从右到左压入堆栈2:将下一条指令的地址压入堆栈3:函数内部的临时变量申请4:函数调用完成,退出内存栈区从高到低[参数][ebp][返回地址][函数内部变量空间]如上程序,如果函数内部变量空间比较小,执行strcpy时候,源字符串比目标字符串长,就会覆盖函数返回地址,导致程序流程变化如图0048FE44前四个00是str申请的四个字节的并初始化为00,后面的48FF1800是函数的返回地址,再后面的411E4000是ebp,既调用函数的基址。
pwn shellcode方法
pwn shellcode方法pwn shellcode方法是一种利用漏洞来执行自定义代码的技术,通常用于渗透测试和漏洞利用中。
在pwn中,shellcode是一段用于利用漏洞的二进制代码,通常用于获取系统权限或执行任意命令。
下面是一些常见的pwn shellcode方法:1. 编写Shellcode:编写Shellcode是pwn shellcode方法的第一步。
Shellcode通常是一段精简的汇编代码,用于实现特定功能,比如获取shell权限、执行系统命令等。
编写Shellcode需要熟悉汇编语言和对目标系统的理解。
2. 注入Shellcode:一旦编写好Shellcode,就需要将其注入到目标程序中。
通常通过溢出漏洞或其他漏洞来实现Shellcode注入。
注入Shellcode需要对目标程序的内存结构有一定的了解,以确保Shellcode能够被正确执行。
3. 执行Shellcode:一旦Shellcode成功注入到目标程序中,就可以通过触发漏洞来执行Shellcode。
通常会利用栈溢出、堆溢出等漏洞来实现Shellcode的执行。
执行Shellcode可以实现获取系统权限、执行任意命令等功能。
4. Shellcode编码:有时候目标程序会对Shellcode进行过滤或检测,需要对Shellcode进行编码来绕过检测。
常见的编码方法包括Base64编码、逆向Shellcode 等。
编码Shellcode可以增加Shellcode的兼容性和安全性。
5. Shellcode调试:在编写和执行Shellcode过程中,常常需要对Shellcode进行调试和测试,以确保Shellcode的正确性和稳定性。
可以使用调试器如gdb来对Shellcode进行调试,查看Shellcode执行过程中的内存状态和寄存器值。
总的来说,pwn shellcode方法是一种高级的漏洞利用技术,需要对漏洞利用、汇编语言和目标系统有深入的了解。
ShellCode编写
变换一下
#include <windows.h> #include <winbase.h> typedef void (*MYPROC)(LPTSTR); //定义函数指针 int main() { HINSTANCE LibHandle; MYPROC ProcAdd; LibHandle = LoadLibrary("msvcrt.dll"); ProcAdd = (MYPROC) GetProcAddress(LibHandle, "system"); //查找system函数地址 (ProcAdd) (""); //其实就是执行 system("") return 0; }
2.4 使用汇编生成ShellCode
先看看如何把system(“cmd.exe”)写成 汇编 思路:
将“cmd.exe”压栈, 将“cmd.exe”地址压栈 Call system函数地址
注意:
Push是四个字节对齐的,因此必须每次压栈ቤተ መጻሕፍቲ ባይዱ 个字节 或者一个字节一个字节赋值
ShellCode编写
内容
1. 2. 3. 4. 5. 什么是ShellCode? 编写ShellCode 通用ShellCode的编写 后门ShellCode的编写 ShellCode编码
1. 什么是ShellCode?
ShellCode就是一段能够完成一定功能(比 如打开一个命令窗口)、可直接由计算机执 行的机器代码,通常以十六进制的形式存在。
;依次找每个函数名称 ;'PteG' ;'Acor'
;ebx = 索引号地址,AddressOf ;ecx = 计算出的索引号值 ;ebx = 函数地址的起始位 ;利用索引值,计算出GetProcAddress的地址
汇编Shellcode的技巧
汇编Shellcode的技巧汇编Shellcode的技巧本⽂参考来源于pentest我们在上⼀篇提到要要⾃定义shellcode,不过由于这是个复杂的过程,我们只能专门写⼀篇了,本⽂,我们将会给⼤家介绍shellcode的基本概念,shellcode在编码器及解码器中的汇编以及⼏种绕过安全检测的解决⽅案,例如如何绕过微软的 EMET(⼀款⽤以减少软件漏洞被利⽤的安全软件)。
为了理解本⽂的内容,⼤家需要具了解x86汇编知识和基本⽂件格式(如COFF和PE)。
专业术语进程环境块(PEB):PEB(Process Environment Block)是Windows NT操作系统中的⼀种数据结构。
由于PEB仅在Windows NT操作系统内部使⽤,其⼤多数字段不⾯向其他操作系统,所以PEB就不是⼀个透明的数据结构。
微软已在其MSDN Library技术开发⽂档中开始修改PEB的结构属性。
它包含了映像加载器、堆管理器和其他的windows系统DLL所需要的信息,因为需要在⽤户模式下修改PEB中的信息,所以必须位于⽤户空间。
PEB存放进程信息,每个进程都有⾃⼰的 PEB 信息。
准确的 PEB 地址应从系统的 EPROCESS 结构的 1b0H 偏移处获得,但由于 EPROCESS在进程的核⼼内存区,所以程序不能直接访问。
导⼊地址表(IAT):IAT (Import Address Table)由于导⼊函数就是被程序调⽤但其执⾏代码⼜不在程序中的函数,这些函数的代码位于⼀个或者多个DLL 中,当PE ⽂件被装⼊内存的时候,Windows 装载器才将DLL 装⼊,并将调⽤导⼊函数的指令和函数实际所处的地址联系起来(动态连接),这操作就需要导⼊表完成.其中导⼊地址表就指⽰函数实际地址。
数据执⾏保护(DEP):与防病毒程序不同,数据执⾏保护(DEP)是⼀组对内存区域进⾏监控的硬件和软件技术,DEP技术的⽬的并不是防⽌在计算机上安装有害程序。
ShellCode编写实例
ShellCode编写实例 来源:互联网适合读者:漏洞研究员、入侵爱好者前置知识:C、汇编阅读能力,调试工具使用能力WTF:最近网络上开始流传各种各样的ShellCode,很多朋友都开始关注ShellCode的编写和相关技术的实现方法。
黑防不断推出的“ ...适合读者:漏洞研究员、入侵爱好者前置知识:C、汇编阅读能力,调试工具使用能力WTF:最近网络上开始流传各种各样的ShellCode,很多朋友都开始关注ShellCode的编写和相关技术的实现方法。
黑防不断推出的“菜鸟版Exploit编写指南”系列文章受到很多热爱系统漏洞的朋友们的喜爱,但大家在了解基本的漏洞调试、利用方法后,开始关注更高层次的ShellCode 的编写。
本期“溢出研究”栏目推出了《打造Windows下自己的ShellCode》一文,讲解了Windows下ShellCode的编写步骤,并且以打开DOS窗口的代码为例,详细介绍了编写、提取ShellCode的整个过程。
但开一个本地DOS窗口的功能还是略显简陋。
在网络环境下,ShellCode至少要能开一个网络连接后门,或者能上传下载文件才算有用。
所以本篇文章更实际一点,难度也高些。
希望给国内的网络安全爱好者们送上一道色香味具全的新年大餐!ShellCode编写实例——突破防火墙的ShellCode现在网络上获得控制台的ShellCode要么是在目标机上开一个端口,等待攻击者连接;要么是让目标机主动连接攻击者的主机,俗称反向连接。
但前种方法一般都会被防火墙挡住,而后者反连不但需要攻击者有一个公网IP,而且也会被目标机端禁止外连访问的防火墙挡掉。
那有没有更好的办法呢?当然有了!不然大家认为WTF老大会让我在这里瞎折腾?!第一种方法就是复用攻击时的Socket。
我们在给目标机发送攻击字符串的时候,就使用了Socket,如果还存在,我们把它找到并回收利用。
ShellCode完成的功能是查找进程中所有的Socket并依次判断,如果是那个发送攻击字符串的Socket,就使用它来传文件,开后门等等。
shellcode的生成流程
shellcode的生成流程英文回答:Shellcode generation is a process of creating a sequence of machine instructions that can be injected and executed directly in a compromised system. It is commonly used in exploit development and malware creation to achieve various malicious activities. There are several steps involved in the process of generating shellcode.1. Identifying the target platform: The first step is to determine the target platform for which the shellcode is being developed. This includes identifying the operating system, processor architecture, and other specific details of the target system.2. Understanding the vulnerability: To create an effective shellcode, it is crucial to understand the vulnerability that is being exploited. This involves analyzing the target system, identifying the security flaw,and determining the appropriate technique to exploit it.3. Crafting the payload: The next step is to craft the payload, which is the actual code that will be executed on the target system. This involves writing the shellcode in assembly language or a high-level language that can be compiled into machine code.4. Encoding and obfuscation: To bypass security measures and evade detection, shellcode can be encoded or obfuscated. This can involve techniques such as XOR encoding, polymorphism, or encryption to make the shellcode more difficult to analyze.5. Testing and debugging: Once the shellcode is generated, it needs to be tested and debugged to ensure its functionality and reliability. This involves running the shellcode in a controlled environment or using a debugger to identify and fix any issues.6. Integration into an exploit: Finally, the generated shellcode needs to be integrated into an exploit payload.This involves combining the shellcode with the exploit code that triggers the vulnerability and delivers the payload to the target system.Shellcode生成是创建一系列机器指令的过程,可以直接注入和执行在被攻击的系统中。
msf 编译shellcode
msf 编译shellcode一、概述Metasploit Framework(MSF)是一个强大的开源安全测试工具,它提供了一系列模块,包括用于创建和测试 shellcode 的工具。
在本文中,我们将介绍如何使用 MSFrununc 模块编译 shellcode。
二、准备环境在开始之前,请确保您已经安装了 Metasploit Framework,并且具有适当的环境配置。
您还需要安装一些必要的库和工具,以便正确地编译和运行 shellcode。
以下是使用 MSF 编译 shellcode 的基本步骤:1. 使用 msfdb 命令启动 MSF,并加载所需的模块。
2. 使用 msfencode 模块将payload编码为 shellcode。
3. 使用 MSFrununc 模块编译 shellcode 并获取可执行文件路径。
4. 使用生成的可执行文件路径构建 meterpreter.rc 文件。
5. 使用 msfencode 加载生成的 meterpreter.rc 文件并编译shellcode。
下面是一个具体的示例:1. 使用以下命令启动 MSF:msfconsole2. 加载所需的模块:use exploit/multi/shell -setencoder x86/shikata_ga_nai -setplatform linux -setarch x86 -setoptionsexploit:auto_reverse_portfwd=13. 使用 msfencode 编码 payload:msfpayload windows/meterpreter/reverse_tcpLHOST=[target_ip] LPORT=[target_port] > payload.bin4. 使用 MSFrununc 编译 shellcode:msfrename payload.bin +x86/shikata_ga_nai -L ELF64/x86-64 -e /tmp/shellcode-unix -r elf64 -x i386 msfencode -f elf64 -o /tmp/shellcode-unix/meterpreter-x86_64.so -n -v -x i386 -l/tmp/shellcode-unix/meterpreter-x86_64.so.tmpfs/tmp/shellcode-unix/shellcode-unix/payload.bin/tmp/shellcode-unix/meterpreter-x86_64.so.tmpfs >/tmp/shellcode-unix/meterpreter-x86_64.so.stdout 2>/tmp/shellcode-unix/meterpreter-x86_64.so.stderr其中,[target_ip] 和 [target_port] 是目标主机的 IP 地址和端口号。
Windows平台shellco...
Windows平台shellco...Windows平台shellcode开发入门之一个简单的”SwapMouseButton“的shellcode一、简介在“Windows平台shellcode开发入门”系列的最后一部分,我们将会编写一个简单的”SwapMouseButton“的shellcode,该shellcode会互换鼠标的左键和右键。
文中涉及的基础知识已在前两篇文章中介绍,本文不再详述,有需要的朋友可以阅读本系列的第一部分和第二部分。
我们先从一个已知shellcode着手:Allwin URLDownloadToFile + WinExec + ExitProcess Shellcode。
此名称可以透漏shellcode的相关功能,比如它使用:URLDownloadToFile Windows API函数下载文件WinExec执行文件(可执行文件:.exe)ExitProcess终止运行shellcode的进程使用这个示例程序,我们需要调用SwapMouseButton函数和ExitProcess函数。
BOOL WINAPI SwapMouseButton(_In_ BOOL fSwap);VOID WINAPI ExitProcess(_In_ UINT uExitCode);正如你看到的,每个函数只需要1个参数:1.fSwap参数可以是TRUE或FALSE,鼠标的按键便会被互换,否则被恢复。
2.uExitCode表示进程退出码。
每个进程在退出时必须返回一个值(如果一切顺利的话,返回值为零,否则返回其他数值)。
这是为什么main函数通常需要return 0。
二、程序概览现在我们需要调用这两个函数。
在C++中,调用过程非常简单:因为编译器知道去链接“user32”函数库,然后查找相关函数。
但是我们需要在shellcode手动完成这个过程。
我们需要手动加载“user32”库,找到SwapMouseButton函数的地址,并进行调用。
打造Windows下自己的ShellCode
打造Windows下自己的ShellCode适合读者:漏洞分析员、黑迷前置知识:汇编阅读能力,漏洞调试基本步骤,VC使用方法WTF:这几次的菜鸟版EXP系列文章都是重点讲解溢出编程的原理和思路,包括漏洞的定位,利用构造以及遇到限制时ShellCode的编码技巧等,但对ShellCode本身的编写,特别是Windows 环境下适合读者:漏洞分析员、黑迷前置知识:汇编阅读能力,漏洞调试基本步骤,VC使用方法WTF:这几次的菜鸟版EXP系列文章都是重点讲解溢出编程的原理和思路,包括漏洞的定位,利用构造以及遇到限制时ShellCode的编码技巧等,但对ShellCode本身的编写,特别是Windows环境下ShellCode的初步编写,却很少提及。
在文章中都是说发扬“拿来主义”,看准外面现成的ShellCode,直接拿来用,对不合规范的地方稍微改改就成——其实我们是有策略的,试想一来就一大堆汇编,初学者不晕就懵,不被吓跑才怪,所以前期重点放在激发大家的兴趣上。
但作为一个菜鸟,在兴趣激起来后,毕竟要进入到ShellCode的编写中。
一是因为Exploit很大的乐趣就在于ShellCode的编写,二是明白了ShellCode的编写,才能更好的使用和改进外面的代码。
那,我们开始……打造Windows下自己的ShellCode文/图王炜/ww0830为了帮助初学者了解ShellCode的编写,并能一步一步操作得到自己的ShellCode,因此将Windows下ShellCode的编写过程作详细的介绍,以利于像我一样的菜鸟,最终能够写出简单的但却是真实的ShellCode;而进一步高级的ShellCode的编写,也会在系列后面的文章中一步一步的演示的,希望大家会发现,Exp真好,ShellCode最美妙!ShellCode简介和编写步骤从以前的文章和别人的攻击代码中可以知道,ShellCode是以“\xFF\x3A\x45\x72……”的形式出现在程序中的,而Exploit的构造就是想方设法地使计算机能转到我们的ShellCode上来,去执行“\xFF\x3A\x45\x72……”――由此看出,ShellCode才是Exploit攻击的真正主宰(就如同独行者是我们文章的主宰一样)。
WindowsShellcode学习笔记
WindowsShellcode学习笔记展开全文0x00 前言Windows Shellcode学习笔记——通过VisualStudio生成shellcode,shellcode是一段机器码,常用作漏洞利用中的载荷(也就是payload)。
在渗透测试中,最简单高效的方式是通过metasploit生成shellcode,然而在某些环境下,需要定制开发自己的shellcode,所以需要对shellcode的开发作进一步研究。
0x01 简介编写Shellcode的基本方式有3种:直接编写十六进制操作码采用C或者Delphi这种高级语言编写程序,编译后,对其反汇编进而获得十六进制操作码编写汇编程序,将该程序汇编,然后从二进制中提取十六进制操作码本文将介绍如何通过Visual Studio编写c代码来生成shellcode,具体包含以下三部分内容:利用vc6.0的DEBUG模式获取shellcode测试Shellcode自动生成工具——ShellcodeCompiler使用C++编写(不使用内联汇编),实现动态获取API地址并调用,对其反汇编可提取出shellcode 0x02 利用vc6.0的DEBUG模式获取shellcode注:本节参考爱无言的《挖0day》附录部分测试系统:Windows XP1、编写弹框测试程序并提取汇编代码代码如下:#include "stdafx.h"#include int main(int argc, char* argv[]){ MessageBoxA(NULL,NULL,NULL,0); return 0;}在MessageBoxA(NULL,NULL,NULL,0);处,按F9下断点debug模式按F5开始调试,跳到断点按Alt+8将当前C代码转为汇编代码,如图00401028 mov esi,esp0040102A push 00040102C push 00040102E push 000401030 push 000401032 call dword ptr [__imp__MessageBoxA@16 (0042528c)]call是一条间接内存调用指令,实际使用需要真正的内存地址按Alt+6打开查看内存数据的Memory窗口,跳到位置0x0042528c,如图0042528C EA 07 D5 77 00 00 00 ..誻...取前4字节,倒序排列(内存中数据倒着保存):77D507EAcall命令的实际地址为0x77D507EAMessageBoxA函数位于user32.dll中,调用时需要提前加载user32.dll2、编写内联汇编程序并提取机器码新建工程,使用内联汇编加载上述代码:#include "stdafx.h"#include int main(int argc, char* argv[]){ LoadLibrary("user32.dll"); _asm { push 0 push 0 push 0 push 0 mov eax,0x77D507EA call eax } return 0;}编译执行,成功弹框在push 0处按F9下断点,F5进入调试模式跳至断点处按Alt+8将当前VC代码转为汇编代码,如图12: push 00040103C push 013: push 00040103E push 014: push 000401040 push 015: push 000401042 push 016: mov eax,0x77D507EA00401044 mov eax,77D507EAh17: call eax00401049 call eax接着提取上述代码在内存中的数据,如图范围是0040103C – 0040104A注:call eax的地址为00401049,表示起始地址,完整代码的长度需要+1按Alt+6打开查看内存数据的Memory窗口跳到0x0040103C,内容如下:0040103C 6A 00 6A 00 6A 00 6A 00 B8 EA 07 D5 77 FF D0 j.j.j.j.戈.誻..截取0040103C – 0040104A的内容如下:6A 00 6A 00 6A 00 6A 00 B8 EA 07 D5 77 FF D0这段机器码就是接来下要使用的shellcode3、编写加载shellcode的测试程序#include "stdafx.h"#include int main(int argc, char* argv[]){ LoadLibrary("user32.dll"); char shellcode[]=" 6A 00 6A 00 6A 00 6A 00 B8 EA 07 D5 77 FF D0"; ((void(*)(void))&shellcode)(); return 0;}成功执行shellcode注:由于Win7系统引入了ASLR机制,因此我们不能在shellcode中使用固定的内存地址,上述方法在Win7下不通用0x03 Shellcode自动生成工具——ShellcodeCompiler下载地址:https:///NytroRST/ShellcodeCompiler特点:c++开发开源工具借助NASM可实现封装api,转换为bin格式的shellcode和asm汇编代码实际测试:Source.txt内容如下:function MessageBoxA("user32.dll");function ExitProcess("kernel32.dll");MessageBoxA(0,"This is a MessageBox example","Shellcode Compiler",0);ExitProcess(0);cmd下运行:ShellcodeCompiler.exe -r Source.txt -o Shellcode.bin -a Assembly.asm注:ShellcodeCompiler.exe和文件夹NASM放于同级目录执行后shellcode保存在Shellcode.bin文件中为便于测试生成的shellcode,可在生成过程中加入-t参数执行一次shellcode我参考ShellcodeCompiler的代码将其执行shellcode的功能提取出来,实现了读取文件并加载文件中的shellcode,完整代码如下:#include size_t GetSize(char * szFilePath){ size_t size; FILE* f= fopen(szFilePath, "rb"); fseek(f, 0, SEEK_END); size = ftell(f); rewind(f); fclose(f); return size;}unsigned char* ReadBinaryFile(char *szFilePath, size_t *size){ unsigned char *p = NULL; FILE* f = NULL; size_t res = 0; // Get size and allocate space *size = GetSize(szFilePath); if (*size == 0) return NULL; f = fopen(szFilePath, "rb"); if (f == NULL) { printf("Binary file does not exists!\n"); return 0; } p = new unsigned char[*size]; // Read file rewind(f); res = fread(p, sizeof(unsigned char), *size, f); fclose(f); if (res == 0) { delete[] p; return NULL; } return p;}int main(int argc, char* argv[]){ char *szFilePath=argv[1]; unsigned char *BinData = NULL; size_t size = 0; BinData = ReadBinaryFile(szFilePath, &size); void *sc = VirtualAlloc(0, size, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE); if (sc == NULL) { return 0; } memcpy(sc, BinData, size); (*(int(*)()) sc)(); return 0;}0x04 C++编写(不使用内联汇编),实现动态获取API地址并调用,对其反汇编可提取出shellcode对于ShellcodeCompiler,最大的不足是使用了内联汇编,vc在64位下默认不支持内联汇编,所以该方法无法生成64位shellcode 注:delphi支持64位的内联汇编vc在64位下虽然不能直接使用内联汇编,但是可以将程序段全部放到一个asm文件下进行编译X64上恢复VS关键字__asm的方法可参照:/showthread.php?p=1260419那么,想要开发一个64位的shellcode,最直接的方式就是不使用内联汇编,纯c++编写,实现动态获取API地址并调用,最后对其反汇编进而得到shellcode好处如下:便于调试,源代码的可读性大大增强但是,我在网上并没有找到现成的代码,于是根据原理尝试自己实现注:1、编写shellcode需要实现以下步骤:获取kernel32.dll基地址定位GetProcAddress函数地址使用GetProcAddress确定LoadLibrary函数地址使用LoadLibrary加载DLL文件使用GetProcAddress查找某个函数的地址(例如MessageBox)指定函数参数调用函数2、另一个参考资料:/showthread.php?t=203140参考资料通过c++实现了加载一个第三方dll以此为参考进行修改,实现我们想要的功能:实现动态获取API地址并调用完整代码已上传至github:https:///3gstudent/Shellcode-Generater特点:支持x86和x64纯c++实现,动态获取GetProcAddress和LoadLibrary函数的地址编译前对VisualStudio做如下配置:1、使用Release模式。
如何编写一个shellcode
如何编写一个 shellcode
ShellCode的编写就是将函数或变量在内存中的间接地址改为函数或变量在内存中的直接地址,直接调用! 以MessageBox函数为例进行讲解如下 新建shellcode.cpp:
编写代码如下: 运行结果: 将VC代码转换成汇编指令:
内存数据图: 函数的真实地址找到之后,修改代码如下: 将以上汇编指令转换成二进制数据: 内存数据图: 将0x0040103C~0x00401049之间的二进制数据复制出来 如下: 6A 00 6A 00 6A 00 6A 00 B8 1E FD 0B 75 FF D0 最终shellcode代码:
运行结果:
ቤተ መጻሕፍቲ ባይዱ
Exploit编写教程9_编写Win32Shellcode
Exploit编写教程9_编写Win32ShellcodeExploit编写教程九:Win32 Shellcode编写By flypuma 0x0 前言大多数情况下,Metasploit(或者是其他公开的可用资源)的payload能够满足你的需求并且允许你证明你的观点—你能通过漏洞来控制一台机器。
然而,今天我们来看看怎样你才能写出自己的shellcod并且克服执行代码过程中会停止程序的一些限制(比如说null字节)。
我觉得exploit编写者懂得如何才能写出好的shellcode是很重要的。
我的目标不是叫人们写他们自己的shellcode,而是理解shellcod 是怎么工作的(当你理解了为什么shellcode不能工作时,就会更容易得到知识),并且在需要写特殊功能的shellcode时能够写出自己的shellcode,或者在需要时能够修改一些已经存在的shellcode。
0x1 编写环境搭建C/C++编译器:lcc-win32, dev-c++, MSVisual Studio Express C++汇编编译器:nasm调试器:Immunity Debugger反汇编:IDA ProActiveState Perl(需要用来运行一些教程里用到的脚本)MetasploitSkylined:alpha3,testival,beta3一些测试shellcode的c程序:(shellcodetest.c)char code[] = "paste your shellcode here";int main(int argc, char **argv){int (*func)();func = (int (*)()) code;(int)(*func)();}0x2 测试现有shellcode学习shellcode是构造方法之前,我想展示一些测试已经写好的shellcode 或者你自己的shellcode的技术。
shellcode之三:shellcode编写-电脑资料
shellcode之三:shellcode编写-电脑资料声明:主要内容来自《The Shellcoder's Handbook》,摘录重点作为笔记并加上个人的一些理解,如有错,请务必指出,。
系统调用Shellcode是一组可注入的指令,可在被攻击的程序内运行。
由于shellcode要直接操作寄存器,通常用汇编语言编写并翻译成十六进制操作码。
我们想让目标程序以不同与设计折预期的方式运行,操纵程序的方法之一是强制它产生系统调用。
在Linux里有两种方法来执行系统调用。
间接的方法是libc,直接的方法是用汇编指令调用软中断执行系统调用。
在Linux里,程序通过int 0x80软中断来执行系统调用,调用过程如下:1、把系统调用编号载入EAX;2、把系统调用的参数压入其他寄存器;最多支持6个参数,分别保存在EBX、ECX、EDX、ESI、EDI和EBP里;3、执行int 0x80指令;4、CPU切换到内核模式;5、执行系统函数。
如何得到一个shellcode注意两点:1、shellcode应该尽量紧凑,这样才能注入更小的缓冲区;2、shellcode应该是可注入的;当攻击时,最有可能用来保存shellcode的内存区域是为了保存用户的输入而开辟的字符数组缓冲区。
因此shellcode不应包含空值(/x00),在字符数组里,空值是用来终止字符串的,空值的存在使得把shellcode复制到缓冲区时会出现异常。
下面以exit()系统调用为例写一个shellcode。
exit()的系统编号为1。
用汇编指令实现Section .textglobal _start_start:mov ebx,0mov eax,1int 0x80用nasm编译生成目标文件,然后用GNU链接器链接目标文件,最后用objdump显示相应的操作码(下图的标号为_start部分)sep@debian66:~/shellcode$ nasm -f elf shellcode.asmsep@debian66:~/shellcode$ ld -o shellcode shellcode.osep@debian66:~/shellcode$ objdump -d shellcodeshellcode: file format elf32-i386Disassembly of section .text:08048080 <_start>:8048080: bb 00 00 00 00 mov $0x0,%ebx8048085: b8 01 00 00 00 mov $0x1,%eax804808a: cd 80 int $0x80sep@debian66:~/shellcode$shellcode[] = {"/xbb/x00/x00/x00/x00/xb8/x01/x00/x00/x00/xcd/x80"},可以发现里面出现很多空值,基于shellcode的可注入性,我们需要找出把空值转换成非空操作码的方法,电脑资料《shellcode之三:shellcode编写》(https://www.)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第二章、Windows下ShellCode编写初步
---------------------------------------------编写ShellCode有目前流行的有两种方法:用C语言编写+提取;用汇编语言编写和提取。
就个人感觉而言,用汇编语言编写和提取是最方便的,因为ShellCode代码一般比较短,要完成的任务也相对单一,一般不涉及复杂的运算。
因此可以用汇编语言编写。
而且用汇编编写便于数据的控制、代码定位及生成的控制,在某些汇编编译器中,提供了直接生成二进制代码功能并提供了直接包含二进制文件的伪指令,这样就可以直接编写一个makefile文件将
ShellCode代码和攻击程序分开,分别编写和调试,而无需print、拷贝、粘贴等操作,只需在攻击程序中加入一段编码代码就可以了。
这样也便于交流。
但现在网络上流行的都是C编写的ShellCode,不过最终要生成的是ShellCode代码,这就涉及到提取C生成的汇编代码的问题。
但在C中由于编译器会在函数的开始和结束生成一些附加代码,而这些代码未必是我们需要的,还有一个问题就是要提取代码的结束在C 中没有直接的操作符获取。
这些实际上也都不是很难,只要在函数的开始和结束加入特征字符串用C库函数memcmp搜索即可定位。
对ShellCode的编码可写一段程序进行,比如XOR法的。
最后写一段函数将编码后的ShellCode打印出来,复制、粘贴就可以用在攻击程序里面了。
其中的一些问题有:
★1.KERNEL基地址的定位和API函数地址的获取
原来的代码中采用的是暴力搜索地址空间的方法。
这不算最佳方法,因为一是代码比较多,
二是要处理搜索无效页面引发的异常。
现在还有两种方法可用:
一种是从PEB相关数据结构中获取,请参考绿盟月刊44期SCZ的《通过TEB/PEB 枚举当前进程空间中用户模块列表》一文。
另外一种方法就是搜索进程的SEH链表获取Kernel32.UnhandledExceptionFilter 的地址,
★2.几段代码的作用
代码其作用是定位Shell_start处的代码,便于装配,由于在C中没有方便的
手段定位代码的长度和位置,因此采用此变通的做法。
在这种方法不符合编码
的要求时,可以采用动态计算
和写入的方法。
不过复杂了一点罢了。
★3.关于局部变量的地址顺序
在原程序中采用了如下局部变量结构:
以为这样编译器生成的变量地址顺序就是这样的,在有些机器上也许如此,不过在我的机器上则不然。
这证实了局部变量的实际地址并不是完全按我们自己定义排列的。
因此原来ShellCode中采用的
直接使用函数名的方法就可靠了。
因此我采用了其它的方法,C提供的Enum 关键字使得这项工作变得容易,详见下面的代码。
★4.more
关于变形ShellCode躲避IDS检测,以及编码方法等需进一步研究。
★5.代码
可见,用C编写ShellCode需要对代码生成及C编译器行为有更多了解。
有些地方处理起来也不是很省力。
不过一旦模板写成,以后写起来或写复杂ShellCode 就省力多了。
增加API时只要在相应的.dll后增加函数名称项(如果str中还没有相应的dll,增加之)并
同步更新Enum的索引即可。
调用API时直接使用:
API[_APINAME](param,....param)
-------------------------------------------。