CMD.EXE中dir超长字符串缓冲区溢出原理学习
最近看逍遥的《网络渗透攻击与安防修炼》讲到CMD命令窗口的dir传超长字符串溢出的例子。自己实验了一下,的确会产生程序崩溃,但是具体什么原理没太详细说,这里做一下原理探究,权当学习笔记了。
1. 实验环境 XP SP3
我发现在XP下的cmd.exe有这个漏洞,而在win7下之后的cmd.exe就没有这个漏洞了


我的理解是这个cmd.exe程序本来就是windows的一个80x86的实模式模拟环境,在win下又进行了重写,加固了程序。所以我接下来的实验材料取自XP下的cmd.exe
2. 漏洞定位
我们都知道,不管是ODAY还是利用错误提示挖掘软件漏洞,第一步都要先定位出漏洞的位置,即调用哪个函数出错了,或者对某些非法内存进行读写出错了。只有搞清楚了发生错误的位置,我们才能进一步利用漏洞。好,我们用OD一步步的往下调试。
加载CMD.EXE,按F9继续运行,因为我们知道cmd一定会在某处停下来等待用户交互,然后才执行下一步操作。也就是会停在windows消息函数的那个无限循环的位置。所以我们大胆的按F9。

这个时候程序UI出现了如下的字样:
Microsoft Windows XP [版本 6.1.7601]
(C) 版权所有 1985-2001 Microsoft Corp.
C:\Users\Administrator\Desktop>
即开始进入无限的消息循环,等待用户的进一步输入。这时候我们按下F12暂停程序,并打开函数调用栈 ALT + K。我们通过这种方法来追踪cmd程序会停在什么地方以及都调用了什么函数。

注意到调用堆栈中的这一行。
主线程, 条目 1
地址=0018FDC0
堆栈=4AD0EFEF
函数过程 / 参数=kernel32.ReadConsoleW
调用来自=cmd.4AD0EFE9
结构=0018FDBC
很明显,这是一个win api,用来获取用户的输入参数的。我们顺藤摸瓜,对这个函数下断。重新执行一次。断点后按F8,程序开始等待我们输入,注意:这里开始就是重点了。我们为了能更容易的看出问题。我们输入多一点的字符串 dir \\?\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aaaaaaaaaaaa(输300个左右就可以了),按下回车,程序继续恢复执行。

接下来就是漫长的追踪过程,不断按F8,如果遇到了某个call运行后出错,即跳进了NTDLL的raiseexception领空,按“-”减号退回一条指令,即上一条指令,说明错误在这个call里面,对这个call下断,重新执行一次,F9执行到这里后,F7进入..............
重复这个过程,直到来到关键的代码处:

即执行了一个win api程序竟然也会发生错误,进入了NTDLL的SEH错误处理领空。只是一个简单的wcscpy复制函数怎么会触发错误呢?这种情况按照我之前的经验来说只发生过一次,就是复制导致了栈空间的溢出(不是说缓冲区溢出,是整个栈溢出,就是复制太多太多字符串了,整个栈都被填满了,栈越界了,导致CPU报错)。那这次是不是这个情况呢?我带着这个疑问继续探究。
首先,通过MSDN,我们搜索一下这个wcscpy的函数声明:
wchar_t* wcscpy (wchar_t* destination, const wchar_t* source);
Copy wide stringCopies the C wide string pointed by source into the array pointed by destination, including the terminating null character (and stopping at that point). To avoid overflows, the size of the array pointed by destination shall be long enough to contain the same C wide string as source (including the terminating null character), and should not overlap in memory with source. 这个函数是用来从source指定的位置开始把UNICODE字符串逐个复制到destination。这个UNICODE字符串以0000作为结束。 好,我们再来观察一下寄存器和堆栈中关于source和destinatino的情况。

0x18E6B4是源地址,到数据窗口跟踪一下看看:

没啥,很正常的UNICODE数据。
我们继续查看dest的情况,destination的地址是0x18E8C0。定位到数据区看看。

可以看到,dest的位置落在了我们输入的字符串的范围内(也就是落在了source + sizeof(输入数据)的范围内)。
看到这里,我突然就明白了。因为wcscpy是逐个字符复制的,但是因为我们输入的参数超长了,超过了给source分配的空间,于是输入数据就覆盖了一部分dest的空间,导致dest的起始位置落在了soure的范围内
。这样,就导致每次都source复制一个,就给dest复制一个,两边同步增长,就像两辆速度一样的骑车并行,而直接的后果就是wcscpy一直看不到0000这个结束符,就会一直复制下去。最终的结果就是超过
线程栈的最大空间1M。CPU报错栈溢出。触发SEH。 我们把dest - source - 3 * 2 = 256。也就是说我们填入256个a是正好不触发错误的极限。
dir \\?\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

填入257个及以上a就会发生覆盖。导致错误。

为了验证这个观点,我们可以填入256个a,然后在wcscpy复制函数的api执行处断下:

