2014-03-17

这是一个破解题,程序下载03破解 程序是要求输入正确的密码,感觉这种题应该不算太难。直接甩到IDA里面,F5(不要鄙视我老师F5,F5看大概,之后OD看细节),一看不打紧,结果发现流程清清楚楚,顿时喜上眉梢。

int __cdecl wmain()
{
  const char *v1; // [sp-4h] [bp-20Ch]@2
  char v2; // [sp+4h] [bp-204h]@1
  char Dst; // [sp+5h] [bp-203h]@1
  unsigned int v4; // [sp+204h] [bp-4h]@1
  int v5; // [sp+208h] [bp+0h]@1

  v4 = (unsigned int)&v5 ^ __security_cookie;
  printf(&Format);
  v2 = 0;
  memset(&Dst, 0, 0x1FFu);
  scanf(&byte_402108, &v2);
  if ( strcmp(&v2, (const char *)&unk_40210C) )
    v1 = &byte_402130;
  else
    v1 = (const char *)&unk_402114;
  printf(v1);
  return 0;
}

这就是直接将输入字符串对比就行了啊。然后一看40210C的字符窜,傻了眼有个0x1F,这在键盘上是没有对应的啊,肿么输入啊。这个时候我想到了以前一个同学问的同样的在cmd里面输入键盘上没有对应字符的问题。当时隐约记得可以通过管道,但是解这个题的时候没有想到。后来问了下吴哥,他一说重定向我马上就明白了。靠,这都忘了。

我们看到对应的密码是如图:

然后我就老老实实构造了一个二进制文件data,内容如下

1F 65 63 6D 32 30 34 00

cmd执行

软件破解1.exe < data

结果显示密码错误。这里面其实设计到scanf函数的一个特点。我们一般用scanf的时候都是

scanf("%s",a)
scanf("%d",&d)

这种格式,其实scanf还有这种格式scanf(“This is test%s”,a),这个时候我们输入的时候就必须要输入前面的非格式控制字符”This is test”然后才能输入%s对应的字符串,并且a缓冲区只存放%s部分。这个程序里面是将密码与缓冲区一一比较。我们的data中1F作为对应的非控制字符,为了跟密码一样,我们还得输入一个1f,也就是data的内容应该是:

1F 1F 65 63 6D 32 30 34 00

换成这个data,再执行

软件破解1.exe < data

就成功了。



blog comments powered by Disqus