BUUCTF Reverse/[GXYCTF2019]luck_guy

BUUCTF Reverse/[GXYCTF2019]luck_guy

在这里插入图片描述

一个ELF文件,没有加壳,直接拿IDA64位打开

在这里插入图片描述

找到main函数

在这里插入图片描述

跟随跳转

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

直接分析代码

unsigned __int64 get_flag()
{
  unsigned int v0; // eax
  int i; // [rsp+4h] [rbp-3Ch]
  int j; // [rsp+8h] [rbp-38h]
  __int64 s[5]; // [rsp+10h] [rbp-30h] BYREF
  unsigned __int64 v5; // [rsp+38h] [rbp-8h]

  v5 = __readfsqword(0x28u);
  v0 = time(0LL);
  srand(v0);
  for ( i = 0; i <= 4; ++i )
  {
    switch ( rand() % 200 )
    {
      case 1:
        puts("OK, it's flag:");
        memset(s, 0, sizeof(s));
        strcat((char *)s, f1);
        strcat((char *)s, &f2);
        printf("%s", (const char *)s);
        break;
      case 2:
        printf("Solar not like you");
        break;
      case 3:
        printf("Solar want a girlfriend");
        break;
      case 4:
        strcpy((char *)s, "icug`of\x7F");    
        
        strcat(&f2, (const char *)s);
        break;     //一开始case 4是下面这个代码,但是不知道点了哪些函数就变成这样了,不过都差不多,就是转成字符后要倒序一下
      /* case 4:      
        s = 0x7F666F6067756369LL;
        v5 = 0;
        strcat(&f2, (const char *)&s);
        break;*/
      case 5:
        for ( j = 0; j <= 7; ++j )
        {
          if ( j % 2 == 1 )
            *(&f2 + j) -= 2;
          else
            --*(&f2 + j);
        }
        break;
      default:
        puts("emmm,you can't find flag 23333");
        break;
    }
  }
  return __readfsqword(0x28u) ^ v5;
}

flag为f1 + f2,f1已经知道了,下面就是算出f2的值 ,f1 = GXY{do_not_

在这里插入图片描述

根据代码写出脚本,而且这个for循环一共要循环5次,一定有一次是给f2赋值为icug`of\x7F(case 4),有一次一定是case 1,因为要输出flag。那么对f2 做变换的case 5 循环的次数就为1到3次

脚本

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main()
{

   char f1[] = "GXY{do_not_";
   char f2[] =  "icug`of\x7F";
  int i,j,k;
for( i = 1; i <= 3 ; i++)
  {
      for(j = 0 ; j < i ; j++)
        {
            for( k = 0 ; k <= 7; k++)
            {
                if(k % 2 == 1)
                {
                    f2[k] -=2;

                }
                else
                    f2[k]--;
            }
        }
        printf("%s%s\n",f1,f2);
  }

    return 0;

}

运行结果

在这里插入图片描述

把第一个中的GXY换成flag就是最终flag了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ofo300

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值