def getTargetStr(enc,st):
t=[0]*0x6c
for i in range(len(enc)):
t[st[i]]=enc[i]
return ''.join(t)
global target
target=getTargetStr(enc, st)
'''
int __cdecl sub_401080(int a1, signed int a2)
{
signed int v2; // esi@1
char *v3; // edi@2
int i; // eax@3
signed int v5; // eax@10
int *v6; // esi@11
char v7; // dl@12
int v9; // [sp+Ch] [bp-200h]@1
char v10; // [sp+10h] [bp-1FCh]@2
v2 = 1;
v9 = -1;
if ( a2 > 1 )
{
v3 = &v10;
do
{
for ( i = *((_DWORD *)v3 - 1); i != -1; i = *(&v9 + i) )
{
if ( *(_BYTE *)(v2 + a1) == *(_BYTE *)(a1 + i + 1) )
break;
}
if ( *(_BYTE *)(v2 + a1) == *(_BYTE *)(a1 + i + 1) )
*(_DWORD *)v3 = i + 1;
else
*(_DWORD *)v3 = -1;
++v2;
v3 += 4;
}
while ( v2 < a2 );
}
v5 = 0;
if ( a2 > 0 )
{
v6 = &v9;
do
{
v7 = *v6 + 25;
++v6;
*(_BYTE *)(v5++ + a1) ^= v7;
}
while ( v5 < a2 );
}
return 0;
}
'''
def encrypt(str_):
v10=[-1]*54
a1=str_.encode('hex')
a2=len(a1)
j=1
k=1
while True:
i = v10[k-1]
while i!=-1:
if a1[j] == a1[i + 1]:
break
i = v10[i]
if a1[j] == a1[i + 1]:
v10[k] = i + 1
else:
v10[k] = -1
j +=1
k += 1
if j >= a2:
break
s=''
for i in range(len(a1)):
s+=chr(ord(a1[i]) ^ (0x19+v10[i]))
return s.encode('hex')
def getOneflag():
oneflag=''
t=target.decode('hex')
for i in range(len(t)):
oneflag+=chr( ord(t[i]) ^ 0x18)
flag=oneflag.decode('hex')
if checkflag(flag):
return flag
else:
print 'error'
return None
flag=getOneflag()
if flag !=None:
j=0
L=[]
for i in range(len(flag)):
L.append([])
for c in string.printable:
f=flag[:i]+c+flag[i+1:]
if encrypt(f)==target:
L[j].append(c)
j+=1
print L
m=1
for ele in L:
m*=len(ele)
print 'total: '+ str(m)