栈溢出漏洞
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
会截断特殊字符,所以你的恶意代码可能会被截断,因此我们需要对恶意代码出现截断字符进行转义,我们采取异或方式进行处理。
鄙人写了一个小程序方便快速转义,可以通过下文链接下载。
我们从头整理我们需要做的事情:
- 伪装"pd.txt"
- “pd.txt” 内部进行栈溢出
- “pd.txt” 再次利用scanf 进行栈溢出加载恶意程序
- 异或返回恶意程序源代码
- 运行异或代码
保护
下面两个安全开关都会校验内存区域的可执行权限。一般情况下不可执行区域的权限不会严格检验。
- 开启电脑DEP
选项有两个,一个是全局性,一个是连接器选项:
全局性开关:
连接器选项
跳板地址改为修改权限即可绕过这类保护
- 编译器开启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
以上是关于栈溢出漏洞的主要内容,如果未能解决你的问题,请参考以下文章