本文利用栈溢出漏洞弹出一个警告窗口。
我们假设用户正在运行以下代码:
#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
会截断特殊字符,所以你的恶意代码可能会被截断,因此我们需要对恶意代码出现截断字符进行转义,我们采取异或方式进行处理。
鄙人写了一个小程序方便快速转义,可以通过下文链接下载。
我们从头整理我们需要做的事情:
下面两个安全开关都会校验内存区域的可执行权限。一般情况下不可执行区域的权限不会严格检验。
开启电脑DEP
PE中开启部分特性
跳板地址改为修改权限即可绕过这类保护
开了这个选项后,编译时会在函数EBP
之前插入一个探测数据。如下图所示
在函数进入后 会放一个变量到栈区中,在函数返回前插入一段代码检测这个变量是否改变。
我们编写shellcode时可以利用已有的工具帮助我们快速生产符合预期的代码,比如过滤掉特殊敏感字符。如注明的MSF
程序.
比如下面的命令會生成一個代碼無關的messagebox汇编代码
msfvenom -p windows/messagebox -e x86/shikata_ga_nai -f raw -o shellcode0