稍微……有那么一点离谱
    程序无壳,可以直接放入IDA,通过字符串找到如下函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 __int64 sub_4009C6()
     通过分析,我们可以把函数名修正为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59   v19 = __readfsqword(0x28u);
    有一处9层base64加密的字符串存在
1 2 3 4 5 6 7 8 9 10 11 12 13 .rodata:00000000004A23A8 aVm0wd2vhuxhtwg db 'Vm0wd2VHUXhTWGhpUm1SWVYwZDRWVll3Wkc5WFJsbDNXa1pPVlUxV2NIcFhhMk0xV'
    解码后得到:
“https://bbs.pediy.com/thread-254172.htm ”
 
    看来没有那么简单
1 2 3 4 5 qmemcpy(v12, "Iodl>Qnb(ocy", 12);
    这里还有一个显然特殊的字符串
    v12、v13、v14在内存中是连续的,通过第二和第四行的赋值操作将‘\0’抹去,使得他们连成一整个字符串(但本来是‘\0’的地方现在被填充了,所以字符串增加了两个字节)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 BYTE ke1[14] = "Iodl>Qnb(ocy";
解密之后得到:
Info:The first four chars are `flag`
 
    现在暂时无法理解它的意义,好像什么都没说一样,但实际上是个必要的提示
     自以上分析,sub_4009C6函数似乎已经没有其他信息可以获取了
    这个体量的函数列表显然也不太能够一个个去检查 
    再次从字符串搜索入手:
1 2 3 4 5 6 7 8 9 10 .data:00000000006CC090 off_6CC090      dq offset aVm0wd2vhuxhtwg
     从那个9层base64的字符串向上查找,来到此处,发现在下面还有一个特殊的数组(没做成数组之前很是明显,我将它们打成组了)
     这个函数通过sub_402080,也就是init函数中的函数数组来初始化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 unsigned __int64 sub_400D35()
    第一个for循环对v1变量进行初始化,得到一个定值;
    第二个for循环中将上述的特殊数组做循环一次异或;
    至于sub_410E90、sub_40F790、sub_40FE60函数则由于过于复杂,或许是系统函数,便不做分析,选择性忽视过去
    同时,第二个for循环中的异或数是 v4的某个BYTE位,而v4是一个int类型的4BYTE数据
    那么我们现在需要做的应该是获取这个v4或v1
    在if条件中,我们可以发现:
    v1的第一个BYTE与byte_6CC0A0[0]异或结果位‘f’;
    v4的最后一个BYTE与byte_6CC0A0[3]异或结果位‘g’
    根据:
Info:The first four chars are `flag`
 
   可以猜测v1的四个BYTE与byte_6CC0A0的前四个异或后结果应该分别位‘f’、’l’、‘a’、‘g’
    以此获得v1之后再做第二个for循环运算得到结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 char k[] = { 0x40, 0x35, 0x20, 0x56, 0x5D, 0x18, 0x22, 0x45, 0x17, 0x2F, 0x24,0x6E, 0x62, 0x3C, 0x27, 0x54, 0x48, 0x6C, 0x24, 0x6E, 0x72, 0x3C,0x32, 0x45, 0x5B };
    从此得到flag
    这次我该吸取的教训是:不要因为事情看起来复杂就认为考点不在这里 
插画ID : 90097136