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

 

posted @ 2017-08-06 10:27  S_s_s  阅读(282)  评论(0编辑  收藏  举报