Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >栈溢出入门系列-临近变量淹没

栈溢出入门系列-临近变量淹没

作者头像
Ms08067安全实验室
发布于 2019-09-24 07:55:34
发布于 2019-09-24 07:55:34
6640
举报

本文作者:rkvir(Ms08067实验室合伙人&二进制小组组长) 人才招募:二进制小组寻找二进制领域志同道合的朋友

一. 实验环境:

操作系统

Windows XP SP3

开发环境

VC++ 6.0

调试器

Ollydbg

二. 实验代码:

#include <stdio.h>#include<string.h> #define PASSWORD "1234567" int verify_password (char *password){int authenticated;char buffer[8];authenticated=strcmp(password,PASSWORD);strcpy(buffer,password);return authenticated;} main(){int valid_flag=0;char password[1024];while(1){printf("please input password: ");scanf("%s",password);valid_flag = verify_password(password);if(valid_flag){printf("incorrect password!\n\n");}else{printf("Congratulation! You have passed the verification!\n");break;}}}

三. 溢出原理

程序未对输入的密码进行长度检测,接收密码的缓冲区只有8,而输入的密码最长可以输入1024。判断密码是否正确的变量authenticated存储在栈中,当输入的密码长度大于8时,输入的字符串将冲破缓冲区,淹没authenticated所处的位置。当密码错误时authenticated的值是1,正确的时候authenticated的值是0.这就意味着我们可以构造一个合适的输入字符串来改变判断结果。

四. 实战调试

我们的重点不是逆向工程,而是漏洞分析,故此不再详诉诸如寻找main函数等逆向知识。

1. 在jmp mai下断点,方便后续反复调试

2. 单步步入main函数分析程序

3. 分析main函数逻辑,可以看出主要问题出在密码比对函数00401005

3.1 输出引导字符串后,要求用户输入密码。

3.2 通过00401005处的函数进行密码比对

3.3 判断比对结果是不是0,如果是0则输出成功字符串,如果是1则输出失败字符串。

4. 单步执行程序,随便输入一个密码,然后单步步入00401005函数,分析这个函数的内容。

4.1 可以看出这个00401005是个跳转,直接单步进入函数真实位置。

4.2 进入到函数内部后可以看到真正的密码是1234567,如果我们是在逆向破解这个程序,那么到了这一步,就已经算是成功了。但是我们的目的是分析漏洞,所以我们现在进一步分析这个函数。

4.2.1 可以看出,在strcmp之后,ebp-4的位置上就有了密码比对的结果

4.2.1.1 strcmp比对密码,将比对结果存入ebp-4的位置上

4.2.1.2 栈中的密码比对结果

4.2.2 如果是正常的程序,这个时候就应该返回了,但是因为是实验代码,所以下面还有一个strcpy的拷贝函数,将输入的密码字符串拷贝入一个长度为8的缓冲区中。

4.2.3 当执行完strcpy的时候我们看一下堆栈区,可以看到字符串缓冲区的位置就在密码字符串比对结果旁边,并且strcpy没有对拷贝入的字符串进行长度判断。因此我们可以判断,我们在构造一个合适的字符串传入的情况下,是可以覆盖密码字符串比对结果的。这也意味着我们可以传入一个合适的字符串来冲破密码验证。

5. 我们重新加载这个程序,并且传入一个特定的字符串“qqqqqqqq”

6. 运行到密码比对函数进行分析

6.1 可以看出strcmp函数没有任何问题的执行成功并且返回了1,代表密码错误。并且把存储在eax中的返回值存储到ebp-4的位置上。

6.1.1 函数执行

6.1.2 返回值存储在eax中

6.1.3 eax中的值mov到了ebp-4的位置上

6.2 下面到了引起溢出错误的strcpy函数,详细分析该函数溢出的过程。

6.2.1首先记录一下strcpy没有执行前堆栈的情况

6.2.2 执行strcpy函数

6.2.3 可以看到,堆栈中原本保存着密码比对结果的位置ebp-4,由于传入字符串超长,已经被覆盖成了0。这样一来,原本比对失败的结果就变成了比对成功。

7. 运行至返回,成功输出密码比对成功的信息

7.1 控制台成功信息

8. 那么是任何长于1234567的字符串都可以成功覆盖比对结果吗,尝试一下,输入9个q,可以看到,对比结果的位置上并没有被覆盖成00,而是71,而只有对比结果等于0才可以成功验证。这说明不是任意长度字符串都可以。

