当前位置:首页 > 经验 >

shellcode执行方式(shell脚本的执行方法)

来源:原点资讯(www.yd166.com)时间:2022-11-07 08:13:07作者:YD166手机阅读>>

本篇主要是以x64系统为例对系统调用中一些功能性函数的解读和实际运用。目前网络上流传的通用shellcode,均使用系统调用实现,在记录整个学习过程的同时分享给大家一起学习探讨。

0x01 Shellcode 简介0x1 shellcode

Shellcode 是一段可以执行特定功能的特殊汇编代码,在设备漏洞利用过程中注入到目标程序中从而被执行,在比赛或者是实战中栈溢出漏洞使用的更为频繁,编写Shellcode比编写RopGagdet更为简单,栈溢出的最经典的利用方式是Ret2Shellcode。

0x2 exploit 与 shellcode关系

exploit主要强调执行控制权,而shellcode更关注于有了控制权之后的功能。因此shellcode更像是exploit的载荷,往往对于不同漏洞来讲exploit是特殊的,而shellcode会具有一些通用性。

0x02 使用条件

对 shellcode 有了大概的了解之后,看一看其使用场景。一般来说这三点是必备条件,缺一不可,通过控制程序流程跳转到shellcode地址上去。

0x1 拥有程序控制权

这一点毋庸置疑,可以通过栈溢出或者是格式化字符串,堆溢出等漏洞劫持程序的执行流。所以shellcode等的定位是漏洞触发之后的漏洞利用,主要负责实现攻击者的攻击目的。

0x2 拥有shellcode地址

不论是程序拥有随机化还是固定基地址,都需要在跳转之前获取shellcode存储地址,一般采用的技巧是

  • 在程序bss段固定,且程序地址不随机
  • shellcode为程序正常功能输入,在寄存器中保存有其地址
  • 在堆栈附近存在与shellcode地址相关联地址
0x3 shellcode在可执行内存空间

最后跳转到shellcode地址上后需要有可执行权限才能执行。但通常程序开启NX保护后,其内存空间禁止代码执行,这是只能通过mprotect函数修改shellcode内存权限,赋予可执行权限后再跳转。一般利用 RopGagdet 布局mprotect 函数修改内存权限。

shellcode执行方式,shell脚本的执行方法(1)

重点关注两个方面 start地址和prot取值

1 起始地址

需要指出的是,锁指定的内存区间必须包含整个内存页(4K)。区间开始的地址start必须是一个内存页的起始地址,并且区间长度len必须是页大小的整数倍。

2 prot赋值

prot可以取以下几个值,并且可以用“|”将几个属性合起来使用,括号中的数字是在预编译的时候替换的真实值:

1)PROT_READ(1):表示内存段内的内容可写;
2)PROT_WRITE(2):表示内存段内的内容可读;
3)PROT_EXEC(4):表示内存段中的内容可执行;
4)PROT_NONE(0):表示内存段中的内容根本没法访问。

0x03 编写技巧

打算从系统调用函数、字符串设计、代码模板、shellcode提取这几个发面着手写这部分内容,主要解决以下三大问题:

  • 对系统调用函数不熟悉,特别是为参数赋值问题挠头
  • 对汇编代码编写不熟悉,解决寄存器和内存应用问题
  • 对汇编代码编译不熟悉,解决怎么从编译好的汇编程序中完整提取shellcode问题
0x1 系统调用函数

提到shellcode 就不得不说系统调用,我们首先考虑为什么要写shellcode,其目的是执行一些程序本身不具备的功能,实现攻击者的攻击目的。凑巧的是在汇编语言中有这么一些函数调用基本可以实现所有功能,我们称他们为系统调用函数,通过系统调用可以直接访问系统内核,具有非常强大的功能。

shellcode执行方式,shell脚本的执行方法(2)

详细的系统调用表网址如下

https://filippo.io/linux-syscall-table/
https://firmianay.gitbooks.io/ctf-all-in-one/content/doc/9.4_linux_syscall.html

系统调用 在汇编代码中表示为syscall(int 0x80)指令,32和64位系统有所区别,二者有单独调用表。

0x2 巧取字符串

初步认识shellcode的编写技巧,先从最简单的例子看起,下面代码如果当作汇编语言执行是完全没有问题的,但是如果做为shellcode的话还是差点火候。这里用两种方法规避这种错误:

section .data WRITE equ 1 EXIT equ 60 MESSAGE db "Hello", 0xa section .text global _start _start: mov rax, WRITE mov rdi, 1 mov rsi, MESSAGE mov rdx, 5 syscall jmp exit exit: mov rax, EXIT mov rdi, 0 syscall

编译指令如下

