-
-
[原创]看雪CTF2017第十一题简单解析
-
2017-6-22 23:35 3177
-
看雪CTF2017第十一题简单解析
作 者:loudy
使用工具:IDA6.8(反汇编分析) notepad(记录) vc6.0(解码) OD(调试)
步 骤:( 此题多解,原因请看最后)
一、代码自解密
IDA载入看入口点和导入表,没有发现任何有用的东西,考虑该程序已经加密处理。
二、识别真正流程
继续OD动态跟踪,在此处发现DialogBoxParamW,有过MFC编程经验的朋友应该不陌生,说明我们已经找到关键点了(其实不然)。
三、第一个关键算法
实际调试时可以在4016AF处将JE用NOP代替,将401A43处修改为jmp 402303,即可绕过,直接调试主进程。
另外,此题动态内存执行代码较多,建议关键位置下好“硬件执行”断点,便于调试。
考虑对第9、10位的数字进行枚举,动态调试找到待解码和比较的数据,编写代码如下。
#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,导致结尾加上(0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00)解密后的结果“FAB17827375A8685”后依然正确,如下。理论上讲有无数个即“75A29C09E180217C048420956C15DA309FF2B69170(FAB17827375A8685循环)”。
详见附件
[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界