RE WP February 05, 2020

jarvisoj-re-wp

Words count 4.1k Reading time 4 mins. Read count 1000000

软件密码破解-1

放到detectit中查看文件的类型,发现是MFC微软的win32编程,建议od动态调试,放到peid中查询,没有加密函数。

放到ida中只能看到有一堆的函数,winmain也没有足够的信息。字符串中也没有找到有关flag的字符。只能转战od动态调试。

在od中右键中文搜索引擎中的智能搜索有意外的发现。

发现了可能有关flag的地方,在这里下一个断点,然后向上寻找线索。

这时候需要运行然后顺着断点的地方向上找到输入的地方,在这里

解读下上面的汇编,输入的地址放入了ebx中,ptr ds:[ebx]可以调用你输入的字符串,然后把ebx赋给eax,重点是60到67的循环,用ptr ds:[ecx+eax]的字符串放到dl中(查看ptr ds:[eax+ecx]的方法是先把鼠标放到你要查的位置上然后右键数据窗口中跟随,选择内存地址便可以再左下角的内存窗口上查看),然后让dl与ptr ds:[eax]的字符串进行异或,eax刚才被ebx赋值了,也就是说ptr ds:[eax]就是你所输入的字符串,它与系统中的某组字符串进行了异或。再往下有几个cmp的比较,是用你输入的经过异或变换的字符串与所显示的字符串进行比较,这些所显示出来的数字因为是小端序排列的所以,要进行变换顺序才能进行正常比较(写脚本的时候注意)。

脚本如下:

flag=''
a=[0x28,0x57,0x64,0x6b,0x93,0x8f,0x65,0x51,0xe3,0x53,0xe4,0x4e,0x1a,0xff]
b=[0x1b,0x1c,0x17,0x46,0xf4,0xfd,0x20,0x30,0xb7,0xc,0x8e,0x7e,0x78,0xde]
for i in range(len(a)):
    flag+=chr(a[i]^b[i])
print(flag)

flag是3Ks-grEaT_j0b!

findkey

这是一个pyc文件是由python语言写成的,直接使用python在线反编译就可以看到源码,由于结构太简单了就不贴了,方法是脚本爆破,直接上脚本就好了:

lookup = [
    196,
    153,
    149,
    206,
    17,
    221,
    10,
    217,
    167,
    18,
    36,
    135,
    103,
    61,
    111,
    31,
    92,
    152,
    21,
    228,
    105,
    191,
    173,
    41,
    2,
    245,
    23,
    144,
    1,
    246,
    89,
    178,
    182,
    119,
    38,
    85,
    48,
    226,
    165,
    241,
    166,
    214,
    71,
    90,
    151,
    3,
    109,
    169,
    150,
    224,
    69,
    156,
    158,
    57,
    181,
    29,
    200,
    37,
    51,
    252,
    227,
    93,
    65,
    82,
    66,
    80,
    170,
    77,
    49,
    177,
    81,
    94,
    202,
    107,
    25,
    73,
    148,
    98,
    129,
    231,
    212,
    14,
    84,
    121,
    174,
    171,
    64,
    180,
    233,
    74,
    140,
    242,
    75,
    104,
    253,
    44,
    39,
    87,
    86,
    27,
    68,
    22,
    55,
    76,
    35,
    248,
    96,
    5,
    56,
    20,
    161,
    213,
    238,
    220,
    72,
    100,
    247,
    8,
    63,
    249,
    145,
    243,
    155,
    222,
    122,
    32,
    43,
    186,
    0,
    102,
    216,
    126,
    15,
    42,
    115,
    138,
    240,
    147,
    229,
    204,
    117,
    223,
    141,
    159,
    131,
    232,
    124,
    254,
    60,
    116,
    46,
    113,
    79,
    16,
    128,
    6,
    251,
    40,
    205,
    137,
    199,
    83,
    54,
    188,
    19,
    184,
    201,
    110,
    255,
    26,
    91,
    211,
    132,
    160,
    168,
    154,
    185,
    183,
    244,
    78,
    33,
    123,
    28,
    59,
    12,
    210,
    218,
    47,
    163,
    215,
    209,
    108,
    235,
    237,
    118,
    101,
    24,
    234,
    106,
    143,
    88,
    9,
    136,
    95,
    30,
    193,
    176,
    225,
    198,
    197,
    194,
    239,
    134,
    162,
    192,
    11,
    70,
    58,
    187,
    50,
    67,
    236,
    230,
    13,
    99,
    190,
    208,
    207,
    7,
    53,
    219,
    203,
    62,
    114,
    127,
    125,
    164,
    179,
    175,
    112,
    172,
    250,
    133,
    130,
    52,
    189,
    97,
    146,
    34,
    157,
    120,
    195,
    45,
    4,
    142,
    139]
pwda = [
    188,
    155,
    11,
    58,
    251,
    208,
    204,
    202,
    150,
    120,
    206,
    237,
    114,
    92,
    126,
    6,
    42]
pwdb = [
    53,
    222,
    230,
    35,
    67,
    248,
    226,
    216,
    17,
    209,
    32,
    2,
    181,
    200,
    171,
    60,
    108]
flag=''
for i in range(0,17):
    for x in range(0,255):
        if (x + pwda[i] & 255) == lookup[i+pwdb[i]]:
            flag+=chr(x)
flag=flag[::-1]
print(flag)
0%