首页 > 其他分享 >DASCTF 2023 & 0X401七月暑期挑战赛——— 解析viphouse

DASCTF 2023 & 0X401七月暑期挑战赛——— 解析viphouse

时间:2023-07-30 23:12:32浏览次数:30  
标签:__ puts 0X401 viphouse rbp sh 2023 got login

DASCTF 2023 & 0X401七月暑期挑战赛——— 解析viphouse

保护策略

image-20230730192301956

静态分析

main

  主函数在while循环提供了一个菜单。

void __fastcall __noreturn main(__int64 a1, char **a2, char **a3)
{
  char nptr[10]; // [rsp+Eh] [rbp-12h] BYREF
  unsigned __int64 v4; // [rsp+18h] [rbp-8h]

  v4 = __readfsqword(0x28u);				
  set_randnum();							
  print_string(a1, a2);						
  while ( 1 )
  {
    menu();
    __isoc99_scanf("%9s", nptr);
    switch ( atoi(nptr) )
    {
      case 1:
        if ( login_flag )
        {
          puts("You are already logged in.");
        }
        else
        {
          login();
          if ( login_flag )
            puts("Logged in successfully.");
          else
            puts("Login failed. Please try again.");
        }
        continue;
      case 2:
        if ( !login_flag )
          goto LABEL_16;
        puts("Executing fmt function...");
        break;
      case 3:
        if ( !login_flag )
          goto LABEL_16;
        puts("Executing uaf function...");
        uaf_function();
        break;
      case 4:
        if ( login_flag )
        {
          puts("Executing canary function...");
          canary_function();
        }
        else
        {
LABEL_16:
          puts("Please log in first.");
        }
        break;
      case 5:
        if ( login_flag )
          logout();
        else
          puts("You are not logged in.");
        break;
      default:
        puts("Invalid option. Please try again.");
        break;
    }
  }
}

set_randnum

  这个函数的主要作用是打开生成随机数的文件,并向变量src中读入8字节的随机数。

void set_randnum()
{
  unsigned int v0; // eax
  int fd; // [rsp+Ch] [rbp-4h]

  setbuf(stdin, 0LL);
  setbuf(stdout, 0LL);
  setbuf(stderr, 0LL);
  v0 = time(0LL);
  srand(v0);
  dword_404110 = rand() % 256;
  fd = open("/dev/random", 0);
  if ( fd >= 0 )
  {
    read(fd, src, 8uLL);
    close(fd);
  }
  else
  {
    perror("Failed to open /dev/random");
  }
}

  这个函数打印一些欢迎语。

int sub_401602()
{
  puts("__     _____ ____       _   _  ___  _   _ ____  _____ ");
  puts("\\ \\   / /_ _|  _ \\     | | | |/ _ \\| | | / ___|| ____|");
  puts(" \\ \\ / / | || |_) |____| |_| | | | | | | \\___ \\|  _|  ");
  puts("  \\ V /  | ||  __/_____|  _  | |_| | |_| |___) | |___ ");
  puts("   \\_/  |___|_|        |_| |_|\\___/ \\___/|____/|_____|");
  putchar(10);
  puts("Welcome to vip-house!");
  return puts("HAVE FUN!!!!");
}

  这个函数将程序提供的一些选项打印出来。

int sub_401680()
{
  puts("1. login in");
  puts("2. fmt");
  puts("3. uaf");
  puts("4. canary");
  puts("5. login out");
  return printf("Choose an option: ");
}

login in

  这个函数提供了一个登录功能,允许用户输入用户名和密码,在输入密码的地方存在一个栈溢出,可以溢出0x20字节,登录成功后会设置一个标志位为1,在此重命名为login_flag,如果是以admin登录的,会再设置一个标志位为1,不妨重命名为admin_flag。在进入所有菜单里的函数前会通过login_flag检查登陆状态,未登录状态下必须先登录,不可重复登录,登陆后可使用其他函数。

