Shellcode实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限。另外,Shellcode一般是作为数据发送给受攻击服务的。 Shellcode是溢出程序和蠕虫病毒的核心,提到它自然就会和漏洞联想在一起,毕竟Shellcode只对没有打补丁的主机有用武之地。网络上数以万计带着漏洞顽强运行着的服务器给hacker和Vxer丰盛的晚餐。漏洞利用中最关键的是Shellcode的编写。由于漏洞发现者在漏洞发现之初并不会给出完整Shellcode,因此掌握Shellcode编写技术就显得尤为重要。
目录
Shellcode编写考虑因素
常见问题处理方法
编程感想
编辑本段Shellcode编写考虑因素
Shellcode一般作为数据发送给服务端造成溢出,不同数据对数据要求不同,因此,Shellcode也不一定相同。但Shellcode在编写过程中,有些问题是一致的:
⒈Shellcode的编写语言。
用什么语言编写最适合Shellcode呢?这个问题没有定论。一般采用的是C语言,速度较快,但是ASM更便于控制Shellcode的生成。到底是快速编写还是完全控制呢?很难回答呢。
⒉Shellcode本身代码的重定位。Shellcode的流程控制,即如何通过溢出使控制权落在Shellcode手中
⒊Shellcode中使用的API地址定位。
⒋Shellcode编码问题。
⒌多态技术躲避IDS检测。
Shellcode编写技术
⒈Shellcode编写语言
Shellcode本质上可以使用任何编程语言,但我们需要的是提取其中的机器码。Shellcode使用汇编语言编写是最具可控性的,因为我们完全可以通过指令控制代码生成,缺点就是需要大量的时间,而且还要你深入了解汇编。如果你想追求速度,C是不错的选择。C语言编写起来较为省力,但Shellcode提取较为复杂,不过,一旦写好模板,就省事许多。例如,这里有一个写好的模板:
void Shellcode()
{
__asm
{
nop
nop
nop
nop
nop
nop
nop
nop
}
} |
然后在main()中用函数指针操作和memcmp定位shellcode,用printf之类函数将shellcode打出来或保存即可。示例代码略。纵观当前shellcode,大部分是由C完成的,因此,想来大家已经取舍完了吧?
⒉Shellcode代码地址定位,获取程序EIP。
为什么要获取EIP呢?原因是,我们需要我们的Shellcode能够执行,对病毒技术有了解的话,应该知道他们是怎么定位的:利用CALL/POP来实现。
这里就不得不提到两种方法:JMP ESP和CALL/POP EBX。这是人们在对windows系统熟悉之后的方法,成功率非常高。相信看过王炜兄的教程的朋友应该有印象吧。这里我就简单说一下。
我们的方法时通过Shellcode地址覆盖返回地址,在溢出后即可跳转到我们的代码中,以获取权限。而Shellcode在内存中的地址并不固定,因此我们利用系统的DLL文件中的JMP ESP或CALL ESP、CALL EBP来实现对Shellcode地址的间接跳转。这样有两个好处,一是不必准确定位Shellcode地址;二是可以防止strcpy对00字节的截断,因为DLL文件中,地址一般为7FXXXXXX。具体细节,网上已有相关的东东,大家自己找来看看吧。
⒊Shellcode中的API地址定位。
Shellcode代码的运行环境和病毒在某些方面是类似的,由于系统不同,Api的地址也不尽相同。因此,要想让Shellcode在不同Windows下运行就必须解决Api的定位问题。API定位的关键是了解Windows DLL映像文件格式,即PE文件格式,然后通过搜索函数的Export表获取API地址。定位方法有暴力搜索法、从进程PEB中获取和遍历SEH链法。我们这里使用从进程PEB中获取,示例代码如下:
__asm
{
push ebp;
sub esp, 0x40;
mov ebp,esp;
push ebp;
mov eax, fs:0x30 ;PEB
mov eax, [eax + 0x0c] ;Ldr
mov esi, [eax + 0x1c] ;Flink
lodsd
mov edi, [eax + 0x08] ;edi就是kernel32.dll的地址
mov eax, [edi+3Ch] ;eax = PE首部
mov edx,[edi+eax+78h]
add edx,edi ;edx = 输出表地址
mov ecx,[edx+18h] ;ecx = 输出函数的个数
mov ebx,[edx+20h]
add ebx,edi ;ebx =函数名地址,AddressOfName
search:
dec ecx
mov esi,[ebx+ecx*4]
add esi,edi ;依次找每个函数名称
;GetProcAddress
mov eax,0x50746547
cmp [esi], eax; 'PteG'
jne search
mov eax,0x41636f72
cmp [esi+4],eax; 'Acor'
jne search
;如果是GetProcA,表示找到了
mov ebx,[edx+24h]
add ebx,edi ;ebx = 索引号地址,AddressOf
mov cx,[ebx+ecx*2] ;ecx = 计算出的索引号值
mov ebx,[edx+1Ch]
add ebx,edi ;ebx = 函数地址的起始位置,AddressOfFunction
mov eax,[ebx+ecx*4]
add eax,edi ;利用索引值,计算出GetProcAddress的地址
mov [ebp+40h], eax ;把GetProcAddress的地址存在 ebp+40中 |
接下来是使用GetProcAddress()和LoadLibraryA()获取其他需要函数了,和C没什么两样,略过了吧,很累呢。
⒋Shellcode的编码问题。
写过Shellcode的兄弟对这个应该恨熟吧?例如:strcpy函数中不能有0x00,RPC DOCM溢出时不能用0x5c等等。
因为假如有这些字符,会导致服务中断Shellcode,溢出失败。不同溢出对shellcode要求不同,当然需要精选字符来达到目的,这样太累了些,简单点就是写一段代码,示例如下:
for(i=0;i ch=sc_buff^Enc_key;
//对可能字符进行替换
if(ch<=0x1f||ch==' '||ch=='.'||ch=='/'||ch=='\\'||ch=='0'||ch=='?'||ch=='%'||ch=='+')
{
buff='0';
++k;
ch+=0x31;
}
//将编码Code放在DecryptSc后
buff[k]=ch;
++k;
}
解码时代码 解码时代码,示例如下:
jmp next
getEncodeAddr:
pop edi
push edi
pop esi
xor ecx,ecx
Decrypt_lop:
loasb
cmp al,cl
jz shell
cmp al,0x30 //判断是否为特殊字符
jz specal_char_clean
store:
xor al,Enc_key
stosb
jmp Decrypt_lop
special_char_clean:
lodsb
sub al,0x31
jmp store
next:
call getEncodeAddr |
编写调试Shellcode很是辛苦,但完成之后却有巨大的成就感。这里不是教你做EXP去害人,只是从研究角度出发,让大家了解这种技术,从而加以防范,为网络和平安宁奉献自己的力量。
分享到:
相关推荐
Shellcode Helper v1.62 Coded by TeLeMan (c) 2008-2013 Usage: schelper.exe [options] Options: -i [input file] input file (Default: stdin) -o [output file] output file (Default: stdout) -s <format> ...
Shellcode是一种小的代码片段,常被用于漏洞利用中,用来控制受害者的计算机系统。根据给定文件的内容,我们可以提炼出以下知识点: 1. Shellcode的历史和发展 起初,Shellcode非常简单,多为通过命令行或环境变量...
Shellcode是一种特殊的低级代码,通常用汇编语言编写,用于在目标系统上执行特定操作。它是黑客和安全研究人员在利用软件漏洞时常用的工具。"Shellcode's Handbook"这本书可能是关于如何编写、理解和利用shellcode的...
### Linux下Shellcode编写手册概览及核心知识点 #### 一、基础知识介绍 **1.1 基本概念** - **内存管理**: 计算机中的内存是按需分配和管理的。对于程序员而言,了解内存的工作原理非常重要,尤其是在低级别的...
### Shellcode解析与功能分析 #### 一、Shellcode简介 Shellcode是一种小型代码段,通常用在漏洞利用中作为有效载荷执行恶意操作。它主要用于实现远程代码执行(RCE)攻击,能够帮助攻击者在目标系统上执行任意...
在Android系统中,shellcode是一种特殊的代码片段,用于在获得程序执行权限后,实现特定功能,比如控制系统、执行恶意操作等。随着Android设备的广泛使用,Android系统的安全性变得至关重要,而shellcode的编写和...
在IT领域,Windows操作系统中的动态链接库(DLL)和ShellCode是两个重要的概念,它们在软件开发、逆向工程和安全研究中都有广泛的应用。本文将深入探讨如何使用"cpp-DllToShellCode"工具将Windows DLL转换为...
Shellcode2exe for Js是一款工具,它允许用户将JavaScript(JS)编写的Shellcode转换为可执行(EXE)文件。Shellcode是一种低级代码片段,通常用于利用计算机软件中的漏洞,它可以直接在内存中执行,而无需通过磁盘...
本篇文章主要探讨如何利用这种技术将shellcode隐藏在BMP图片中,从而实现远程动态加载,增加隐蔽性和免杀性。Shellcode是攻击者常用的代码片段,通常用于绕过系统安全机制执行特定操作。 首先,我们要了解BMP文件的...
Shellcode是一种特殊的低级代码,通常用机器语言编写,用于执行特定的任务,如打开一个窗口、连接到远程服务器等。在网络安全领域,shellcode扮演着关键角色,常被利用于缓冲区溢出攻击中,以获取对目标系统的控制权...
ShellCode是一种特殊的低级机器码,常用于网络安全领域,尤其是exploit开发中,它可以直接执行在内存中,绕过系统安全机制。在Delphi中编写ShellCode,可以帮助开发者更好地理解和控制程序的底层运行机制,同时也...
**shellcode**是一种特殊的计算机代码,通常用于利用软件漏洞,以执行攻击者指定的任意代码。在本教程中,我们将探讨如何使用C++语言来编写shellcode,这是一门强大的编程语言,允许我们精确地控制内存和系统调用,...
### 最新免杀360,基于Shellcode字符混淆 #### 概述 本文将详细介绍如何利用Shellcode的字符混淆技术来实现恶意代码对反病毒软件的规避,特别是针对360安全卫士等主流安全解决方案。Shellcode作为一种小巧且功能...
Shellcode加载器是一种技术,主要用于在目标系统上执行任意代码,通常用于渗透测试或恶意软件开发。Shellcode是一小段机器码,可以直接被CPU执行,而无需通过解释器或虚拟机。这种加载器的设计旨在绕过安全机制,...
3. shellcode编写:shellcode是指能够被注入到目标系统中执行特定命令的小段代码。这些代码经常用于缓冲区溢出攻击中,用以获得未授权的控制。文档中提到了shellcode的编写,强调了对汇编语言的理解对于编写和理解...
这是一款超级便宜的shellcode转unicode工具,非常好用!
《渗透测试与Shellcode》是一本专注于网络安全领域的书籍,主要探讨了如何利用Shellcode进行渗透测试的技术和策略。Shellcode是一种特殊的低级代码,通常用汇编语言编写,用于在目标系统上执行攻击者指定的操作。它...
Shellcode转换工具是一种在IT行业中用于安全研究和逆向工程的专业工具。它主要用于将特定的机器码(通常为汇编代码)转换成“Shellcode”,Shellcode是一种可以在目标系统上执行任意代码的二进制 payload。这个过程...