Shellcode入门

一、shellcode基础知识

  Shellcode实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限。另外,Shellcode一般是作为数据发送给受攻击服务器的。 Shellcode是溢出程序和蠕虫病毒的核心,提到它自然就会和漏洞联想在一起,毕竟Shellcode只对没有打补丁的主机有用武之地。网络上数以万计带着漏洞顽强运行着的服务器给hacker和Vxer丰盛的晚餐。漏洞利用中最关键的是Shellcode的编写。由于漏洞发现者在漏洞发现之初并不会给出完整Shellcode,因此掌握Shellcode编写技术就显得尤为重要。

  Shellcode本质上可以使用任何编程语言,但我们需要的是提取其中的机器码。Shellcode使用汇编语言编写是最具可控性的,因为我们完全可以通过指令控制代码生成,缺点就是需要大量的时间,而且还要你深入了解汇编。如果你想追求速度,C是不错的选择。C语言编写起来较为省力,但Shellcode提取较为复杂,不过,一旦写好模板,就省事许多。

二、用C语言编写获取shellcode

1.用于获取shellcode的C语言代码

2.编译与执行

execve(执行文件)在父进程中fork一个子进程,在子进程中调用exec函数启动新的程序。execve()用来执行第一参数字符串所代表的文件路径,第二个参数是利用指针数组来传递给执行文件,并且需要以空指针(NULL)结束,最后一个参数则为传递给执行文件的新环境变量数组。从图中可以,如果通过C语言调用execve来返回shell的话,首先需要引入相应的头文件,然后在主函数中调用系统调用函数execve;同时传入三个参数。

编译之后运行结果如下图

为了之后能够看到反汇编的结果,这次采用的静态编译。正常返回shell。

3.objdump反汇编

那么要想提取其中的shellcode就需要通过反汇编来获取相应的汇编代码或是二进制代码。

)我的这个实践中scode.c是xxyshellcode.c的副本,两者内容一致

)编译时必须要有64位到32位的转换:-m32,不然后续位数不匹配容易出问题

  

 4.采用gdb查看主函数main、execve的反汇编结果

从反汇编结果来看,execve函数执行的前一部分首先将向寄存器ebx,ecx,edx中赋值。之后调用了(*0x80e8a90)处的代码,该处就是_dl_sysinfo_int80,反汇编后发现其实是通过中断指令int 0x80进入ring0。也就是说exceve函数是通过调用软中断int 0x80进入ring0。

5.验证int 0x80调用

Shellcode的提取就是要获取exceve函数调用时的参数及软中断调用。通过软终端加载相应的系统调用号及参数来执行相应的任务。

  

  查看四个寄存器。

个参数ebx,刚好是"/bin/sh";第2个参数ecx是一个指针数组,第一个元素是第一个参数地址,第二个元素为空;第3个参数是edx为空。最后execve的系统调用号就放在了寄存器eax中=0xb。

(0xb)

  6.Shellcode的提取

由上面可以看出如果想要得到shellcode就需要将部分指令代码拼接。组成execve的系统调用如下图所示。(两块红色区域机器码拼接)

  

  

尽管这样可以实现shell返回的shellcode,但是里面包含里很多\x00空字符,只要在单独拷贝shellcode就很有可能导致shellcode阶段而不能正常执行shellcode,需要进行进一步加工,过于麻烦这里不详述。

三、用汇编语言形式写出shellcode

1.编写汇编源码,下图是一个返回shell的汇编源码

  

2.编译、链接、执行

链接过程中出现问题i386 architecture模式与i386:x86-64模式不匹配,需要多输入"-m elf_i386"转换一下

  

  执行之后成功返回shell

3.汇编代码分析

根据之前int 0x80中断指令调用形式,要求eax存放系统调用号;ebx、ecx、edx分别存放参数部分。

行eax清零;之后第5行压栈;然后第6行,第7行字符串压栈,这样在栈中就构造了以"\x00"结尾的字符串"/bin//sh"。注意这里的"/bin//sh"与"/bin/sh"同样效果。

行将该首地址赋给ebx,这样就有了int 0x80中断指令的第一个参数ebx;第9行中eax入栈,此时eax值还是0;第10行ebx入栈也就是把字符串"/bin//sh"地址入栈,两次压栈,此时栈中就有了字符串地址和一个0,刚好构成了一个指针数组;第11行将该指针数组的地址也就是esp赋给ecx,系统调用的第2个参数ecx中就保持了指针数组的地址;第12行edx清零,刚好是系统调用的第3个参数为零。第13行将系统调用号0xB赋给al,这样可以避免出现坏字符。最后调用软中断指令执行。

  栈空间的模型:

  

4.shellcode的提取

  

红框中的机器码就是该shellcode对应的指令代码,中间没有\x00坏字符,这样在拷贝时也就不会有截断问题。