unsigned __int64 login()
{
  char s[100]; // [rsp+0h] [rbp-2A0h] BYREF
  int v2; // [rsp+64h] [rbp-23Ch] BYREF
  char v3[64]; // [rsp+258h] [rbp-48h] BYREF
  unsigned __int64 v4; // [rsp+298h] [rbp-8h]

  v4 = __readfsqword(0x28u);
  memset(&v2, 0, 0x1F4uLL);
  memset(v3, 0, sizeof(v3));
  memset(s, 0, sizeof(s));
  printf("Please enter your username: ");
  sub_4016EA(s, 99LL);
  printf("Please enter your password: ");
  sub_4016EA(v3, 104LL);
  if ( !strcmp(s, "admin") && !strcmp(v3, "root") )
  {
    puts("Welcome, ADMIN~");
    dword_404118 = 1;
  }
  login_flag = 1;
  return v4 - __readfsqword(0x28u);
}

uaf

  这个函数提供了一个简单的堆块管理程序,仅有addfree功能。add函数申请一个固定大小的堆块,并允许用户向其中写入8字节数据。free只是单纯的释放堆块,没有进行指针置空操作存在uaf

unsigned __int64 sub_401882()
{
  int v1; // [rsp+0h] [rbp-10h] BYREF
  unsigned int v2; // [rsp+4h] [rbp-Ch]
  unsigned __int64 v3; // [rsp+8h] [rbp-8h]

  v3 = __readfsqword(0x28u);
  v2 = 0;
  while ( 1 )
  {
    puts("1. Add Note");
    puts("2. Delete Note");
    puts("3. Exit");
    printf("Choice: ");
    __isoc99_scanf("%d", &v1);
    getchar();
    if ( v1 == 3 )
      break;
    if ( v1 > 3 )
      goto LABEL_10;
    if ( v1 == 1 )
    {
      v2 = add(v2);
    }
    else if ( v1 == 2 )
    {
      v2 = free_0(v2);
    }
    else
    {
LABEL_10:
      puts("Invalid choice.");
    }
  }
  puts("Goodbye!");
  return v3 - __readfsqword(0x28u);
}

canary

  这个函数允许用户输入最多十六字节的数据,并拿它和最开始的随机数进行比较,如果相同则会进入存在格式化字符串漏洞的函数泄露出canary

unsigned __int64 canary_function()
{
  char s[8]; // [rsp+0h] [rbp-30h] BYREF
  char v2[16]; // [rsp+8h] [rbp-28h] BYREF
  int i; // [rsp+18h] [rbp-18h]
  unsigned __int64 v4; // [rsp+28h] [rbp-8h]

  v4 = __readfsqword(0x28u);
  memset(s, 0, sizeof(s));
  memset(v2, 0, sizeof(v2));
  strcpy(s, src);
  puts("Please input the number you guess: ");
  sub_4016EA(v2, 16LL);
  for ( i = 0; i <= 7; ++i )
  {
    if ( v2[i] != s[i] )
    {
      printf("Wrong input: %s\n", v2);
      puts("You can't do anything!");
      return v4 - __readfsqword(0x28u);
    }
  }
  if ( dword_404118 )
  {
    printf("I'll give you a gift!");
    sub_4015A7();
  }
  return v4 - __readfsqword(0x28u);
}

login out

  这个函数进行标志位置0操作,这样就可以再次进入存在栈溢出的login in函数了。

int logout()
{
  login_flag = 0;
  return puts("Logged out successfully.");
}

利用思路

  这道题出得好有水平(应该很费脑子),以至于我看着write up复现都很费劲。

标签:__,puts,0X401,viphouse,rbp,sh,2023,got,login
From: https://www.cnblogs.com/Sta8r9/p/17592300.html