9. 那么有什么结果可以覆盖成整好是0呢,那么答案是长度为8的字符串,长度为8的字符串实际长度为9,因为还有用来标记字符串结束的00,我们就是要使用结尾处的00来覆盖对比结果,使其数值为0。

来源:Ms08067安全实验室

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Ms08067安全实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
检索COM类工厂中CLSID为{00024500-0000-0000-C000-000000000046}的组件时失败
具体解决方法如下: 1:在服务器上安装office的Excel软件; 2:在"开始"->"运行"中输入dcomcnfg.exe启动"组件服务"; 3:依次双击"组件服务"->"计算机"->"我的电脑"->"DCOM配置"; 4:在"DCOM配置"中找到"Microsoft Excel 应用程序",在它上面点击右键,然后点击"属性",弹出"Microsoft Excel 应用程序属性"对话框; 5:点击"标识"标签,选择"下列用户"(用户名和密码写当前管理员的); 6:点击"安全"标签,在"启动和激活权限"上
磊哥
2018/05/08
1.5K0
ASP.NET调用word开发环境下正常,iis下报错
检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005 找了很多,可行的解决办法: http://www.blogchinese.com/user1/53009/archives/2006/excel.shtml 其要点是:   1、运行DCOMCNFG,找到应用程序,设置属性:保持安全性为默认,标识为交互式用户   2、全局的选项卡中的默认配置中的安全性中,访问和启动两种安全性都要添加以下用
用户1075292
2018/01/23
1.2K0
检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005
今天遇到了同样的问题,我们出现的问题是不定时出现日志出现报错信息: Error:检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 8000401a。 StackTrace: 在 EBidding.DocumentGenerator.GD.WordGenerator.Open(String filePath) 位置 D:\alsmill_KM\VSProject\Ebidding_WebService
用户5640963
2019/07/25
6.1K0
【windows2008R2问题2】Windows Server® 2008 Enterprise 组件服务 找不到 ”Microsoft Word 97 - 2003 文档“组件
1:在Windows 2008 R2/Win7/Win2003/WinXp/win2000 os中首先要安装Word。然后在“组件服务”中 依次找到 "组件服务"->"计算机"->"我的电脑"->"DCOM配置"。运行"中输入dcomcnfg.exe启动"组件服务"。
用户5640963
2019/07/25
1.3K0
8000—0004显示设备出现问题_错误0x8007005
问题描述:最近做一个web应用程序需要操作Excel文件,在开发环境下程序测试正常,部署到IIS后程序操作Excel文件,IIS报错,错误出现在创建Excel进程的语句,如下:
全栈程序员站长
2022/09/24
2.8K0
8000—0004显示设备出现问题_错误0x8007005
怎么关闭135 445端口_高危端口关闭方法
1、打开“控制面板”→打开“系统和安全”→打开“系统和安全”→打开“windows防火墙”
全栈程序员站长
2022/11/19
19.4K0
怎么关闭135 445端口_高危端口关闭方法
Office.Core服务器无法使用问题
1).通过webconfig中增加模拟,加入管理员权限, <identity impersonate="true" userName="系统管理员" password="系统管理员密码"/> 2).这样就能够启动Application进程,操作EXCEL了,能够新建EXCEL,导出EXCEL,但是还是不能打开服务器端的EXCEL文件
happlyfox
2018/10/31
9360
EXCEL出错 8000401a
检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 8000401a
全栈程序员站长
2022/09/15
9850
OPC-DA 在 Window7 下配置不得不说的步骤
OPC 经典框架是基于Windows技术,使用COM / DCOM(分布式组件对象模型)在软件之间进行交换数据。OPC 经典框架包含如下协议:
剑指工控
2021/11/09
1.4K0
OPC-DA 在 Window7 下配置不得不说的步骤
IIS发布ASP.NET应用常见错误及解决办法
乐百川
2018/01/09
3.6K0
IIS发布ASP.NET应用常见错误及解决办法
.Net调用Office Com组件的原理及问题:检索com类工厂组件检索 COM 类工厂中 CLSID 为 {XXX} 的组件失败
最近在本地64位win10操作系统+vs2015+office2010(卸载了2016,因为高版本反而不支持),做PPT文档的解析成HTML,在部署到windows server 2012上的时候遇到了不少麻烦,恰好见到两篇文章,得以解决。
csxiaoyao
2019/02/18
5.2K0
Win10 2004不小心禁用所有服务的恢复方法
我们一直在说Win10系统中有一些不常用的服务会影响电脑运行速度,所以对针对性的关闭,但是有些用户操之过急禁用了所有服务,导致系统中的一些程序无法正常运行,那么要如何恢复这些服务呢?下面小编就跟大家分享下Win10 2004不小心禁用所有服务的恢复方法。
菜鸟站长之家
2020/09/12
1K0
Win10 2004不小心禁用所有服务的恢复方法
8000401a错误解决方式(Excel)
前一阵子做开发须要用到Excel和Word编程,本人用的是Vista系统,开发环境是VS2005和Office2007,測试无不论什么问题,但是到部署的时候出现了一些令人非常头痛的问题,老是会出现比如:
全栈程序员站长
2022/09/15
5231
8000401a错误解决方式(Excel)
System.Runtime.InteropServices.COMException (0x8000401A): Retrieving the COM class factory for compo
找到”Microsoft Excel应用程序”或”Microsoft Word应用程序”,
全栈程序员站长
2022/09/16
3680
win10关闭135 139 445端口_windows中如何关闭端口
关闭445端口- 首先进入系统的”注册表编辑器“,步骤是:依次点击”开始“,”运行“,输入regedit进入”注册表编辑器“。
全栈程序员站长
2022/11/03
9K0
Windows上开机自启BAT调用WPS的COM组件失败的解决方法
Java中使用jacob调用WPS的COM组件的时候,手动启动可以,但是开机自启却不行
码客说
2021/11/17
2.6K0
OPC DCOM详细配置方法 - 不关防火墙不换登陆用户
  OPC DCOM的设置是实现跨网络OPC通信的基础,现有的一些OPC DCOM配置教程虽然讲解了如何配置DCOM,但没有讲清楚为什么要这么做,而且各个教程涉及的配置方法也不尽相同。
