欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

7.26 二进制练习题

程序员文章站 2024-03-05 14:26:06
...

给你个礼物你能收到吗?
打开这个exe文件后,我们看到了它让我们输入礼物提取码,我们先随便输入数据,按回车显示提取码错误还有输错的次数,我们发现这里存在着一个循环。
7.26 二进制练习题
然后我们在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,就会跳出这个程序。
7.26 二进制练习题
“`
7.26 二进制练习题

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