最近看逍遥的《网络渗透攻击与安防修炼》讲到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超长字符串缓冲区溢出原理学习的更多相关文章

  1. windows进程中的内存结构(缓冲溢出原理)

    接触过编程的人都知道,高级语言都能通过变量名来访问内存中的数据.那么这些变量在内存中是如何存放的呢?程序又是如何使用这些变量的呢?下面就会对此进行深入的讨论.下文中的C语言代码如没有特别声明,默认都使 ...

  2. 小白日记17:kali渗透测试之缓冲区溢出实例-windows,POP3,SLmail

    缓冲区溢出实例 缓冲区溢出原理:http://www.cnblogs.com/fanzhidongyzby/archive/2013/08/10/3250405.html 空间存储了用户程序的函数栈帧 ...

  3. kali渗透测试之缓冲区溢出实例-windows,POP3,SLmail

    kali渗透测试之缓冲区溢出实例-windows,POP3,SLmail 相关链接:https://www.bbsmax.com/A/xl569l20Jr/ http://4hou.win/wordp ...

  4. W32Dasm缓冲区溢出分析【转载】

    课程简介 在上次课程中与大家一起学习了编写通用的Shellcode,也提到会用一个实例来展示Shellcode的溢出. 那么本次课程中为大家准备了W32Dasm这款软件,并且是存在漏洞的版本.利用它的 ...

  5. dir cmd、the DIR Command、windows

    原因   :如何在windows下的cmd.exe中只列出文件名? solve : dir \a:-d \b Extend Reading : dir [drive:][path][filename] ...

  6. 小白日记18:kali渗透测试之缓冲区溢出实例(二)--Linux,穿越火线1.9.0

    Linux系统下穿越火线-缓冲区溢出 原理:crossfire 1.9.0 版本接受入站 socket 连接时存在缓冲区溢出漏洞. 工具: 调试工具:edb: ###python在漏洞溢出方面的渗透测 ...

  7. Linux系统缓冲区溢出

    Linux系统下穿越火线-缓冲区溢出 原理:crossfire 1.9.0 版本接受入站 socket 连接时存在缓冲区溢出漏洞. 工具: 调试工具:edb: ###python在漏洞溢出方面的渗透测 ...

  8. Exploit之初识Linux下缓冲区溢出

    本文的目的不是为了介绍如何进行恶意的破坏性活动,而是为了教会你如何去防御此类破坏性活动,以帮助你扩大知识范围,完善自己的技能,如有读者运用本文所学技术从事破坏性活动,本人概不负责. 0×01 前言 1 ...

  9. SEED缓冲区溢出实验笔记

    缓冲区溢出实验(Linux 32位) 参考教程与材料:http://www.cis.syr.edu/~wedu/seed/Labs_12.04/Software/Buffer_Overflow/ (本 ...

随机推荐

  1. Linux 网络编程详解十一

    /** * read_timeout - 读超时检测函数,不含读操作 * @fd:文件描述符 * @wait_seconds:等待超时秒数,如果为0表示不检测超时 * 成功返回0,失败返回-1,超时返 ...

  2. Linux shell运算符

    双引号 --使用双引号可以引用除了字符$,`(单反号),\(反斜杠)外的任意字符或者字符串 --echo "参数的个数是$#" 单引号 --单引号与双引号类似,不同的是shell会 ...

  3. hessian学习

    hessian是一个采用二进制格式传输的服务框架,相对传统soap web service,更轻量,更快速.官网地址:http://hessian.caucho.com/ 目前已经支持N多语言,包括: ...

  4. 前端见微知著JavaScript基础篇:this or that ?

    上节,我们提到了this关键字的问题,并且追加了一句很有意义的话:谁调用我,我指向谁.的确,在javascript中,在默认情况下,this会指向一个已经初始化的window对象.所以你不论有多少全局 ...

  5. 开源磁力搜索爬虫dhtspider原理解析

    开源地址:https://github.com/callmelanmao/dhtspider. 开源的dht爬虫已经有很多了,有php版本的,python版本的和nodejs版本.经过一些测试,发现还 ...

  6. <实训|第十天>从底层解释一下U盘内存为什么变小的原因附数据恢复的基本原理

    [root@localhost~]#序言 我们平时不论是买一个U盘硬盘,或者自己在电脑上创建一个分区,大小总是比我们创建的要小一点,有些人会说,这个正常啊,是因为厂家规定的1M=1000k,真正的是1 ...

  7. 「拉勾网」薪资调查的小爬虫,并将抓取结果保存到excel中

    学习Python也有一段时间了,各种理论知识大体上也算略知一二了,今天就进入实战演练:通过Python来编写一个拉勾网薪资调查的小爬虫. 第一步:分析网站的请求过程 我们在查看拉勾网上的招聘信息的时候 ...

  8. js基础知识温习:构造函数与原型

    构造函数 构造函数主要用于初始化新对象.按照惯例,构造函数名第一个字母都要大写. 构造函数有别于其它函数在于它使用new操作符来调用生成一个实例对象.换句话说,如果一个函数使用new操作符来调用,则将 ...

  9. 自己留存:小经验在asp.net 4.5或者asp.net mvc 5解决A potentially dangerous Request.Form value was detected from the client

    以前的解决办法是 <configuration>    <system.web>        <pages  validateRequest="false&q ...

  10. 使用 Eclipse 调试 Java 程序的技巧

    你应该看过一些如<关于调试的N件事>这类很流行的帖子 .假设我每天花费1小时在调试我的应用程序上的话,那累积起来的话也是很大量的时间.由于这个原因,用这些时间来重视并了解所有使我们调试更方 ...