栈溢出漏洞

Posted 不会写代码的丝丽

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈溢出漏洞相关的知识,希望对你有一定的参考价值。

前言

本文利用栈溢出漏洞弹出一个警告窗口。

我们假设用户正在运行以下代码:

#include <stdio.h>
#include <string.h>


char Paswword[20]="aaaaaaaaaaaaaaaaaaa";


int main()
	
	char cPas[20]=0;

	int iResult;
	
	FILE * pFile =NULL;
	
	pFile = fopen("pd.txt","r");
	
	fscanf(pFile,"%s",cPas);

	iResult =strcmp(Paswword,cPas);
	
	if(iResult==0)
		printf("Welcome \\r\\n");
	else
		printf("fail \\r\\n");
	
	getchar();
	return 0;

就是一段读取文件后判断内容是否和预期相等。

这段代码代码在不开启任何系统保护时会利用fscanf进行栈溢出。
fscanf会一直读取字符串直到碰到特殊字符为止,而cPas又是在栈上的,假设我们有如下骚操作:
恶意程序伪装为pd.txt,并且大小大于20字节。那么将会覆盖原始的栈上存储的返回地址。



是一个很特殊的地址7ffa4512,大多数用户电脑这个内存地址都是一个特殊的指令jmp esp.我们把这个地址称为通用跳板地址,当然你可以找到其他类似地址。

也就是函数返回时会执行 jmp esp,转而跳转到我们栈溢出的代码。
我们绘制一个流程如下:

当你写了一伪装的pd.txt伪装文件后你会发现你的.恶意代码太长了,原始程序预留空间不足。

于是乎我们会在此利用fscanf漏洞,但在利用前首先抬起栈保证足够的存储空间放入恶意代码。

fscanf 会截断特殊字符,所以你的恶意代码可能会被截断,因此我们需要对恶意代码出现截断字符进行转义,我们采取异或方式进行处理。

鄙人写了一个小程序方便快速转义,可以通过下文链接下载。

我们从头整理我们需要做的事情:

  1. 伪装"pd.txt"
  2. “pd.txt” 内部进行栈溢出
  3. “pd.txt” 再次利用scanf 进行栈溢出加载恶意程序
  4. 异或返回恶意程序源代码
  5. 运行异或代码

保护

下面两个安全开关都会校验内存区域的可执行权限。一般情况下不可执行区域的权限不会严格检验。

  1. 开启电脑DEP
    选项有两个,一个是全局性,一个是连接器选项:

全局性开关:

连接器选项

跳板地址改为修改权限即可绕过这类保护

  1. 编译器开启GS选项

GS 安全选项


开了这个选项后,编译时会在函数EBP之前插入一个探测数据。如下图所示

在函数进入后 会放一个变量到栈区中,在函数返回前插入一段代码检测这个变量是否改变。


ROP

对于开启DEP选项的电脑,可以利用 ROP编程思想绕过保护。(RETURN ORIENTED PROGRAMMING)

思想:
DEP:会校验可执行权限

但是我们可以想办法调用VirtualProtect 去改变栈权限。

BOOL VirtualProtect(
  [in]  LPVOID lpAddress,
  [in]  SIZE_T dwSize,
  [in]  DWORD  flNewProtect,
  [out] PDWORD lpflOldProtect
);

假设我们能构造出溢出栈结构如下图所示,我们如果溢出时首先能调用VP改变内存属性,在执行恶意代码。

假设我们栈溢出时改变溢出的结构,溢出的代码首先调用构造一个VP函数栈结构。
但实际情况是很难构造出调用VP的三个参数。于是会在整个程序内存中寻找某些代码段填入

工具

我们编写shellcode时可以利用已有的工具帮助我们快速生产符合预期的代码,比如过滤掉特殊敏感字符。如注明的MSF程序.
比如下面的命令會生成一個代碼無關的messagebox汇编代码

msfvenom -p windows/messagebox -e x86/shikata_ga_nai -f raw -o shellcode0

源码

https://github.com/fanmingyi/studystackoverflow01

以上是关于栈溢出漏洞的主要内容,如果未能解决你的问题,请参考以下文章

vivotek栈溢出漏洞复现

栈溢出漏洞

栈溢出漏洞

栈溢出漏洞

Vivotek 摄像头远程栈溢出漏洞分析及利用

Winamp栈溢出漏洞研究