shellcode相关知识整理

0x1概述

shellcode是binary堆栈溢出中常见的一种利用手段。顾名思义,shell指的就是Linux里用户与内核进行交互操作的一种接口,它通常具备一定的访问控制权限。code则是表示一段代码。合起来shellcode便有着恶意代码的意思。
在存在一些漏洞的程序上使用shellcode很多情景下会对程序甚至系统产生严重的危害。例如非法完成系统调用,打开一个远程设备的shell。劫持程序的控制流读取一些路径下的文件数据。以及完成关机命令系统的调用等等。
在反复对栈溢出进行学习的过程接触了shellcode相关的一些知识,俗话说得好:好记性不如烂笔头。抽空对学过的知识进行总结总是好的。

0x2 shellcode原理

从binary底层的角度出发,所有的程序运行的代码最终都转化为二进制的0和1在CPU中运算而实现的。二进制0.1代码向上层整合为机器码、汇编语言、以及开发时使用的高级语言。在这里我们在汇编的部分进行实验观察,来探寻一下shellcode在底层的原理,先整过来一段shellcode瞅瞅看:

shellcode = "\x31\xc0\x31\xdb\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\
xd2\xb0\x0b\x51\x52\x55\x89\xe5\x0f\x34\x31\xc0\x31\xdb\xfe\xc0\x51\x52\x55\x89\xe5\x0f\x34"

这些16进制的字符串叫做opcode。opcode由最多6个域组成,是和汇编指令对于的机器码。
这段机器码对应的汇编为:

asm {                           
  global _start
  _start:
  xor eax,eax   //eax置0
  xor edx,edx   //edx置0
  push edx
  push "/sh"
  push "/bin"   //将/bin/sh入栈
  mov ebx,esp   //ebx指向/bin/sh这个字符串
  xor ecx,ecx
  mov al,0Bh    //eax置为execve函数的中断号
  int 80h       //调用软中断
}

在这段汇编当中对应完成的就是完成一次系统调用:打开一个/bin/bash 的shell

0x4系统调用

在上面shellcode的原理部分提到了系统调用。在这儿我们具体看看系统调用是啥:
首先贴一个网站:http://syscalls.kernelgrok.com/
在这里插入图片描述
在这里我们可以看到sys_execve编号的系统调用在寄存器中的具体格式是这样的
1.将系统调用号传到eax中。
2.ebx用于保存函数调用的第一个参数(ecx存放第二个参数,edx存放第三个参数,esi存放第四个参数,edi存放第五个参数)
3.ecx与edx的值应相等。
4.调用int 0x80 汇编指令来出发系统软中断,强迫内核暂停手头上的工作并处理该中断。
此时对应我们上文的汇编指令就很清晰了:EAX = 0xb = 11,EBX = &(“/bin//sh”), ECX = EDX = 0,再调用int 0x80 ,即执行了sys_execve("/bin//sh", 0, 0, 0)从而完成系统调用。

0x5 一次直观的shellcode使用

在这里插入图片描述
在这里我们通过向一个binary程序栈溢出后在其中的一块bss段写入一段shellcode可以看到它执行了系统调用并打开了程序所在系统的shell拥有root权限可使用bash命令进行对系统例如文件遍历的操作。

0x6 shellcode的伪装

在很多情况下,shellcode是无法想当然就能任意达到使用条件的。例如程序使用scanf函数来获取一段char类型的字符串,将这段字符串则遇到"\0"就会截断转到对应的地址。再例如通过输入函数读入的数据有格式限制或者输入内容通过其他的功能函数转化为其他字符串类型。都会造成我们的shellcode失效。在这里主要的问题如下:存在有输入限制的功能模块使得一些字符被过滤无法继续组成原本shellcode的情况。这就需要对shellcode进行处理:
在这儿我们使用kali下的msfvenom这个msf框架下的一个工具。
在这里插入图片描述
我们可以通过对应的参数来选择适合的,符合相关条件的编码参数。例如我们要过滤有\0x00字符的内容。
接下来我们来尝试绕过限制输入只能是base编码限制的情况下对shellcode进行编码:
在这里插入图片描述
这样我们就可以将一段机器码转化为base64的格式
在这里插入图片描述
在这个程序中可以看到我们输入的buf会转化为base64格式后转化成函数指针调用执行。
这里我们可以将刚刚的那段shellcode输入看能否获取shell:
在这里插入图片描述
这儿充分说明shellcode的格式在一些情况下需要进行编码调整来完成‘’伪装‘’。

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 input file format (Default: Auto-Detection) -sb input file format is Binary -sp the input file format's parameters -d output file format (Default: C format) -db output file format is Binary -dp the output file format's parameters -search get the start offset by the pattern: e.g. PK\x03\x04 -soff fix the match offset after searching (Default: 0) -off convert the input file from the offset (Default: 0) -len convert the input file with the length (Default: 0 - MAX) -en [encoder] encode shellcode (Default: XorDword) -de [encoder] decode shellcode (Default: Auto-Detection) -ex exclude characters: e.g. 0x00,0x01-0x1F,0xFF (Default: 0x00) -in incude characters only -ep the encoder's parameters -t [pid] execute or inject shellcode into process for testing -td [pid] execute or inject shellcode into process for debugging -stack put shellcode into stack and execute it (ESP is the shellcode start) -noinfo display no normal messages except error messages Available formats: 0 - C 1 - C(HexArray) 2 - Perl 3 - Python 4 - Ruby 5 - JavaScript(Escape) 6 - VBScript(Escape) 7 - Pascal 8 - MASM(Data) 9 - HexDump 10 - BitString 11 - HexString 12 - HexArray(C like) 13 - Base64 14 - Binary 15 - HexString(C like) 16 - HexString(Escape) 17 - HexString(JavaScript,UNICODE) 18 - URI(ISO-8859-1) 19 - XML(PCDATA) 20 - BigNumber 21 - BigNumber(Hex) 22 - BigNumber(BaseX) 23 - FloatPoint 24 - UnixTimestamp 25 - GUID 26 - MASM(ASM) 27 - NASM 28 - YASM(ASM) 29 - FASM(ASM) 30 - JWASM(ASM) 31 - POASM(ASM) 32 - GOASM(ASM) 33 - GNU ASM Available encoders:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值