windows高级调试 第五章 内存破坏之一-栈 实例三:栈溢出 动手实践的过程

         最近一段时间,在工作中一直在进行windows下面的软件调试。使用的调试工具是windbg。但是对这个工具不熟悉,很多命令都不会,只好靠多看书来补充了。看了以前买的一本书《Advanced Windows Debugging》,中文名是《Windows高级调试》。第五章是《内存破坏之一-栈》,其中有一个例子是演示堆栈破坏的,但是作者只是简单说了说步骤,没有把详细的操作命令写出来,我自己实践了一下(嘿嘿,俺还是菜鸟级别的,不实践不行啊),源代码如下:

/*++
Copyright (c) Advanced Windows Debugging (ISBN 0321374460) from Addison-Wesley Professional.  All rights reserved.

    THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
    KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
    PURPOSE.

--*/

#include 
#include 

#define MAX_CONN_LEN    30

VOID HelperFunction(WCHAR* pszConnectionString);

void __cdecl wmain (int argc, WCHAR* args[])
{
    if (argc==2)
    {
        HelperFunction(args[1]);
        wprintf (L"Connection to %s established\n",args[1]);
    }
    else
    {
        wprintf (L"Please specify connection string on the command line\n");
    }
}

VOID HelperFunction(WCHAR* pszConnectionString)
{
    WCHAR pszCopy[MAX_CONN_LEN];

    wcscpy(pszCopy, pszConnectionString);
    //
    // ...
    // Establish connection
    // ...
    //
}

操作步骤如下图所示:


        在调试器windbg下启动程序,启动命令是“windbg 05overrun.exe ThisIsMyVeryExtremelySuperMagnificantConnectionStringForMyDataSource”。启动后,按照书上P145的说法:“我们这一次从HelperFunction函数中的字符串复制函数之前开始分析”,就在HelperFunction函数处设置一个断点。然后开始运行程序。当执行到这个函数的时候,按照书上的说法:“在函数调用指令后面是HelperFunction函数的后继指令。继续执行这些指令直到到达ret指令”。在上图中,用“u”命令查看到了函数的后继指令,然后一步步执行到了ret指令。此时输入“dd esp”指令,可以看到esp中的值就是00630069。和书上的一模一样。

        另外有两点要格外注意:

1.  P134 在构建本章的源代码时,要确保禁用编译器中的缓冲区溢出检查,即将构建窗口中的环境变量BUFFER_OVERFLOW_CHECKS设置为0


2.  P145 执行命令 du ebp-0x3c 时这个0x3c是哪里来的呢?我们在程序中定义字符串的最大长度是30,而且每个字符都是宽字符,占两个字节,所以在函数HelperFunction函数中分配的局部变量的空间大小是60个字节。0x3c正好是十进制的60。

        纸上得来终觉浅,绝知此事要躬行。

你可能感兴趣的:(windbg和gdb调试)