首页
社区
课程
招聘
[原创]看雪CTF2017第十一题简单解析
2017-6-22 23:35 3463

[原创]看雪CTF2017第十一题简单解析

loudy 活跃值
10
2017-6-22 23:35
3463

看雪CTF2017第十一题简单解析

    者:loudy

使用工具:IDA6.8(反汇编分析) notepad(记录) vc6.0(解码) OD(调试)

    骤:( 此题多解,原因请看最后)

一、代码自解密

IDA载入看入口点和导入表,没有发现任何有用的东西,考虑该程序已经加密处理。

二、识别真正流程

继续OD动态跟踪,在此处发现DialogBoxParamW,有过MFC编程经验的朋友应该不陌生,说明我们已经找到关键点了(其实不然)。

三、第一个关键算法

实际调试时可以在4016AF处将JENOP代替,将401A43处修改为jmp 402303,即可绕过,直接调试主进程。

另外,此题动态内存执行代码较多,建议关键位置下好“硬件执行”断点,便于调试。

考虑对第910位的数字进行枚举,动态调试找到待解码和比较的数据,编写代码如下。

#include <stdio.h>
 
unsigned m_DE0000[] = { 0x83F08EA7,0x3F0FBA29,0xE747E97C,0x93D03647,0xEC72CD2C,0x93C0BA2E,0x90A578A3,0x2A40BA2F,\
                            0xDB3FF233,0x9031FB09,0xD1477258,0x905E3DAC,0xAB817C35,0x6BD43434,0xC49E84E4,0x83B426AF,\
                            0x51C0BA3A,0x280080B8,0x93BE3FF3,0x8E36BA3B,0xE9C0BA3C,0x93C0BA29,0x93C0B2C5,0x1680CD3F};
 
unsigned m_4340B0[] = { 0x1070EC81,0x55530000,0xBC8B5756,0x00108424,0xBBF63300,0x00000001,0x0725C68B,0x79800000,\
                            0xC8834805,0x07B140F8,0xC68BC82A,0x07E28399,0xF8C1C203,0x38148A03,0xD322FAD2,0x10349488,\
                            0x46000002,0x7C40FE83,0x0002BDCF,0x05BA0000,0xBE000000,0x00000014,0x000008B9,0x8DC03300};
int main()
{
     unsigned xx = 0;
     unsigned yy,zz1,zz2;
     for(xx=0;xx<=0xff;xx++)
     {
         yy = 0x1010101*xx;
         zz1=(m_DE0000[0]+yy)^m_4340B0[0];
         zz2=(m_DE0000[1]+yy)^m_4340B0[1];
         if(zz1 == (zz2-1))
         {
              printf("%02X\n",xx);
              printf("%08X\n",zz1);
         }
     }
     return 0;
}

四、第二个关键算法

还是sub_402300中,刚解码的函数对输入注册码第10位以后的字符串进行处理,处理结果与“!HelloHaniella!”比较,返回值与sub_402240的返回值比较。

五、结论

组合两个关键算法的结果,得到注册码“75A29C09E180217C048420956C15DA309FF2B69170”,输入程序,结果如下。

当然,由于作者没有考虑到结尾的0x00,导致结尾加上(0x000x000x000x000x000x000x000x00)解密后的结果“FAB17827375A8685”后依然正确,如下。理论上讲有无数个即“75A29C09E180217C048420956C15DA309FF2B69170FAB17827375A8685循环)”。


详见附件


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回