用IDA64打开文件,shift+F12查看字符串
分析关键代码:
脚本如下:
# 将栈上存的数据与它的下标异或
s=[73,111,100,108,62,81,110, 98,40,111,99,121,127,121,46,105,127,100,96,51,119,125,119,101,107,57,123,105,121,61,126,121,76,64,69,67]
flag =''
for i in range(len(s)):
flag += chr(s[i]^i)
print(flag)
#Info:The first four chars are `flag`
不是flag,得到提示:Info:The first four chars are `flag`
继续
查看sub_400E44函数
继续分析
脚本如下:
import base64
lis ="Vm0wd2VHUXhTWGhpUm1SWVYwZDRWVll3Wkc5WFJsbDNXa1pPVlUxV2NIcFhhMk0xVmpKS1NHVkdXbFpOYmtKVVZtcEtTMUl5VGtsaVJtUk9ZV3hhZVZadGVHdFRNVTVYVW01T2FGSnRVbGhhVjNoaFZWWmtWMXBFVWxSTmJFcElWbTAxVDJGV1NuTlhia0pXWWxob1dGUnJXbXRXTVZaeVdrWm9hVlpyV1hwV1IzaGhXVmRHVjFOdVVsWmlhMHBZV1ZSR1lWZEdVbFZTYlhSWFRWWndNRlZ0TVc5VWJGcFZWbXR3VjJKSFVYZFdha1pXWlZaT2NtRkhhRk5pVjJoWVYxZDBhMVV3TlhOalJscFlZbGhTY1ZsclduZGxiR1J5VmxSR1ZXSlZjRWhaTUZKaFZqSktWVkZZYUZkV1JWcFlWV3BHYTFkWFRrZFRiV3hvVFVoQ1dsWXhaRFJpTWtsM1RVaG9hbEpYYUhOVmJUVkRZekZhY1ZKcmRGTk5Wa3A2VjJ0U1ExWlhTbFpqUldoYVRVWndkbFpxUmtwbGJVWklZVVprYUdFeGNHOVhXSEJIWkRGS2RGSnJhR2hTYXpWdlZGVm9RMlJzV25STldHUlZUVlpXTlZadE5VOVdiVXBJVld4c1dtSllUWGhXTUZwell6RmFkRkpzVWxOaVNFSktWa1phVTFFeFduUlRhMlJxVWxad1YxWnRlRXRXTVZaSFVsUnNVVlZVTURrPQ=="
for i in range(10):
lis = base64.b64decode(lis)
print(lis)
解密得到:b'https://bbs.pediy.com/thread-254172.htm'
继续分析
代码如下:
__int64 sub_400D35()
{
__int64 v0; // rdi@1
__int64 result; // rax@9
signed int v2; // [sp+Ch] [bp-24h]@1
signed int i; // [sp+10h] [bp-20h]@1
signed int j; // [sp+14h] [bp-1Ch]@6
__int16 v5; // [sp+24h] [bp-Ch]@4
char v6; // [sp+26h] [bp-Ah]@4
unsigned __int8 v7; // [sp+27h] [bp-9h]@4
__int64 v8; // [sp+28h] [bp-8h]@1
v8 = *MK_FP(__FS__, 40LL);
v0 = 0LL;
v2 = sub_43FD20(0LL) - qword_6CEE38;
for ( i = 0; i <= 1233; ++i )
{
v0 = (unsigned int)v2;
sub_40F790(v2);
sub_40FE60((unsigned int)v2);
sub_40FE60((unsigned int)v2);
v2 = sub_40FE60((unsigned int)v2) ^ 0x98765432;
}
v5 = v2;
v6 = v2 >> 16;
v7 = BYTE3(v2);
if ( ((unsigned __int8)v2 ^ byte_6CC0A0[0]) == 102 && (v7 ^ (unsigned __int8)byte_6CC0A3) == 103 )
{
for ( j = 0; j <= 24; ++j )
{
v0 = (unsigned __int8)(byte_6CC0A0[(signed __int64)j] ^ *((_BYTE *)&v5
+ (signed int)(((((unsigned int)((unsigned __int64)j >> 32) >> 30)
+ (_BYTE)j) & 3)
- ((unsigned int)((unsigned __int64)j >> 32) >> 30))));
sub_410E90(v0);
}
}
result = *MK_FP(__FS__, 40LL) ^ v8;
if ( *MK_FP(__FS__, 40LL) != v8 )
sub_444020(v0);
return result;
}
发现此函数的逻辑就是将byte_6CC0A0
字符串进行异或,还可以发现if语句中,有判断是否等于‘f’和‘g’的条件,根据已有信息猜测这个字符数组就是‘flag’。HIBYTE()
函数的作用是获取高字节也就是数组的最后一位,同时还有BYTE()、BYTE1()、BYTE2()
第一个是获取数组的第一位,第二个就是获取第二位,依次类推。
查看数组byte_6CC0A0数据:
可以看出byte_CC0A3=byte_CC0A0[3]
分析代码:
脚本如下:
key1=[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]
key2='flag'
v2=[]
flag=''
for x in range(4):
v2.append(key1[x] ^ ord(key2[x]))
# print(v2)
for i in range(len(key1)):
print(chr(v2[i%4]^key1[i]),end='')
flag{Act1ve_Defen5e_Test}