0x01 前言

 
本文的目的不是为了介绍如何进行恶意的破坏性活动,而是为了教会你如何去防御此类破坏性活动,以帮助你扩大知识范围,完善自己的技能,如有读者运用本文所学技术从事破坏性活动,本人概不负责。
 

0x02 什么是Shellcode

 
shellcode是用作利用软件漏洞的有效载荷的一小段代码,因为它通常启动一个命令shell,攻击者可以从中控制受攻击的机器,所以称他为shellcode。但是任何执行类似任务的代码都可以称为shellcode。 因为有效载荷的功能不仅限于一个shell。
shellcode基本的编写方式有以下三种
 
  • 直接编写十六进制操作码。
  • 使用c语言编写程序,然后进行编译,最后进行反汇编来获取汇编指令和十六进制操作码。
  • 编写汇编程序,将该程序汇编,然后从二进制中提取十六进制操作码。
 
第一种方法很极端,直接编写十六进制操作码是一件非常难得事情。下面我将带大家一步步去编写自己的shellcode。


0x03 execve系统调用

 
在Linux系统上执行程序的方式有多种,但是其中使用最广泛的一种方式就是通过借助execve系统调用。我们首先来看看execve的使用方法。

 
说明看起来很复杂,其实很简单。我们先使用c语言来实现它。


c语言实现execve系统调用创建shell

 
我们首先来新建一个文件:
 

 
我们使用vim来编写代码:
 
看完上面的介绍,使用c语言来实现就很简单了。
1
2
3
4
5
6
7
8
9
#include <unistd.h>
 
int main()
{
    char * shell[2];
    shell[0]="/bin/sh";
    shell[1]=NULL;
    execve(shell[0],shell,NULL);
}
 
然后我们使用gcc编译器来编译一下:
 

gcc test.c -o test.o

 
运行看看:
 

 
成功执行创建一个shell。


转向汇编语言

 
前面我们已经使用c语言来实现了,现在我们就需要用汇编语言来重写execve系统调用,其实很简单。我们先来查看一下execve系统调用号:11

汇编代码重写:
 
首先我们将寄存器eax清零。
 

xor eax,eax

 
然后我们将寄存器eax进行入栈操作,其实就是将字符串末尾的空字符值入栈:
 

push eax

然后将//sh入栈(由于需要对齐,因此这里用了四个字节)

push 0x68732f2f

 
最后将/bin入栈。

push 0x6e69622f

 
现在栈上已经有了全部所需数据,现在就是设置execve系统调用了。
[AppleScript] 纯文本查看 复制代码
1
2
3
4
5
6
7
mov ebx,esp
push eax
push ebx
mov ecx,esp
xor edx,edx
mov al,0xb  ;0xb表示其系统调用号的十六进制,execve的系统调用号为11
int 0x80
完整代码如下:
 
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
section .text
global _start
 
_start:
xor eax,eax
push eax
push 0x68732f2f
push 0x6e69622f
mov ebx,esp
push eax
push ebx
mov ecx,esp
xor edx,edx
mov al,0xb
int 0x80

汇编链接测试

 
首先使用nasm进行汇编

root@kali:~/demo# nasm -f elf test.asm

 
然后使用ld链接

root@kali:~/demo# ld -o test test.o

 
运行测试看看

root@kali:~/demo#./test
#

0x04 提取十六进制操作码并测试Shellcode

 
获得十六进制操作码很简单,我们只需要使用objdump工具的-d选项来进行反汇编即可:
 

 
最后我们检查一下有没有出现空字符(\x00)。


测试shellcode

 
首先我们将十六进制操作码放入一个名为shellcode[]的缓冲区中。
 
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
 
char shellcode[]=
"\x31\xc0"
"\x50"
"\x68\x2f\x2f\x73\x68"
"\x68\x2f\x62\x69\x6e"
"\x89\xe3"
"\x50"
"\x53"
"\x89\xe1"
"\x31\xd2"
"\xb0\x0b"
"\xcd\x80";
 
int main()
{
    void (*fp) (void);
    fp=(void *)shellcode;
    fp();
}
然后我们分配一个名为fp的函数指针,然后将这个函数指针设置为shellcode[]的起始地址。最后我们执行这个函数。
现在我们编译一下,这里注意一下,编译成功后我们还是不能成功执行的,会出现段错误的提示,这是因为系统本身有数据区执行保护机制,导致在全局数据段的shellcode不能被运行,即出现段错误。
 

 
这里我们先安装一下execstack。

sudo apt-get install execstack

 
然后针对编译后的程序使用execstack

execstack -s 程序名

 
之后执行就OK了
 

总结

 
现在我们已经知道一个shellcode编写流程了,别走开,这只是基础篇,我们实现的这个shellcode缺乏实战,下一篇教程我们继续完善这个shellcode。
 
参考:
《汇编语言(第3版) 》王爽
《[科普]浅入浅出Liunx Shellcode》pr0cess

