zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    python 自定义去掉空行
    JavaScript 获取时间函数
    python 自定义ssh
    python 去掉空行
    python roboot解析 output.xml
    语音识别-windows
    python 自定义request模块调试
    python 自定义装饰器
    python 自定义Server酱模块编写
    python 自定义exception模块
  • 原文地址:https://www.cnblogs.com/liuyimin/p/7294035.html
Copyright © 2011-2022 走看看