IgniteMe
声明
这是道超级简单的题目,就不重复啰嗦了,找到需要加密的关键代码后,直接一步到位。
memset(&v4, 0xCCu, 0xF4u);
if ( strlen(a1) > 4 )
{
j = 4;
for ( i = 0; ; ++i )
{
v2 = strlen(a1);
if ( j >= v2 - 1 )
break;
v11[i] = a1[j++];
}
v11[i] = 0;
v8 = 0;
v6 = 0;
memset(v7, 0, 0x20u);
for ( j = 0; ; ++j )
{
v3 = strlen(v11);
if ( j >= v3 )
break;
if ( v11[j] >= 97 && v11[j] <= 122 )
{
v11[j] -= 32;
v6 = 1;
}
if ( !v6 && v11[j] >= 65 && v11[j] <= 90 )
v11[j] += 32;
v5 = sub_4013C0(v11[j]);
v7[j] = byte_4420B0[j] ^ v5;
v6 = 0;
}
result = strcmp("GONDPHyGjPEKruv{{pj]X@rF", v7) == 0;
}
else
{
result = 0;
}
return result;
}
分析
v11
经过大小写转换 到达v11
v11
再经过sub_4013C0
函数转换到v5
v5
再经过异或byte_4420B0
数组 到v7
v7
和GONDPHyGjPEKruv{{pj]X@rF
比较 是否相同
解释一下上面的一些代码操作,
j=4是因为前面还有四个字符,EIS{
所以数组应该从索引4开始,数组索引0,1, 2,3分别对应EIS{
j >= v2 - 1
是因为 数组最后一个是 }
中间的主要信息才是我们需要加密的flag,所以j的范围变成这样
分析四条反推回去,数组已知
接下来上逆向代码
#include <iostream>
using namespace std;
int main()
{
int a[] = { 0xD,0x13,0x17,0x11,0x2,0x1,0x20,0x1D,0xC,0x2,
0x19,0x2F,0x17,0x2B,0x24,0x1F,0x1E,0x16,0x9,0xF,0x15,0x27,
0x13,0x26,0x0A,0x2F,0x1E,0x1A,0x2D,0x0C,0x22,0x4 };
char b[] = {"GONDPHyGjPEKruv{{pj]X@rF"};
char c[24];
int j;
for (int i = 0; i < 24; i++) {
j = a[i] ^ b[i];
c[i] = (j - 72) ^ 0x55;
if (c[i] >= 65 && c[i] <= 90)
c[i] += 32;
else if(c[i] >= 97 && c[i] <= 122)
c[i] -= 32;
cout << c[i];
}
}
debug
声明
这是一道超级简单的题目,最主要说说我这个脑残历程。。。
如果大家以后dnSpy出现下面这种情况的话,
即没有程序资源管理器,只需要如下操作即可
-
打开视图
-
点击程序资源管理器
然后就出现左边这样的
下面进入正文
这个题的话,直接用来判断输入是否和flag(即b值)相同即可,所以直接一个断点到判断上方,即可查看b值
flag{967DDDFBCD32C1F53527C221D9E40A0B}