前言:学习笔记。(玩了几天。。)
常规:下载 解压 查壳
64位 >>> 64IDAPro打开。
先看字符串,这个没有 main函数。
进去看看函数。
分析:
汇编看>>>连续引用传送 说明 实际上其实就是数组。(v12=v12+v13+v14)
进一步佐证。(v12为基地址。)
C脚本:(最好转为数值而不是直接使用字符。)
异或还原得到v15的值。
先不管,继续往下。
sub_400E44跟进:
敏感点会知道这是base64加密。(可以去查原理。)
把此前得到的base64拿去解密10次(在线工具或者python脚本都可以实现。)
咳,python 不太熟,但是有豆包妈,没事。。。 Y ^ T
这样解码一样可以(10次)。
是个网址。
没什么用,教学网址。
哈哈哈哈。
OK,综上,干扰信息。
回归原程序,慢慢找咯。
跟进看看。
已知:
① v1 ^ byte_6CC0A0[0]) == 'f' && (v4) ^ byte_6CC0A3) == 'g'
异或之后结果为f g 。
② Info:The first four chars are `flag`》》》信息:前四个字符是`flag`(提示。)
③ byte_6CC0A0[j] ^ *((_BYTE *)&v4 + j % 4))
v4不知道。
④ for ( j = 0; j <= 24; ++j )
byte_6CC0A0[j]
byte_6CC0A0其长度眼睛看,应该是3才对,而这24
>>> 说明又是干扰
>>>实际应该是byte_6CC0A0 = byte_6CC0A0 + byte_6CC0A3。
综上整合:
v1 = v4 其字符长度为4。与byte_6CC0A0前4字符异或得到 ‘flag’
而后byte_6CC0A0[i] ^v4[j % 4]
C脚本:
#include <stdio.h>
#include <string.h>int main()
{//char v12[36] = { 0x49,0x6f,0x64,0x6c,0x3e,0x51,0x6e,0x62,0x28,0x6f,0x63,0x79,0x7f,// 0x79,0x2e,0x69,0x7f,0x64,0x60,0x33,0x77,0x7d,0x77,0x65,0x6b,0x39,0x7b,0x69,0x79,0x3d,0x7e,0x79,0x4c,0x40,0x45,0x43};//char v15[36] = {0};//for (int i = 0; i < 36; i++)//{// v15[i] = v12[i] ^ i;// printf("%c", v15[i]);//} unsigned char byte_6CC0A0[] ={64, 53, 32, 86, 93, 24, 34, 69, 23, 47,36, 110, 98, 60, 39, 84, 72, 108, 36, 110,114, 60, 50, 69, 91,0};char flag[25] = "";char v4[] = "flag";for (int j = 0; j < strlen(v4); j++){v4[j] ^= byte_6CC0A0[j];}printf("v4->%s\n",v4);for (int i = 0; i <=24 ; i++){flag[i] = (byte_6CC0A0[i] ^ v4[i % 4]);printf("%c", flag[i]);}return 0;
}
flag{Act1ve_Defen5e_Test}
总结:这题不难,考察点>>> = = 细节、数组的分辨。 提取信息的能力。