当前位置:   article > 正文

Google CTF GATEKEEPER逆向 //使用ltrace跟踪程序_ctf 逆向password error~~ password correct!

ctf 逆向password error~~ password correct!

简介

需要题目和逆向工具的都可以加我qq:3316735898,有什么不懂的也可以来问我

开始

直接运行程序后,它会提醒你输入用户名和密码

在这里插入图片描述

我们随意输入几个字符串

在这里插入图片描述

程序提示用户名输入错误
这里我不打算用常规的方法来逆向这个程序,这题我打算使用ltrace工具来跟踪程序的运行

ltrace

这个工具是用来跟踪进程调用库函数的情况

ltrace ./gatekeeper baimao passwd
  • 1

在这里插入图片描述
出现了一大堆无用的代码,我们需要筛选一下有用的函数

ltrace ./gatekeeper baimao passwd 2>&1 | grep "strcmp"
  • 1

我们通过重定向到标准错误流到标准输出,然后通过grep筛选出strcmp函数
这个函数会将我们输入的值与一个程序里的值做对比,最后输出的是布尔值,如果对比的值一样,则输出0,如果不一样,则输出1

在这里插入图片描述
可以看到,这里一个字符串和我们输入的值做了对比,这应该就是用户名了,我们输入看看

ltrace ./gatekeeper 0n3_W4rM passwd 2>&1 | grep "strcmp"
  • 1

在这里插入图片描述
这里可以看到,我们用户名输入正确后,密码也进行了对比,但是我们输入的密码在这里是倒着的,所有被对比的值也是倒着的,我们从后往前输入就好了

 ./gatekeeper 0n3_W4rM I_g0T_m4d_sk1lLz
  • 1

我们输入正确的账号和密码后就能显示出flag
在这里插入图片描述

CTF{I_g0T_m4d_sk1lLz}
  • 1

查看伪代码

用ghidra打开程序,然后进入main函数
在这里插入图片描述

我们来看看程序的伪代码

在这里插入图片描述
在这里插入图片描述

分析伪代码:

  text_animation(
                "/===========================================================================\\\n|                Gatekeeper - Access your PC from everywhere!                |\n+======= ====================================================================+\n"
                );  //花里胡哨的欢迎图,无用
  if (param_1 == 3) {   //检查我们是否输入了程序需要的两个字符串,还有一个是程序本身,如果没有,则退出,显示提示
    text_animation(" ~> Verifying.");   //输出字符串~> Verifying
    verify_animation(3);  //我跟进进函数看了,只是花里胡哨的加载字符,无用
    iVar1 = strcmp((char *)param_2[1],"0n3_W4rM");  //将我们输入的第二个值,也就是用户名与字符串做对比,如果正确则进入循环
    if (iVar1 == 0) {   
      sVar3 = strlen((char *)param_2[2]);
      local_18 = (char *)malloc(sVar3 + 1);
      strcpy(local_18,(char *)param_2[2]);
      local_10 = 0;
      //对我们输入的用户名进行一大堆移动操作
      while( true ) {   //进入while循环
        sVar3 = strlen(local_18);
        if (sVar3 >> 1 <= local_10) break;
        local_19 = local_18[local_10];
        sVar3 = strlen(local_18);
        local_18[local_10] = local_18[(sVar3 - local_10) + -1];
        sVar3 = strlen(local_18);
        local_18[(sVar3 - local_10) + -1] = local_19;
        local_10 = local_10 + 1;
      }  //又对我们输入的字符做一大堆叠加操作
      verify_animation(3);    //我跟进进函数看了,只是花里胡哨的加载字符,无用
      iVar1 = strcmp(local_18,"zLl1ks_d4m_T0g_I");   //将我们的最后一个值,也就是密码与字符串做对比,正确则进入if循环
      if (iVar1 == 0) {
        text_animation("Correct!\n");   //输出字符Correct!
        text_animation("Welcome back!\n");  //输出字符Welcome back!
        snprintf(local_a8,0x80,"CTF{%s}\n",param_2[2]);    //输出flag,也就是我们输入的密码
        text_animation(local_a8);
      }
      else {    //否则输出密码错误
        text_animation("ACCESS DENIED\n");
        text_animation(" ~> Incorrect password\n");
      }
      uVar2 = 0;
    }
    else {  //否则输出用户名错误
      putchar(10);
      text_animation("ACCESS DENIED\n");
      text_animation(" ~> Incorrect username\n");
      uVar2 = 1;
    }
  }
  else {   //如果我们没有输入值就运行程序,就会提醒你
    puts("[ERROR] Login information missing");
    printf("Usage: %s <username> <password>\n",*param_2);
    uVar2 = 1;
  }
  return uVar2;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

由此可见,flag也是我们输入的密码
这里记录一下使用ltrace跟踪程序来逆向的笔记

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/907363
推荐阅读
相关标签
  

闽ICP备14008679号