reversing.kr easykeygen 之wp
补充:
int(x,[base]): 就是将x(通常是一个字符串)按照base进制转换成整数。 比如: int(‘10’) ##转换成整数10 int('10', 16) ##'10'按16进制转换,将得到整数16 int('ff', 16) ##得到255 int('ff') ## 出错,无法将字符串'ff'按照10进制转换。
对Python编程还是不太熟悉,因此借用了别人的脚本并做了分析
首先主函数代码:
1 int __cdecl main(int argc, const char **argv, const char **envp) 2 { 3 signed int v3; // ebp@1 4 signed int i; // esi@1 5 int result; // eax@6 6 int v6; // [sp+0h] [bp-13Ch]@0 7 int v7; // [sp+0h] [bp-13Ch]@1 8 char v8; // [sp+Ch] [bp-130h]@1 9 char v9; // [sp+Dh] [bp-12Fh]@1 10 char v10; // [sp+Eh] [bp-12Eh]@1 11 char v11; // [sp+10h] [bp-12Ch]@1 12 char v12; // [sp+11h] [bp-12Bh]@1 13 __int16 v13; // [sp+71h] [bp-CBh]@1 14 char v14; // [sp+73h] [bp-C9h]@1 15 char v15; // [sp+74h] [bp-C8h]@1 16 char v16; // [sp+75h] [bp-C7h]@1 17 __int16 v17; // [sp+139h] [bp-3h]@1 18 char v18; // [sp+13Bh] [bp-1h]@1 19 20 v11 = 0; 21 v15 = 0; 22 memset(&v12, 0, 0x60u); 23 v13 = 0; 24 v14 = 0; 25 memset(&v16, 0, 0xC4u); 26 v17 = 0; 27 v18 = 0; 28 v8 = 16; 29 v9 = 32; 30 v10 = 48; 31 sub_4011B9((int)aInputName, v6); 32 scanf(aS, &v11); 33 v3 = 0; 34 for ( i = 0; v3 < (signed int)strlen(&v11); ++i ) 35 { 36 if ( i >= 3 ) 37 i = 0; 38 sprintf(&v15, aS02x, &v15, *(&v11 + v3++) ^ *(&v8 + i)); 39 } 40 memset(&v11, 0, 100u); 41 sub_4011B9((int)aInputSerial, v7); 42 scanf(aS, &v11); 43 if ( !strcmp(&v11, &v15) ) 44 { 45 sub_4011B9((int)aCorrect, *(int *)&v8); 46 result = 0; 47 } 48 else 49 { 50 sub_4011B9((int)aWrong, *(int *)&v8); 51 result = 0; 52 } 53 return result; 54 }
题目中给了要求:
具体分析都写在了py脚本里了:
1 #!/usr/bin/env python 2 import string 3 encode = [16,32,48] 4 I =0 5 dic =string.digits+string.letters+string.punctuation #数字字母标点,设置提取密码字典 6 Ser = '' 7 Sercmp ='5B,13,49,77,13,5E,7D,13' 8 Sercmp = Sercmp.split(',') 9 10 for S in Sercmp: 11 for d in dic: 12 if encode[I%3]^ord(d) == int(S,16): #I%3>if(i>=3) encode[I%3]>v8+i 13 # if ( !strcmp(&v11, &v15) ) v11前v15S 14 # { 15 # sub_4011B9((int)aCorrect, *(int *)&v8); 16 # result = 0; 17 # } 18 print S 19 Ser+=d 20 I+=1 21 break 22 print Ser #Ser是密码 23 24 raw_input()
得到结果:
要学会自己用python写脚本。。。可就是迈不出第一步。
附:又找到一篇wp,可能这个看这更明白些:
name以3个字节为一组,每组分别与16,32,48异或并转换为16进制数,最后与serial对比,脚本如下 serial = '5B134977135E7D13' name = '' for i in xrange(0, len(serial), 2): name += chr(int(serial[i:i+2], 16) ^ (16 * (i / 2 % 3 + 1))) print name