相关文章

  • [UNIQUE VISION Programming Contest 2023 Summer(AtCoder Beginner Contest 312) - A
    UNIQUEVISIONProgrammingContest2023Summer(AtCoderBeginnerContest312)-AtCoderA-Chord(atcoder.jp)#include<bits/stdc++.h>#defineendl'\n'usingnamespacestd;intmain(){vector<string>str{"ACE",&qu......
  • 2023年7月30日 天气:晴
        今天早上起来背了一个小时的英语单词,然后晨跑了三公里,回到家后学习了一个小时的 英语阅读。下午学习编程了一个小时,然后看了一会电视,最后就是写了一个小时的作业,晚上练了一个小时的字,最后看了几章小说。   明天打算看几集电视剧,然后学习一个小时的java,有时间......
  • IJCAI 2023 | 腾讯优图实验室入选论文解读,含小样本学习方法、玻璃物体分割、RSI变化检
    前言 近日,IJCAI2023(InternationalJointConferenceonArtificialIntelligence)国际人工智能联合大会公布了录用结果。本届会议共有4566篇投稿,接收率为15%。作为当前全球最负盛名的AI学术会议之一,IJCAI将于今年8月在澳门举行。本文转载自腾讯优图仅用于学术分享,若侵权请联......
  • 2023.7.30值得推荐的一款服务器空间
    ,已经体验一个月咯,非常不错的免费资源,适合大家去了解了解~!他们家的免费空间,免费服务器,非常稳定,非常靠谱,值得拥有,价格厚道~!免备案服务,域名管理等等服务,应有尽有,2023年你值得了解,他们家的免费云服务器还是独立IP的哦,非常非常好,非常NICE~!官网地址:https://www.sanfengyun.com......
  • NOI 2023 游记
    Day-7坐了10h+高铁后到达成都!Day-6~Day-2赛前集训!还看了两场hdu多校的题,不过贡献几乎为\(0\)。第二场的计算几何题写了一个小时,调了一个小时没过然后下播了。赛后改了一车东西才过。成都的外卖怎么都这么辣!Day-1进校!感觉cdqz的环境和华二昆山的没法比,不过鉴于后者是国......
  • 2023.7.30 周六:内部类
    //outerpublicclassOuter{privateintid;publicvoidout(){System.out.println("外部类方法的调用");}publicclassinner{publicvoidin(){System.out.println("内部类方法的调用");}}}//mainpub......
  • 2023.30 AI生成视频
    AI生成视频是一项复杂的任务,目前主要可以通过以下两类技术实现:1、基于GAN的视频生成GAN(生成对抗网络)可以用于生成静态图片,可以扩展到生成视频。主要思路是训练一个生成器网络,可以输出每一帧图像,然后组合成视频流。这需要大量视频数据进行训练。2、基于自动编码器的视频生成......
  • 2023 年 7 月 23 日机器学习发生了什么:OpenAI 的突破性变化、更好的关注和……
    保留网络:大型语言模型转换器的继承者他们引入了一种非常有前途的注意力变体。基本上,他们:抛弃软最大值让每个令牌只关注一个状态向量,而不是所有以前的令牌在每个头上分别做层规范相对于序列维度呈指数衰减注意力,每个头部具有不同的衰减系数这使他们能够有效地在......
  • 2023/07/30
    今天的练习: 以上是新浪微博中一奇葩贴:“我出生于1988年,直到25岁才遇到4个数字都不相同的年份。”也就是说,直到2013年才达到“4个数字都不相同”的要求。本题请你根据要求,自动填充“我出生于y年,直到x岁才遇到n个数字都不相同的年份”这句话。输入格式:输入在一行中给出出生......
  • 16、博客列表加载效果 - 博客界面改造文章(202307)
    最近闲来无事,就想着把博客界面弄得再有点动画效果,于是就找了延迟函数,把博客的内容列表加载的动画写出来了。      该动画效果还是挺炫的,但是因为刷新页面,下面列表的显示需要拉动到底下才看到,所以这里只能记录一下了。      下面是实现的函数:       ......