BUUCTF-[GXYCTF2019]luck_guy

文章详细描述了如何使用ida64逆向工程工具分析代码,查找关键函数patch_me和get_flag,并揭示了flag的生成过程,涉及字符串操作、内存布局以及条件判断。最终,通过解码逻辑得到了部分flag值。
摘要由CSDN通过智能技术生成

下载文件放入ida64

照常找字符串

 看到可疑的字符串 进去看看

到了主函数来

我们可以开始看看

 int v4; // [rsp+14h] [rbp-Ch]
  unsigned __int64 v5; // [rsp+18h] [rbp-8h]

  v5 = __readfsqword(0x28u);
  welcome(*(_QWORD *)&argc, argv, envp);
  puts("_________________");
  puts("try to patch me and find flag");
  v4 = 0;
  puts("please input a lucky number");
  __isoc99_scanf("%d", &v4);
前面都是人机交互的内容 不是很重要 
这里有一个函数 patch_me() 我们进去看看
  patch_me(v4);
  puts("OK,see you again");
  return 0;

 

int __fastcall patch_me(int a1)
{
  int result; // eax

  if ( a1 % 2 == 1 )  判断是不是整数
    result = puts("just finished");
  else
    result = get_flag();  又是一个重要的函数 我们进去看看

  return result;
}

这题的考点出现了

 我们注意到这个flag的东西 我们进去f1看看

 得到flag的一半

GXY{do_not_

f2呢

没有东西

这个函数很显然是输入数字 如果是1输出什么 是5输出什么

所以我们看到有一个函数是对f2进行处理

这里的s =0x7F666F6067756369LL
但是是小端序
所以我们改

s=[0x69,0x63,0x75,0x67,0x60,0x6f,0x66,0x7f]
然后就是对f2的拼接
对f2的处理
 case 5:
        for ( j = 0; j <= 7; ++j )
        {
          if ( j % 2 == 1 )
            v1 = *(&f2 + j) - 2;   *(&f2 + j)就是对f2的遍历
          else
            v1 = *(&f2 + j) - 1;
          *(&f2 + j) = v1;
        }
        break;

我们可以看看开始编写exp

flag='GXY{do_not_'

s=[0x69,0x63,0x75,0x67,0x60,0x6f,0x66,0x7f]
a=''
for j in range(8):   #循环
    if  j % 2 == 1:
        a=chr(int(s[j])-2)
    else:
        a = chr(int(s[j]) - 1)
    flag+=a
print(flag)
GXY{do_not_hate_me}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值