姓名:
电话:
QQ:
学历:

经典BUG

发布时间:2010-01-04 18:07   内容发布:武汉科锐软件安全教育机构

以下程序至少有两个经典的bug,请大家注意观察一下。

------------------------------------------

#include    <iostream.h>
#include    <stdlib.h>
#include    <windows.h>

int main(int argc, char* argv[])
{
    char pass[] = "123456"
    char pwd[30] = {0}

    while (1)
    {
        cout << "
请输入密码:"

        cin >> pwd

        if (strcmp(pwd,pass) == 0)
        {
            MessageBox(NULL,"OK","
正确的密码"
,MB_OK)
            break
        }
        else
        {
            MessageBox(NULL,"Error","
错误的密码"
,MB_OK)
        }
    }


    system("pause")

    return 0
}

首先呢,从main函数开始(废话)

int main(int argc, char* argv[])
{
    char pass[] = "123456"
    char pwd[30] = {0}

/*  当程序运行到这里,关键的内存区如下所示:
    0012FF580012FF77属于pwd[30]
    0012FF780012FF7E属于pass[]
0012FF58  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0012FF68  00 00 00 00 00 00 00 00 00 00 00 00 00 00 CC CC  ..............ìì
0012FF78  31 32 33 34 35 36 00 CC C0 FF 12 00 B9 44 40 00  123456.ìà...1D@.

    什么,你说最后两个CC是什么?pwd[30]不是初始化为0了吗?嗯,问的好,有长进!因为我用的是32位的处理器,这个程序也就是在32位机下编译的,所以VC为了高效,采取了4个字节的对齐方式。
*/

    while (1)
    {
        cout << "
请输入密码:"

        cin >> pwd

/*
    
现在提示我们输入密码了,输什么呢?就输入11111111111111111111111111111111111111吧,没错,就是38''''1'''',于是乎,刚才的内存区变成了这个酱紫:
0012FF58  31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31  1111111111111111
0012FF68  31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31  1111111111111111
0012FF78  31 31 31 31 31 31 00 CC C0 FF 12 00 B9 44 40 00  111111.
...@.
*/

        if (strcmp(pwd,pass) == 0)
        {
            MessageBox(NULL,"OK","
正确的密码"
,MB_OK)
            break
        }
        else
        {
            MessageBox(NULL,"Error","
错误的密码"
,MB_OK)
        }

/*
    
当然会提示密码错误,没关系,凭着我们未来系统分析员们坚韧不拔的毅力,我们决定重新输入密码,这次输入什么呢?嘿嘿,直接输入''''111111''''吧,看看什么结果?
*/

    }

    system("pause")

    return 0
}

   大家看到这里对溢出应该有体验了吧?溢出漏洞是可以利用的啊,呵呵。不过大家可能会说,使用这个方法要对系统代码很了解才行啊,要不然怎么利用这个漏洞呢?嗯……不过,对于一流的测试人员在黑盒调试下,利用这个漏洞一定不成问题,在他们的调试软件下,你的软件所用资源的情况是一目了然的,有兴趣的朋友可以研究一下Shellcode。

  还有一个漏洞,今天暂时先不说,下次我再详细演示。
  下次演示所需工具:FPE2000(或其他游戏修改软件)

  拜拜!

 咳咳!现在可以说说第二个BUG了,我们废话少说,直接切入正题。

  由于这个BUG一般都隐藏的较深,所以即使一些经验丰富的软件高手也难免在上面触礁翻船,同志们,要警惕啊!
  
  
这个BUG呢,就是大名鼎鼎如雷灌耳闻之色变的——————内存泄漏~~~!!!

  (众人:这小子又在瞎说,根本没有申请内存,那里来的内存泄漏?骗稿费啊?)

  这个……这个……我们先看看吧,免得大家说我backer不懂装懂危言耸听。上次要大家准备的游戏修改工具(比如FPE2001),大家都有吧?没有的同志赶快抓紧时间下载。

  首先呢,当然是编译我们上次的东西啦,取个名字,就叫 Test.exe 吧。

  运行之,随便输入一个密码: backer987654321,报错了是吗,如图:

  不要关闭错误提示对话框,不过你一定已经关闭了,那就重新输入吧。:)

  现在打开FPE,选择进程 Test.exe,如图:

 

  然后选择编辑选项卡


  
点击寻找,输入''''backer987654321'''',注意啊,一定是单引号。

 

  呵呵,看到输入的''''backer987654321''''了吧?看看下面是什么,^_^

 

  你可以把"123456"设定为其他的密码,然后,再用我的方法试试看。

  前面说了,需要一个有着类似问题的软件让大家体会一下,呵呵,我运气真好,随便找了几个软件,就找到了一个有问题的,大家先去下载,然后边下载边看,一会我们就要用到这个软件,下载地址:http://www.skycn.com/soft/304.html  , 软件名称:#*#*#* V#1*.#7*5,我事先申明一点,拿这个软件来说明问题纯属研究性质,没有其他的目的,请大家对于这个软件的BUG不要外泄,以免对作者带来不必要的损失

  我记得这里好像有个帖子给大家介绍过内存泄漏的问题,但是有些东西忘记讲了,现在我帮作者补充一下。

   内存泄漏应该分为两种情况,首先呢,就是大家熟悉的内存的申请与释放的问题,比如用户new了一块内存空间,那么操作系统就会从该进程的地址空间里划分出 一块内存,给用户使用,而用户应该使用完毕后归还给操作系统,也就是说要delete一把。如果用户丢失了这块内存的指针,那么对不起,我们就可以说这块 内存失控了,因为丢失了那个指针后,用户无法控制那块内存空间,而操作系统也只能在进程关闭的时候才能回收那块内存,所以严格的讲,应该称之内存失控

   还有一种形式的内存泄漏,也就是我们今天看到的,这样的泄漏方式就防不胜防了,主要体现在敏感信息的泄漏,它发生的原因不仅仅是没有释放内存,更多的是没有及时的释放内存或者没有及时抹除敏感信息,所以,这种形式的内存泄漏是个重大隐患,对商业软件来说可能是致命伤,影响程度大大超过了内存失控,称之信息泄漏

  好了,大概也应该把那个软件下载回来了,我们看看吧。

  安装,下一步,下一步,下一步,OK。运行之,点帮助,点注册,呵呵,这个软件注册费挺贵的啊,一个正版的《盟军敢死队 2》也不过60多块而已。

  老办法,随便输个注册码"backer987654321",点注册,提示错误。

 

 

  祭起我们的FPE,和先一样,选进程,内存编辑,查找''''backer987654321'''', 前面找到的几个附近没有正确的SN,一直找到010F9118处:

 

  呵呵,在我的计算机上,SN"W/zha7IC0rZNYd6jc7k=",重新输入试试看,

 

 

  OK!重新打开看看。

 

 

  搞定!最后重申一下,尊重作者劳动,不要散布注册方法

  1:不是非得要用FPE,其他的内存查看工具都可以的,各位仁者见仁,智者见智。

  2:如果觉得不过瘾想再试一次,需要将注册表里的HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\SySN项删除掉,即可打开注册菜单。

  我的手都敲酸了,好累,睡觉觉去。。。bye

Copyright©2007-2015 武汉市科锐软件技术有限公司.
公司地址:武汉市东湖新技术开发区关南园一路当代光谷梦工场5号楼十层
鄂ICP备17007538号-1