7.26 二进制练习题

给你个礼物你能收到吗?
打开这个exe文件后,我们看到了它让我们输入礼物提取码,我们先随便输入数据,按回车显示提取码错误还有输错的次数,我们发现这里存在着一个循环。
这里写图片描述
然后我们在IDA里面打开这个文件

int __cdecl main(int argc, const char **argv, const char **envp)
{
  _main();
  present();
  heart();
  system("pause");#当没这个语句或类似语句,你点开生成的.exe文件,运行界面只会闪一下,而有这个语句,就不会了!类似语句还有getchar();在最后加上这种语句,你就可以看到运行结果了!
  return 0;
}

首先我们看到了一个这样的程序,我们先分析这个程序,我们先点开present()这个函数,看到了如下的程序,我们先分析这个程序。

oid __cdecl present()
{
  __int64 v0; // rax
  std::ostream *v1; // rax
  unsigned int x; // [rsp+24h] [rbp-5Ch]
  int xa; // [rsp+24h] [rbp-5Ch]
  int xb; // [rsp+24h] [rbp-5Ch]
  int xc; // [rsp+24h] [rbp-5Ch]
  int xd; // [rsp+24h] [rbp-5Ch]
  int xe; // [rsp+24h] [rbp-5Ch]
  int xf; // [rsp+24h] [rbp-5Ch]
  int n; // [rsp+28h] [rbp-58h]
  int y; // [rsp+2Ch] [rbp-54h]

  std::operator<<<std::char_traits<char>>((std::ostream *)&std::cout, asc_47F000);
  std::operator<<<std::char_traits<char>>((std::ostream *)&std::cout, &byte_47F050);
  x = 0;
  y = 2027091370;
  std::istream::operator>>(&std::cin, &n);#表示输入提取码
  while ( n != y )
  {
    if ( n == 5201314 )
    {
      std::operator<<<std::char_traits<char>>((std::ostream *)&std::cout, &byte_47F068);
      system("pause");
      exit(0);
    }
    if ( !(y % 40) )
      y = 2027091370;
    v0 = std::operator<<<std::char_traits<char>>((std::ostream *)&std::cout, &byte_47F0A0);
    v1 = (std::ostream *)std::ostream::operator<<(v0, x);
    std::operator<<<std::char_traits<char>>(v1, &byte_47F0C3);
    std::istream::operator>>(&std::cin, &n);
    ++x;
    y += 7;
  }
  std::operator<<<std::char_traits<char>>((std::ostream *)&std::cout, &byte_47F0D8);
  for ( xa = 0; xa <= 78; ++xa )
  {
    std::operator<<<std::char_traits<char>>((std::ostream *)&std::cout, "[");
    if ( xa <= 19 )
      Sleep(0xC8u);
while ( n != y )

首先这里与一个while循环,我们得知如果我们输入的提取码n不等于 y = 2027091370,程序就往下执行
{
if ( n == 5201314 )
{
std::operator<<<std::char_traits<char>>((std::ostream *)&std::cout, &byte_47F068);
system("pause");
exit(0);
}

如果我们输入的n=5201314,就会跳出这个程序。
这里写图片描述
“`
这里写图片描述

对这整段代码分析,我们知道这就是上面我们判断的那个循环,当我们输入的提取码错误的时候,它就会说“提取码错误,滚去重输,你已经输入了…次”,所以v0输出的应该是这段文字,这时并没有提取成功,y+=7循环运行后,y值改变,我们继续这个循环,如果if条件成立(即y%40=0),也会输出v0,所以要想提取成功,就要跳出这个循环,令n等于y。
所以我们可以在开始的时候就输入提取码,使其值为2027091370,得到如下
这里写图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42417767/article/details/81232331
今日推荐