nasm -g -f elf64 -o asm.o asm.s ld -o asm asm.o

编译过后可以发现字符串位于data段,指针利用的是绝对地址,在shellcode中是不能出现绝对地址,这也是shellcode的头等大忌。

shellcode执行方式,shell脚本的执行方法(3)

1 方法一

利用call指令压栈的特性,将字符串的地址压栈之后再pop到寄存器中,在shellcode编写中是一种非常常用的方法。我们可以看到字符串紧跟在call指令之后,因为call压栈就是压的下一条指令的地址,此地址正好为字符串地址。

section .data WRITE equ 1 EXIT equ 60 section .text global _start _start: mov rax, WRITE mov rdi, 1 jmp getstring string: pop rsi mov rdx, 5 syscall jmp exit getstring: call string MESSAGE db "Hello", 0xa exit: mov rax, EXIT mov rdi, 0 syscall

2 方法二

同时也是利用栈的特性,将字符串计算过大小,以及分割完毕之后就可以分拨压进栈中,保存最后的esp值就可以实现字符串地址的获取。

section .data WRITE equ 1 EXIT equ 60 MESSAGE db "Hello", 0xa section .text global _start _start: mov rax, WRITE mov rdi, 1 mov rsi,0x00000a6f6c6c6548 push rsi mov rsi, rsp mov rdx, 5 syscall jmp exit exit: mov rax, EXIT mov rdi, 0 syscall 0x3 文件读

1 sys_open

文件读写都需要涉及打开文件操作,是通过内核提供的系统调用sys_open来实现的。具体参数如下:

asmlinkage long sys_open(const char __user *filename, int flags, int mode)

shellcode执行方式,shell脚本的执行方法(4)

栏目热文

shellcode到底是啥(shellcode使用教程)

shellcode到底是啥(shellcode使用教程)

零基础学黑客领资料搜公众号:白帽子左一因前段时间退出了内网的学习,现在开始复习web方面的漏洞了,于是乎,开始了挖洞之旅...

2022-11-07 08:17:00查看全文 >>

shellcode生成可执行文件(shell脚本怎么变成可执行文件)

shellcode生成可执行文件(shell脚本怎么变成可执行文件)

原创: EDI-VOID 合天智汇0x00 shellcode编写首先shellcode的编写可以用纯汇编也可以用c ...

2022-11-07 08:36:40查看全文 >>

shellcode编码(shellcode代码)

shellcode编码(shellcode代码)

前言在做红蓝攻防时,常常要用到cs、msf等工具,使用工具生成shellcode或可执行程序,那么小小的shellcod...

2022-11-07 08:22:18查看全文 >>

shellcode执行原理(shellcode安装)

shellcode执行原理(shellcode安装)

缓冲区溢出属于非常有名的漏洞之一,其大体含义为:缓冲区溢出是超出程序内存设定范围,数据溢出后程序发生异常,黑客可以利用缓...

2022-11-07 08:22:14查看全文 >>

shellcode生成器(shellcode使用教程)

shellcode生成器(shellcode使用教程)

关于GSHELLGShell是一款功能强大且支持灵活扩展的跨平台Shell生成器,在该工具的帮助下,广大研究人员可以随意...

2022-11-07 08:32:58查看全文 >>

shellcode类书(shell编程零基础的书籍)

shellcode类书(shell编程零基础的书籍)

书籍简介黑客与渗透测试编程之道本书是畅销书《Python 灰帽子—黑客与逆向工程师的 Python 编程之道》的姊妹篇,...

2022-11-07 08:07:13查看全文 >>

shellcode应该放在哪(shellcode使用教程)

shellcode应该放在哪(shellcode使用教程)

在开始今天课程之前,先回忆下上一讲在结束时,我提出的windows平台下的几个关键问题:1:缓冲区距离返回地址间的距离确...

2022-11-07 08:38:25查看全文 >>

通用shellcode编写实例(shellcode执行原理)

通用shellcode编写实例(shellcode执行原理)

1)编写 hello world 脚本#!/bin/bash # 编写hello world脚本 echo "...

2022-11-07 08:06:54查看全文 >>

shellcode怎么写(shellcode开发)

shellcode怎么写(shellcode开发)

这是2008年写的文章, 没有正式发表过,里面使用的环境不记得是i386Linux还是AMD64的Linux了。其实,叫...

2022-11-07 08:12:49查看全文 >>

shell脚本原理(shell脚本 基本知识)

shell脚本原理(shell脚本 基本知识)

Spring框架最新的PoC这两天出来的一个RCE漏洞,但是有以下的条件限制才行:必须是jdk9及以上必须是部署在tom...

2022-11-07 08:01:55查看全文 >>

文档排行