ssd6(系统程序设计) EX1的解析

来源:互联网 发布:淘宝卖高仿违法吗 编辑:程序博客网 时间:2024/05/07 22:28

        表示刚看到这道练习的时候觉得出题人真是太逗了,出道题感觉就像在写小说一样。但是看完题后,感觉完全变了,顿时觉得傻眼了,从这一堆看不懂的数字中怎么才能得到隐藏信息啊?

        没办法,开始百度。所幸网上还是有一些有用的资料的,于是按照提示开始一步一步的实验,最终还真的得到了正确答案!

        其实,这道题是想让我们真正认识到“电脑是根据一条一条的地址来寻找指令并运行”的,是想教会我们如何使用调试工具来分析一段程序。

废话不多说了,进入正题。首先,要解出这道题,必须用到调试工具,一般大家用的都是vc或者vs,这里我用的是VS2013。然后,我们创建一个空的控制台工程,把secret.cpp导入源程序文件夹。根据题目要求,这个程序需要四个输入值,但是看看程序的主函数,我们发现后两个参数在开始是可以忽略的,因为它们的缺省值都为0。所以,接下来我们就先VS的调试设置中设置好两个参数,可以任意设置,这里我用的是1,1。一切都做好后,先调试一下程序,一定要设置好断点(否则调试得不到结果),同时用一个字符指针来指向data数组,watch这个指针得到data数组的前16个字符cccccccccFFrromo”,后面分析有用。

准备工作做好后,开始分析程序。先看主函数,发现要抽取信息,必须调用extract_message1()和extract_message2()。而这两个函数的参数都是start和stride,它们是干嘛的呢?通过分析这两个函数,可以发现,start是抽取信息的第一个字符,而stride则是挑选字符的间隔,那么怎么知道它们的值呢?往前看发现它们的值都由dummy变量决定。而dummy已经被赋值为1,而且纵观整个函数,似乎没有一个地方明显地修改了dummy的值,似乎意味着start就是等于1,stride就是为0。而前面我们已经得到了data数组的前16个字符,对比题目中给出的message是"From:",说明start应该是9,stride应该是3,也就是说dummy的值被修改了。

    那么在哪里可以修改dummy的值呢?在extract_message1()函数被调用前只有process_keys12()函数被调用了,说明就是这个过程dummy的值被修改了。分析这个函数很容易可以知道(int *) (key1 + *key1)就是dummy变量的地址,key2就是dummy的新值。调试过程得到&dummy=0x001cfa24,&key1=0x001cfa00,可以算得key1=(0x001cfa24-0x001cfa00) /4=9。那么怎么算得key2呢?前面已经得到start=9,stride=3,而它们的值分别由dummy的十六进制值的第一个字符和第二个字符组成,由此可以猜测dummy=0x00000309=777,也就是key2=777。将两个参数的值修改后,再次调试发现得到正确的信息

    “From:Friend

      To:You

      Good!Now try choosing keys3,4 to force a call to extract2 and avoid the call to extract1”。

    接下来就该猜测keys3,4了。分析程序发现,要得到第二段信息,也就是要运行extract_message2(),就必须跳过extract_message1(),否则msg1不可能为空。由于计算机运行命令都是按照地址运行的,分析发现,在extract_message1()函数执行前程序会调用process_keys34()函数,那么只能让process_keys34()函数被调用后修改其自身的返回地址,使程序跳过extract_message1()函数。所以((int *)&key3) + *key3就是该函数的返回地址,key4就是该地址的改变值。而函数的返回地址总是比其参数的地址小1,所以计算得到key3=-1。

    那么怎么得到key4的值呢?刚才说了,key4的值就是process_keys34()函数的返回地址的改变值。那么process_keys34()到底返回到了哪呢?观察发现,程序后面还会再调用一次process_keys34()函数,那么该函数的返回地址应该就是第二次调用该函数的返回地址,否则程序将会报错或者跳过extract_message2()函数。所以打开disassambly窗口,找到两个函数的返回地址,分别是0x0026189E和0x00261871,所以key4=0x0026189E-0x00261871=45。

    最后,将这两个参数添加到调试设置中,再次调试,得到最终的信息:

    “From:CTE

      To:You

      Excellent!You got everything!”。

0 0
原创粉丝点击