科控物联
2024/06/27
1.8K0
OPC DCOM详细配置方法 - 不关防火墙不换登陆用户
8000401a 因为配置标识不正确,系统无法开始服务器进程。请检查用户名和密码。「建议收藏」
在使用Microsoft.Office.Interop.Word 转pdf时,出现如下的错误
全栈程序员站长
2022/09/24
2.9K0
如何关闭139端口及445端口等危险端口_windows端口关闭工具
项目进行安全测试时,使用Nmap扫描端口,发现了几个未关的端口,容易受到黑客的攻击和病毒感染,所以需要关掉。
全栈程序员站长
2022/11/02
10.5K0
windows服务器如何设置对指定IP地址进行远程访问?
  因为存在:Windows server 2003、2008、2012及Linux这几种主流服务器。
习惯说一说
2019/06/30
16.6K0
windows服务器如何设置对指定IP地址进行远程访问?
推荐阅读
检索COM类工厂中CLSID为{00024500-0000-0000-C000-000000000046}的组件时失败
1.5K0
ASP.NET调用word开发环境下正常,iis下报错
1.2K0
检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005
6.1K0
【windows2008R2问题2】Windows Server® 2008 Enterprise 组件服务 找不到 ”Microsoft Word 97 - 2003 文档“组件
1.3K0
8000—0004显示设备出现问题_错误0x8007005
2.8K0
怎么关闭135 445端口_高危端口关闭方法
19.4K0
Office.Core服务器无法使用问题
9360
EXCEL出错 8000401a
9850
OPC-DA 在 Window7 下配置不得不说的步骤
1.4K0
IIS发布ASP.NET应用常见错误及解决办法
3.6K0
.Net调用Office Com组件的原理及问题:检索com类工厂组件检索 COM 类工厂中 CLSID 为 {XXX} 的组件失败
5.2K0
Win10 2004不小心禁用所有服务的恢复方法
1K0
8000401a错误解决方式(Excel)
5231
System.Runtime.InteropServices.COMException (0x8000401A): Retrieving the COM class factory for compo
3680
win10关闭135 139 445端口_windows中如何关闭端口
9K0
Windows上开机自启BAT调用WPS的COM组件失败的解决方法
2.6K0
OPC DCOM详细配置方法 - 不关防火墙不换登陆用户
1.8K0
8000401a 因为配置标识不正确,系统无法开始服务器进程。请检查用户名和密码。「建议收藏」
2.9K0
如何关闭139端口及445端口等危险端口_windows端口关闭工具
10.5K0
windows服务器如何设置对指定IP地址进行远程访问?
16.6K0
相关推荐
检索COM类工厂中CLSID为{00024500-0000-0000-C000-000000000046}的组件时失败
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档