利用缓存区漏洞执行shellcode
2018-02-03 23:24
316 查看
环境:win10
工具:vc++6
原理介绍:
栈溢出,C语言中gets()、strcpy()等函数未进行数据长度的限定,在栈内写入超出长度限制的数据,从而破坏程序运行甚至获得系统控制权的攻击手段。几个常见的寄存器,ebp栈底指针,esp栈顶指针,eip下一条计算机执行的指令,计算机中真正的存储方式如下图:
原理介绍:eip寄存器里存储的是CPU下次要执行的指令的地址。eip在内存中位于ebp后4个字节(如下图,vc的调试)。
一个函数调用结束时,也就是在退栈过程中,返回地址会被传给eip,这一点非常重要。当返回地址被我们溢出的数据覆盖的时候,就可以控制eip,从而获得计算机的控制权,所以我们只需要让覆盖返回地址的数据恰好为shellcode的地址,就可以执行自己的shellcode了。
我提前写好了代码,先看主函数,定义了一个字符串shellcode用来溢出,将它传入overflow()函数,在overflow()函数中
利用strcpy()函数进行溢出,对数据进行填充。还有一个从头到尾都没有调用的函数calc()函数,它可以打开电脑的计算器
#include<stdio.h>
#include<string.h>
#include<windows.h>
void calc(){
system("calc");
exit(0);//防止程序崩溃
}
int overflow(char *shellcode)
{
char str[4]="";
strcpy(str,shellcode);
return 0;
}
int main()
{
char shellcode[]="aaaaaaaa\x05\x10\x40\x00";
overflow(shellcode);
//calc();
return 0;
}
•第一步,先测试的填充,
char shellcode[ ]=”aaaaaaaa1234”
char str[4]="";
strcpy(str,shellcode);
同样打开vc的调试,调用完overflow()函数后
第一行为ebp的值为0x61616161,因为执行strcpy()时,shellcode的长度超过了str[]数组的长度,
原来在栈中的ebp被赋值为aaaa,a的asii码为61
ebp下面就是返回地址,已经覆盖为31323334
因为返回地址被覆盖为0x31323334;
在下图可以看到计算机在读取eip的时候是从右往左读取每一个字节里的数据;
F10一直执行下去,可以看到计算机尝试执行34333231处的指令,但此时是无效的指令,导致计算机报错。
想要执行calc()函数,必须先找到该函数的地址
vc++6打开反汇编,直接查看编写的calc()地址,为0x0401005
经过第一步的测试,确定在返回地址之前需要填充8个字节,为什么要填充8个字节呢?
因为局部变量char[ ]数组占4个字节,在局部变量前压入的ebp占4个字节,才到返回地址,因此需要填充8个字节。
读取地址时的顺序是从右往左的,因此把shellcode的地址按字节,反着填进去
char shellc[ ]=“aaaaaaaa\x05\x10\x40\x00”
再调试程序(直接运行也可以),调用完overflow()函数后,计算器就弹出来了
工具:vc++6
原理介绍:
栈溢出,C语言中gets()、strcpy()等函数未进行数据长度的限定,在栈内写入超出长度限制的数据,从而破坏程序运行甚至获得系统控制权的攻击手段。几个常见的寄存器,ebp栈底指针,esp栈顶指针,eip下一条计算机执行的指令,计算机中真正的存储方式如下图:
原理介绍:eip寄存器里存储的是CPU下次要执行的指令的地址。eip在内存中位于ebp后4个字节(如下图,vc的调试)。
一个函数调用结束时,也就是在退栈过程中,返回地址会被传给eip,这一点非常重要。当返回地址被我们溢出的数据覆盖的时候,就可以控制eip,从而获得计算机的控制权,所以我们只需要让覆盖返回地址的数据恰好为shellcode的地址,就可以执行自己的shellcode了。
我提前写好了代码,先看主函数,定义了一个字符串shellcode用来溢出,将它传入overflow()函数,在overflow()函数中
利用strcpy()函数进行溢出,对数据进行填充。还有一个从头到尾都没有调用的函数calc()函数,它可以打开电脑的计算器
#include<stdio.h>
#include<string.h>
#include<windows.h>
void calc(){
system("calc");
exit(0);//防止程序崩溃
}
int overflow(char *shellcode)
{
char str[4]="";
strcpy(str,shellcode);
return 0;
}
int main()
{
char shellcode[]="aaaaaaaa\x05\x10\x40\x00";
overflow(shellcode);
//calc();
return 0;
}
•第一步,先测试的填充,
char shellcode[ ]=”aaaaaaaa1234”
char str[4]="";
strcpy(str,shellcode);
同样打开vc的调试,调用完overflow()函数后
第一行为ebp的值为0x61616161,因为执行strcpy()时,shellcode的长度超过了str[]数组的长度,
原来在栈中的ebp被赋值为aaaa,a的asii码为61
ebp下面就是返回地址,已经覆盖为31323334
因为返回地址被覆盖为0x31323334;
在下图可以看到计算机在读取eip的时候是从右往左读取每一个字节里的数据;
F10一直执行下去,可以看到计算机尝试执行34333231处的指令,但此时是无效的指令,导致计算机报错。
想要执行calc()函数,必须先找到该函数的地址
vc++6打开反汇编,直接查看编写的calc()地址,为0x0401005
经过第一步的测试,确定在返回地址之前需要填充8个字节,为什么要填充8个字节呢?
因为局部变量char[ ]数组占4个字节,在局部变量前压入的ebp占4个字节,才到返回地址,因此需要填充8个字节。
读取地址时的顺序是从右往左的,因此把shellcode的地址按字节,反着填进去
char shellc[ ]=“aaaaaaaa\x05\x10\x40\x00”
再调试程序(直接运行也可以),调用完overflow()函数后,计算器就弹出来了
相关文章推荐
- jboss seam 远程执行漏洞利用步骤
- 利用本地包含漏洞执行任意代码
- 网站安全加固之apache环境S2-057漏洞 利用POC 远程执行命令漏洞复现
- ThinkPHP框架任意代码执行漏洞的利用及其修复方法
- 利用Thinkphp 5缓存漏洞实现前台Getshell
- IE 不能正确处理 MIME 格式邮件附件导致执行攻击者代码漏洞(NIMDA就是利用了此漏洞)
- 【更新WordPress 4.6漏洞利用PoC】PHPMailer曝远程代码执行高危漏洞(CVE-2016-10033)
- Thinkphp框架任意代码执行漏洞利用及修复
- 利用Thinkphp 5缓存漏洞实现前台Getshell
- 利用RunLoop空闲时间执行预缓存任务
- WordPress-Mailpress远程代码执行漏洞——利用
- PHP如何防止黑客利用注入漏洞执行危险的命令
- 利用DNSlog回显Weblogic(CVE-2017-10271) 漏洞执行命令结果
- OrientDB远程代码执行漏洞利用与分析
- Bash Shellshock(Bash远程代码执行)漏洞批量利用脚本
- 利用DNSlog回显Weblogic(CVE-2017-10271) 漏洞执行命令结果
- 视频:不通过漏洞也可利用PDF执行恶意程序
- 利用本地包含漏洞执行任意代码
- 第四章:iOS应用漏洞利用 ——4.11 不安全的数据缓存:keyboard, UI screenshots等等
- 安卓WebView中接口隐患(远程代码执行漏洞)与手机挂马利用