二进制入门-打造Linux shellcode基础篇的更多相关文章

  1. 小朋友学Linux<一>基础篇

    Linux最基础之<小朋友也能学会Linux>... 1.Linux 知识积累: Linux 英文解释为 Linux is not Unix.学习Linux必须要熟练使用的操作系统是Cen ...

  2. DDD从入门到精通:基础篇

    这篇文章主要还是表述清楚DDD相关的基础概念,因为DDD入门有一定的专业名词,还是得有个基本的了解. 先讲解下领域模型作用: 对软件需求进行设计,维持其内在逻辑的一致性 1)划分边界.也是一种高内聚. ...

  3. linux操作系统基础篇(七)

    Linux服务篇(二) 1.nfs服务的搭建 安装: yum install rpcbind nfs-utils -y 配置: NFS服务的配置文件为 /etc/exports,这个文件是NFS的主要 ...

  4. linux操作系统基础篇(六)

    linux服务篇 1.samba服务的搭建 samba的功能: samba是一个网络服务器,用于Linux和Windows之间共享文件.2. samba服务的启动.停止.重启service smb s ...

  5. linux操作系统基础篇(一)

    1.什么是linux? Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的UNIX工具软件.应用程序 ...

  6. 零基础入门之Linux进程基础

    计算机实际上可以做的事情实质上非常简单,比如计算两个数的和,再比如在内存中寻找到某个地址等等.这些最基础的计算机动作被称为指令(instruction).所谓的程序(program),就是这样一系列指 ...

  7. Linux学习——————基础篇

    一.linux试用 1.使用man或者info查询 2.超级简单的文本编辑器:nano 3.sync:数据同步写入磁盘,将内存中的数据写入磁盘 3.惯用的关机命令:shutdown /sbin/shu ...

  8. linux操作系统基础篇(五)

    Linux网络以及rpm安装yum源的配置 1.Linux网络 1. 使用ifconfig命令来维护网络1) fconfig命令的功能:显示所有正在启动的网卡的详细信息或设定系统中网卡的IP地址.2) ...

  9. linux操作系统基础篇(四)

    一.系统监控 1.TOP 命令 1) top命令的功能:top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. 2) 使用top命令列 ...

随机推荐

  1. Android Makefile中是 如何识别 TARGET_PRODUCT 的

    http://blog.csdn.net/stevenliyong/article/details/5285334 今天有时间小看一下Android 的Makefile, 终于稍有明白Android ...

  2. AJAX-DOM事件

    1.DOM事件 1.select的onchange事件 当选项框中的内容发生改变时需要出发的事件.2.Ajax 1.名词解释 1.同步 在一个任务进行中,不能开启其它的任务. 同步访问:浏览器在向服务 ...

  3. MySQL基准测试--innodb_buffer_pool_instances

    http://blog.chinaunix.net/uid-26896862-id-3345441.html 目的 根据现有硬件环境下,测试MySQL单实例下,在数据量小于innodb_buffer_ ...

  4. 算法工程师A

    美团点评2017校招笔试真题-算法工程师A   美团点评2017校招笔试真题-算法工程师A 1.下面哪种STL容器的实现和其它三个不一样 A. set B. deque C. multimap D. ...

  5. 2018.12.14 codeforces 922E. Birds(分组背包)

    传送门 蒟蒻净做些水题还请大佬见谅 没错这又是个一眼的分组背包. 题意简述:有n棵树,每只树上有aia_iai​只鸟,第iii棵树买一只鸟要花cic_ici​的钱,每买一只鸟可以奖励bbb块钱,从一棵 ...

  6. Firefox,chrome,IE上传图片预览

    首先判断IE或是Firefox,chrome.本文只测试了IE8中和Firefox,chrome是不一样的. 判断是否IE: if(-[1,]){//判断浏览器不是IE    //alert((-[1 ...

  7. vue 开发系列(二) vue ajax 拦截

    概要说明 在开发的过程中,我们需要通过AJAX请求,访问后台获取数据,这个获取数据的时候,当然需要后台需要时登录状态才能访问数据,当没有登录的情况,这个时候我们需要跳转到登录界面进行登录. 如果每次请 ...

  8. 容器监控告警方案(cAdvisor + nodeExporter + alertmanager + prometheus +grafana)

    一.prometheus基本架构 Prometheus 是一套开源的系统监控报警框架.它启发于 Google 的 borgmon 监控系统,由工作在 SoundCloud 的 google 前员工在 ...

  9. VB6.0中WinSock控件属性和方法详解

    原文链接:http://liweibird.blog.51cto.com/631764/653134 WinSock控件能够通过UDP协议(用户数据报协议)或TCP协议(数据传输协议)连接到远程的机器 ...

  10. 开发.Net Script 模板-MyGeneration (翻译)

    原文信息 原文地址 原文作者信息 Justin Greenwood MyGeneration Software http://www.mygenerationsoftware.com/ October ...