可以看到,指针正好处在source和dest的边界位置。
如果继续增长参数长度,就会导致wcscpy的无限循环复制,最终导致线程栈的溢出。
至此,cmd的dir溢出原理基本搞清楚了,我自己感觉这只是导致了溢出错误,至于要怎么利用这个漏洞进行shellcode执行,一时还没想到。如果有朋友知道的话,望不吝赐教。我非常希望能有一样喜欢信安的
朋友一起讨论问题。
qq:306211321
CMD.EXE中dir超长字符串缓冲区溢出原理学习的更多相关文章
- windows进程中的内存结构(缓冲溢出原理)
接触过编程的人都知道,高级语言都能通过变量名来访问内存中的数据.那么这些变量在内存中是如何存放的呢?程序又是如何使用这些变量的呢?下面就会对此进行深入的讨论.下文中的C语言代码如没有特别声明,默认都使 ...
- 小白日记17:kali渗透测试之缓冲区溢出实例-windows,POP3,SLmail
缓冲区溢出实例 缓冲区溢出原理:http://www.cnblogs.com/fanzhidongyzby/archive/2013/08/10/3250405.html 空间存储了用户程序的函数栈帧 ...
- kali渗透测试之缓冲区溢出实例-windows,POP3,SLmail
kali渗透测试之缓冲区溢出实例-windows,POP3,SLmail 相关链接:https://www.bbsmax.com/A/xl569l20Jr/ http://4hou.win/wordp ...
- W32Dasm缓冲区溢出分析【转载】
课程简介 在上次课程中与大家一起学习了编写通用的Shellcode,也提到会用一个实例来展示Shellcode的溢出. 那么本次课程中为大家准备了W32Dasm这款软件,并且是存在漏洞的版本.利用它的 ...
- dir cmd、the DIR Command、windows
原因 :如何在windows下的cmd.exe中只列出文件名? solve : dir \a:-d \b Extend Reading : dir [drive:][path][filename] ...
- 小白日记18:kali渗透测试之缓冲区溢出实例(二)--Linux,穿越火线1.9.0
Linux系统下穿越火线-缓冲区溢出 原理:crossfire 1.9.0 版本接受入站 socket 连接时存在缓冲区溢出漏洞. 工具: 调试工具:edb: ###python在漏洞溢出方面的渗透测 ...
- Linux系统缓冲区溢出
Linux系统下穿越火线-缓冲区溢出 原理:crossfire 1.9.0 版本接受入站 socket 连接时存在缓冲区溢出漏洞. 工具: 调试工具:edb: ###python在漏洞溢出方面的渗透测 ...
- Exploit之初识Linux下缓冲区溢出
本文的目的不是为了介绍如何进行恶意的破坏性活动,而是为了教会你如何去防御此类破坏性活动,以帮助你扩大知识范围,完善自己的技能,如有读者运用本文所学技术从事破坏性活动,本人概不负责. 0×01 前言 1 ...
- SEED缓冲区溢出实验笔记
缓冲区溢出实验(Linux 32位) 参考教程与材料:http://www.cis.syr.edu/~wedu/seed/Labs_12.04/Software/Buffer_Overflow/ (本 ...
随机推荐
- 单页面网站关于id冲突的解决办法
最近做了一个单页面的网站,所有的页面加载都是通过局部刷新的方式,并且不用iframe,并且我们引入了动态tab页签: 所有的页签里的内容都只是一个元素,都在同一个html页面上,没有任何iframe分 ...
- VS编译器优化诱发一个的Bug
VS编译器优化诱发一个的Bug Bug的背景 我正在把某个C++下的驱动程序移植到C下,前几天发生了一个比较诡异的问题. 驱动程序有一个bug,但是这个bug只能 Win32 Release 版本下的 ...
- 利用manifest文件对程序目录下的dll进行分类
1 背景 对于大部分的券商和机构投资者,只能通过有交易所交易系统接入资质的券商提供的柜台系统来进行现货交易.相对于期货市场,现货市场的柜台系统千差万别,接入协议有明文字符串.二进制数据和FIX协议等, ...
- php中的循环遍历 foreach list each
foreach语句遍历数组foreach语句用于循环遍历数组,每进行一次循环,当前数组元素的值就会被赋值给变量value(也可以是其它变量),数组指针会逐一的移动. 代码示例: foreach($ar ...
- Android浮动小球与开机自启动
看着手机上的360浮动小球,不评价其具体的功能与实用性,至少在UI设计与交互方面是个不小的创新. 如图片左上角所示,球中还会显示当前手机的运行状况,向下拉动还会有弹射来达到加速.清理等目的. 那好,先 ...
- [BZOJ2438]杀人游戏(缩点+特判)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2438 分析:如果出现了环,那么只要询问环上的一个人,那么环上其他的人的信息也就知道了, ...
- [【codechefCHSEQ22】Chef and Favourite Sequence(并查集)
题目:http://hzwer.com/3419.html 题意:给你一个全是0的数列,有m种操作[Li,Ri],每次操作就将下标处于[Li,Ri]的元素取反.你可以选若干个操作来使这个数列最后变成别 ...
- win10 进入安全模式的方法
[收藏] 楼主 水际天成 只看他 2014-12-19 17:53:26 Windows10出问题了,无法加载了,一直停留在鼠标刚刚出现的那个界面,只能看到计算机屏幕变了颜色,然后就没有任何反映了.想 ...
- 东大OJ-1051-旅行家的预算
1051: 旅行家的预算 时间限制: 1 Sec 内存限制: 128 MB 提交: 27 解决: 7 [提交][状态][讨论版] 题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市( ...
- php 实现接收客户端上传的图片
今天,遇到一个服务端接收客户端上传图片的需求,经过学习.我写了个简单的demo 以备下次学习. 首先服务器接收的发送图片的请求一定要是post请求,而且请求一定要加上 enctype="mu ...