您的位置:首页 > 其它

GCTF的re50反汇编分析

2015-11-17 11:24 921 查看
/*

*HeiTao_8k

*2015-11-17

*/

这是GCTF的Reverse比赛题目

一、工具

1、查壳Peid

2、吾爱破解版OD和IDA

二、分析过程

1、使用Peid查壳,发现是使用Microsoft Visual C++ 6.0写的,没有加壳。

2、在分析之前我们首先要知道这个小程序需要我干什么?打开re50.exe,是一个控制面板,需要我们输入key,判断是否正确,然后提示判断出来的结果。老规矩输入key:123456,结果什么都没提示就结束了,经过尝试,需要输入纯字母才提示错误信息,那输入key:asdfg。

3、OD和IDA结合分析,IDA载入程序,在函数窗口的函数名称下看到 _main,这就是我们写的主函数入口,点击 _main,得到函数入口点为0x00401000,然后在OD的反汇编窗口—>跟踪表达式(快捷键Ctrl+G),在弹出窗口中输入401000,确定之后跳转到对应的地址,在0x00401000处点击一下,按F4执行到光标处(即0x00401000),F8单步步过分析,图1所示为提示输入和判断字符是否超过20个字符的反汇编代码。





图1
继续一步步调试,图2所示为判断输入的字符,如果有符号和数字,则跳转到失败,结束程序,如果为纯字母的继续执行验证。




图2
图3为对输入的key进行加密




图3
图4为我们输入的key与程序的key验证,如果一一对应,则成功,否则失败。




图4
进过一步步验证,我们终于知道key了,真正的key:gctf{bbabbJbca}
三、算法分析
静态分析先找到一串 Key:

         eax = *”62C5J110119120L”;

先判断了长度是否过长:

         if (ecx <= 0x14) goto loc_401097;

         loc_40107f:

        stack[2048] = “too long”;

        eax = sub_4013c0();

然后检查了一下 gctf{} 这样的基本结构:

        loc_4010cb:

        eax = *(int8_t *)(esp + esi + 0x18);

        if ((eax == 0x7b) || (eax == 0x7d)) goto loc_4010db;

然后把输入的东西加了 0xCF 和上面那串 Key 做对比,其实已经重复检查了:

        if (!COND) {

             do

             {

                    ecx = *(int8
8cf1
_t *)(esp + edx + 0x18);

                   *(int8_t *)(esp + edx + 0x18) = ecx + 0xcf;

                   ecx = ecx + 0xcf | 0xffffffff;

                   edx = edx + 0x1;

                   asm

                   {

                           repne scasb al, byte [es:edi]

                   };

             }

            while (edx < !ecx – 0x1);

}
于是得到了结果:

         flag: gctf{bbabbjbca}

 

下载地址

链接:http://pan.baidu.com/s/1qWtb5Di     密码:ex57

注:更多文章,请关注我的个人网站
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  汇编 逆向 破解 ctf