【Reverse练习】【Reversing.Kr】【2】Easy_KeygenMe

Easy_KeygenMe

0 实验环境

【操作系统】Windows 10
【实验工具】IDA ProOllydbg
【题目来源】http://reversing.kr/challenge.php
【题目要求】找到序列号 5B134977135E7D13 对应的用户名

1 使用程序

运行程序,首先提示输入用户名 “Input Name” ,然后提示输入序列号 “Input Serial” 。
【Reverse练习】【Reversing.Kr】【2】Easy_KeygenMe

2 使用IDA反汇编程序

2.1 读入程序,找到main函数

载入程序之后,可以直接找到 main 函数,代码如下:

int __cdecl main(int argc, const char **argv, const char **envp)
{
  signed int v3; // ebp
  signed int i; // esi
  char v6; // [esp+Ch] [ebp-130h]
  char v7; // [esp+Dh] [ebp-12Fh]
  char v8; // [esp+Eh] [ebp-12Eh]
  char v9; // [esp+10h] [ebp-12Ch]
  char v10; // [esp+11h] [ebp-12Bh]
  __int16 v11; // [esp+71h] [ebp-CBh]
  char v12; // [esp+73h] [ebp-C9h]
  char v13; // [esp+74h] [ebp-C8h]
  char v14; // [esp+75h] [ebp-C7h]
  __int16 v15; // [esp+139h] [ebp-3h]
  char v16; // [esp+13Bh] [ebp-1h]

  v9 = 0;
  v13 = 0;
  memset(&v10, 0, 0x60u);
  v11 = 0;
  v12 = 0;
  memset(&v14, 0, 0xC4u);
  v15 = 0;
  v16 = 0;
  v6 = 16;
  v7 = 32;
  v8 = 48;
  sub_4011B9((int)aInputName);
  scanf(aS, &v9);
  v3 = 0;
  for ( i = 0; v3 < (signed int)strlen(&v9); ++i )
  {
    if ( i >= 3 )
      i = 0;
    sprintf(&v13, aS02x, &v13, *(&v9 + v3++) ^ *(&v6 + i));
  }
  memset(&v9, 0, 0x64u);
  sub_4011B9((int)aInputSerial);
  scanf(aS, &v9);
  if ( !strcmp(&v9, &v13) )
    sub_4011B9((int)aCorrect);
  else
    sub_4011B9((int)aWrong);
  return 0;
}

2.2 查找判断语句

分析程序,最后判断的条件是!strcmp(&v9, &v13)。其中 v9 是输入的序列号, v13 是根据前面用户输入的用户名计算得到的正确序列号。
程序计算序列号的代码段为

  v3 = 0;
  v6 = 16;
  v7 = 32;
  v8 = 48;
  
  for ( i = 0; v3 < (signed int)strlen(&v9); ++i )
  {
    if ( i >= 3 )
      i = 0;
    sprintf(&v13, aS02x, &v13, *(&v9 + v3++) ^ *(&v6 + i));
  }

2.3 分析序列号计算规则

由于, i ∈ {0, 1, 2},
因此,*(&v6 + i) = v6v7v8
因此,*(&v9 + v3++) ^ *(&v6 + i)是将用户名的每个字符和 16 / 32 / 48 ,也即 0x10 / 0x20 / 0x30 做异或运算。
另外,sprintf(&v13, aS02x, &v13, *(&v9 + v3++) ^ *(&v6 + i));的含义是,将字符串 &v13 和计算后的字符*(&v9 + v3++) ^ *(&v6 + i),分别按照%s%02X的格式拼接在一起,并且写入字符串&v13
例如用户名 “123456” ,转换成16进制是 0x 31 32 33 34 35 36,分别和0x 10 20 30 10 20 30做运算,得到序列号211203241506

2.4 求解题目

题中的序列号是5B134977135E7D13,也即0x 5B 13 49 77 13 5E 7D 13,分别和0x 10 20 30 10 20 30 10 20做异或运算,得到用户名为0x 4B 33 79 67 33 6E 6D 33,即 “K3yg3nm3”

新手操作,请大佬们多指教。

【Reverse练习】【Reversing.Kr】【2】Easy_KeygenMe【Reverse练习】【Reversing.Kr】【2】Easy_KeygenMe 0ne_B1t 发布了2 篇原创文章 · 获赞 0 · 访问量 46 私信 关注
上一篇:建立可扩展的silverlight 应用框架 step-6


下一篇:[Fibre Channle 实战之二] FC Target的创建和使用