Shellcode 开发关键技术

1. 位置代码无关性技术

定义:位置无关代码(PIC)是指不适用硬编码地址来寻址指令或数据的代码。

必要性:因为Shellcode被加载到内存地址执行时,指令的内存地址是不确定的。

Shellcode 开发关键技术_第1张图片

2.如何获取Shellcode起始位置

Shellcode在以位置无关方式访问时,首先需要引用一个 基址指针,用该基址指针加上或减去一定的偏移,从而顺利 的访问shellcode中包含的数据。 

Shellcode在以位置无关的方式访问指令和数据时,通常是通过基址地址加上偏移的方式来实现,该基址地址通常是shellcode的起始地址。

获取到该起始位置后,需要将其写入到一个通用寄存器中,作为后续基址指针来使用。 

方法:

(1) call/ pop 指令

Shellcode可以通过在一个call指令后立即执行 pop指令,将上一刻压入栈中的指令地址载入到 寄存器中,从而获取到shellcode起始的内存地 址。

Shellcode 开发关键技术_第2张图片

(2)Fnstenv指令

1.X87浮点单位(FPU)在普通x86架构中提供了一 个隔离的执行环境。它包含一个单独的专用寄存器 集合,当一个进程在使用FPU执行浮点运算时,这 些寄存器需要由操作系统在上下文切换时进行保存

2.和fnstenv指令使用的28字节结构体 FpuSaveState,这个结构体在32位保护模式中执 行时被用来保存FPU状态到内存中

Shellcode 开发关键技术_第3张图片

Shellcode 开发关键技术_第4张图片

Shellcode 开发关键技术_第5张图片

3.手动符号解析

定义:即获取shellcode中想要执行的函数内存地址

为了确保shellcode在不同的环境下均能可靠地工作, shellcode大多使用kernel32.dll中的LoadLibraryA 和GetProcAddress两个函数来进行函数解析。

LoadLibraryA函数加载指定的库到内存,并返回一个 句柄;GetProcAddress函数在库的导出表中查找给定 符号名或序号。

Shellcode 开发关键技术_第6张图片

4.空雪橇指令

在shellcode之前一段很长的指令序列,其并不是shellcode正常功能必需的,但是被包括在漏洞利用中,以增加漏洞利用成功的可能性。

shellcode编写者可以通过在shellcode钱插入一大段空指令雪橇实现这一点,只要代码执行到这个空指令雪橇中的某处。shellcode的功能就会得以运行。

Shellcode 开发关键技术_第7张图片

5.坏字符

如果shellcode中包含某些字符后便不能成功执行, 则称该字符为坏字符。 

导致shellcode不能正常执行的原因:

(1)第一类是该字符截断了后续输入,使shellcode未能完整的 装载进内存,该情况下坏字符的产生是由输入函数本身决定 的 

Shellcode 开发关键技术_第8张图片

(2)第二类是该字符在代码解析过程中,被替换成其他字符或者 被自动忽略,导致被当做汇编代码执行时语义发生改变,该 情况下坏字符的产生是由程序处理逻辑决定的

Shellcode 开发关键技术_第9张图片

规避坏字符:

(1)利用工具:Msfvenom -b 参数

添加编码头

Shellcode 开发关键技术_第10张图片

(2)Windbg的mona插件中,compare功能帮助我们迅速定位坏字符

Shellcode 开发关键技术_第11张图片

6. Shellcode编码技术(绕杀软)

Shellcode 开发关键技术_第12张图片

Shellcode常用绕杀软技术:大多只能绕过静态检查,对于动态检测效果不佳

(1)调换指令块执行顺序

(2)选择不同的寄存器

(3)插入无关语句,进行混淆

(4)相同予以的不同表达

(5)Shellcode编码

7.相关工具介绍

(1)Pwntools-shellcraft

在Linux系统下可以使用pwntools加速漏洞利用脚本的开发过程。该模块可以生成不同指令架构下不同功能的shellcode。

(2)Msfvenom

Msfvenom是Metasploit工具箱中的一款工具,通过它能够产生不同平台架构、不同操作系统、不同功能的shellcode;

Shellcode 开发关键技术_第13张图片

 

你可能感兴趣的:(CTF)