5.shellcode有效性的验证

  通过一小段C语言代码来进行验证,代码如下(由上面提取到的shellcode指令代码而来)

  

  调试运行,发现"segmentation fault"了

  

  编译时对该程序启动栈空间可执行权限,问题解除。

  

Shellcode入门的更多相关文章

  1. 20145326蔡馨熠《网络对抗》shellcode注入&Return-to-libc攻击深入

    20145326蔡馨熠<网络对抗>shellcode注入&Return-to-libc攻击深入 准备一段shellcode 首先我们应该知道,到底什么是shellcode.经过上网 ...

  2. 逆向与Bof基础

    一逆向及Bof基础实践说明 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含 ...

  3. 2018-2019-2 20164312 Exp1 PC平台逆向破解

    1.逆向及Bof基础实践说明 1.1 实践目标 实验对象:一个名为pwn1的linux可执行文件. 实验流程:main调用foo函数,foo函数会简单回显任何用户输入的字符串.该程序同时包含另一个代码 ...

  4. 2018-2019-2 20165239其米仁增《网络对抗》Exp1 PC平台逆向破解

    一.实验内容 1.掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(0.5分) 2.掌握反汇编与十六进制编程器 (0.5分) 3.能正确修改机器指令改变程序执行流程(0.5分) 4.能 ...

  5. 2018-2019-2 20165316 《网络对抗技术》Exp1 PC平台逆向破解

    2018-2019-2 20165316 <网络对抗技术>Exp1 PC平台逆向破解 1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件 ...

  6. 2017-2018-2 20155314《网络对抗技术》Exp2 后门原理与实践

    2017-2018-2 20155314<网络对抗技术>Exp2 后门原理与实践 目录 实验要求 实验内容 实验环境 预备知识 1.后门概念 2.常用后门工具 实验步骤 1 用nc或net ...

  7. 2017-2018-2 20155314《网络对抗技术》Exp1 PC平台逆向破解(5)M

    2017-2018-2 20155314<网络对抗技术>Exp1 PC平台逆向破解(5)M 目录 实验要求 实验内容 预备知识 实验步骤 0 准备工作:macOS下Parallels De ...

  8. 2017-2018-2 20155303『网络对抗技术』Exp1:PC平台逆向破解

    2017-2018-2 『网络对抗技术』Exp1:PC平台逆向破解 --------CONTENTS-------- 1. 逆向及Bof基础实践说明 2. 直接修改程序机器指令,改变程序执行流程 3. ...

  9. 2018-2019 2 20165203 《网络对抗技术》 Exp1 PC平台逆向破解

    2018-2019 2 20165203 <网络对抗技术> Exp1 PC平台逆向破解 实验要求 1.掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码 2.掌握反汇编与十六 ...

随机推荐

  1. websocket Tomcat JSP Demo

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  2. linux shell的here document用法(cat << EOF)

    什么是Here Document?Here Document 是在Linux Shell 中的一种特殊的重定向方式,它的基本的形式如下cmd << delimiter  Here Docu ...

  3. 【奇淫技巧】API接口字段table文档转代码工具

    今天做一个视频接口对接,发现对方提供的文档没有json格式,无法自动生成请求和响应对象 json自动生成C#类的工具 http://tool.sufeinet.com/Creater/JsonClas ...

  4. opencv3 图像处理(一)图像缩放( python与c++ 实现)

    opencv3 图像处理 之 图像缩放( python与c++实现 ) 一. 主要函数介绍 1) 图像大小变换 Resize () 原型: void Resize(const CvArr* src,C ...

  5. 我的C语言编程风格

    前几天看别人的代码,真是的看的头昏脑涨,基本没有注释.乱起的变量名字,还要费尽心思去解读作者的意思.突然感觉高效的程序注释说明和良好的编程风格是多么的重要. 为了不让别人在看到我的代码时在背后骂我,也 ...

  6. js获取当前日期方法(YYYY-MM-DD格式)

      var myDate = new Date(); var time = myDate.toLocaleDateString().split('/').join('-');将1970/08/08转化 ...

  7. image的srcset属性

    介绍 响应式页面中经常用到根据屏幕密度设置不同的图片.这个时候肯定会用到image标签的srcset属性.srcset属性用于设置不同屏幕密度下,image自动加载不同的图片.用法如下: <im ...

  8. 《JAVA编程思想》第四版 PDF

    感谢,参考:https://www.cnblogs.com/buwuliao/p/8073211.html 一.链接: 中文版: https://pan.baidu.com/s/1d07Kp4 密码: ...

  9. Oracle课程档案,第五天

    集合操作 desc job_history:改变历史职位 job_history:历史表 vnion:重复值只保留一个 去除重复值 ★★ vnion all: 把所有重复值保留 不去除重复值★★ in ...

  10. Python学习之旅(三十六)

    Python基础知识(35):电子邮件(Ⅱ) 收取邮件就是编写一个MUA作为客户端,从MDA把邮件获取到用户的电脑或者手机上 收取邮件最常用的协议是POP协议,目前版本号是3,俗称POP3 Pytho ...