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/ (本 ...
随机推荐
- git push ERROR: missing Change-Id in commit message footer
今天上传代码时候报告错误:$ git push origin HEAD:refs/for/branch*Counting objects: 7, done.Delta compression usin ...
- 别出心裁的Linux系统调用学习法
别出心裁的Linux系统调用学习法 操作系统与系统调用 操作系统(Operating System,简称OS)是计算机中最重要的系统软件,是这样的一组系统程序的集成:这些系统程序在用户对计算机的使用中 ...
- iOS蓝牙开发(二)蓝牙相关基础知识
原文链接: http://liuyanwei.jumppo.com/2015/07/17/ios-BLE-1.html iOS蓝牙开发(一)蓝牙相关基础知识: 蓝牙常见名称和缩写 MFI ====== ...
- 无法将分支 master 发布到远程 origin,因为远程存储库中已存在具有同一名称的分支
无法将分支 master 发布到远程 origin,因为远程存储库中已存在具有同一名称的分支.发布此分支将导致远程存储库中的分支发生非快进更新. 第一次用oschina的git设置完远程仓库后提交出现 ...
- [BZOJ1579][Usaco2009 Feb]Revamping Trails 道路升级(二维最短路问题)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1579 分析: 设d[i][j]表示从1走到i.改了j条边的最短路径长度 如果设i相连的 ...
- 代码设计工具——PowerDesigner
详情请参考博客: http://www.blogjava.net/wangdetian168/archive/2011/04/07/347847.html
- iOS -- 神战
http://github.ibireme.com/github/list/ios/# https://github.com/Tim9Liu9/TimLiu-iOS http://www.ios122 ...
- 通过Gearman实现MySQL到Redis的数据同步
对于变化频率非常快的数据来说,如果还选择传统的静态缓存方式(Memocached.File System等)展示数据,可能在缓存的存取上会有很大的开销,并不能很好的满足需要,而Redis这样基于内存的 ...
- php 解析json
今天做项目的时候需要用到json数组,解析时遇到了个小小的麻烦,特此将解决办法记下: json数据如下: { "code":200, "message":&qu ...
- python基础-内置函数详解
一.内置函数(python3.x) 内置参数详解官方文档: https://docs.python.org/3/library/functions.html?highlight=built#ascii ...