[GXYCTF2019]luck_guy1题解

news2024/12/28 20:29:13

无论风暴把我带到什么样的岸边,我都将以主人的身份上岸。

                                                                                                ——贺拉斯

目录

1.查壳

2.静态分析 

分析信息

 猜测

3.wp


1.查壳

x86-64

拖入64位IDA

2.静态分析 

找到main函数,按下F5反编译

int __cdecl main(int argc, const char **argv, const char **envp)
{
  unsigned int v4; // [rsp+14h] [rbp-Ch]
  unsigned __int64 v5; // [rsp+18h] [rbp-8h]

  v5 = __readfsqword(0x28u);
  welcome(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(v4);
  puts("OK,see you again");
  return 0;
}

我们可以看__isoc99_scanf("%d", &v4);输入一个number之后进入了patch_me(v4);函数,应该重点

关注patch_me(v4);点击这个函数跟进

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

  if ( a1 % 2 == 1 )
    result = puts("just finished");
  else
    result = get_flag();
  return result;
}

just finished应该不是我们希望的结果,说明number应该能整除2

继续跟进get_flag()

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

  v6 = __readfsqword(0x28u);
  v0 = time(0LL);
  srand(v0);
  for ( i = 0; i <= 4; ++i )
  {
    switch ( (unsigned __int64)(unsigned int)(rand() % 200) )
    {
      case 1uLL:
        puts("OK, it's flag:");
        memset(&s, 0, 0x28uLL);
        strcat((char *)&s, f1);
        strcat((char *)&s, &f2);
        printf("%s", &s);
        break;
      case 2uLL:
        printf("Solar not like you");
        break;
      case 3uLL:
        printf("Solar want a girlfriend");
        break;
      case 4uLL:
        s = 9180147350284624745LL;
        v5 = 0;
        strcat(&f2, (const char *)&s);
        break;
      case 5uLL:
        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) ^ v6;
}

rand()函数用来产生随机数,但是,rand()的内部实现是用线性同余法实现的,是伪随机数,由于周期较长,因此在一定范围内可以看成是随机的。

rand()会返回一个范围在0到RAND_MAX(至少是32767)之间的伪随机数(整数)。

rand() % 200,那取模之后就是0到200的随机数

case 1uLL:
        puts("OK, it's flag:");
        memset(&s, 0, 0x28uLL);
        strcat((char *)&s, f1);
        strcat((char *)&s, &f2);
        printf("%s", &s);
        break;

当随机数是1的时候,输出OK, it's flag:

memset(&s, 0, 0x28uLL);

将s进行了赋值

然后字符串后面加上f1,点击跟进f1,得到f1是'GXY{do_not_'

 跟进f2,发现没有值

 不知道f2有点懵,可能是别的地方赋值了

分析信息

点击f2,找到所有的f2

发现case4进行了赋值

case 4uLL:
        s = 9180147350284624745LL;
        v5 = 0;
        strcat(&f2, (const char *)&s);
        break;

给s赋值,将s赋值给f2,f2是9180147350284624745

我们知道进行了5次switch操作,for ( i = 0; i <= 4; ++i )

case 5uLL:
        for ( j = 0; j <= 7; ++j )
        {
          if ( j % 2 == 1 )
            *(&f2 + j) -= 2;
          else
            --*(&f2 + j);
        }

case5也对f2进行了操作

 猜测

说明按照一定顺序执行这几个case,会拼出一个flag

我们猜测这个顺序,case2和case3没有什么实际操作

case4给f2赋值->case5对赋值后的f2操作->case1对于f1和f2进行拼接

那我们按照这个思路编写脚本得出flag

3.wp

flag = 'GXY{do_not_'
f2 = [0x69,0x63,0x75,0x67,0x60,0x6F,0x66,0x7F]
s = ''
for i in range(8):
    if i % 2 == 1:
        s = chr(int(f2[i]) - 2)
    else:
        s = chr(int(f2[i]) - 1)
    flag += s
print(flag)

flag{do_not_hate_me}

其他buuctf逆向题解可以关注我的专栏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/187082.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python Windows Apache部署Django项目运行环境

目录 一、安装Apache服务器 1、在官网http://httpd.apache.org/download.cgi或网上搜索下载zip压缩包 2、Apache相关配置 3、创建Apache服务器 解决报错AH00369: Failed to open the Windows service manager, perhaps you forgot to log in as Adminstrator? 4、启动ap…

【每周Java技术】2023.01.26 周四 到 01.29 周日

文章目录一、01.26 周四 大年初五1.1&#xff09;Python的一道算法题目1.1.1) 题目1.1.2) 解答1.1.3) 知识点一、01.26 周四 大年初五 1.1&#xff09;Python的一道算法题目 1.1.1) 题目 2437. 有效时间的数目 给你一个长度为 5 的字符串 time &#xff0c;表示一个电子时钟…

产线工控设备安全经验分享

工控设备安全现状 工业控制系统是支撑国民经济的重要设施&#xff0c;是工业领域的神经中枢。现在工业控制系统已经广泛应用于电力、通信、化工、交通、航天等工业领域&#xff0c;支撑起国计民生的关键基础设施。 随着传统的工业转型&#xff0c;数字化、网络化和智能化的工…

机器学习算法竞赛实战--3,数据探索

数据挖掘是竞赛的核心模块之一&#xff0c;贯彻竞赛始终也是很多竞赛胜利的关键那么数据探索又是什么呢&#xff1f;可以解决哪些问题&#xff1f;首先应该明确3点&#xff0c;即如何确保自己准备好竞赛使用的算法模型如何为数据集选择最合适的算法如何定义可用于算法模型的特征…

安装DevStack稳定版本zed

STEP1: 创建stack用户(一定要&#xff01;) sudo useradd -s /bin/bash -d /opt/stack -m stack sudo chmod x /opt/stack echo "stack ALL(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack sudo -u stack -i //用stack用户登陆 STEP2: git clone devsta…

SAP中物料价格改变导致的库存价值变动业务分析

基于审计的需求要看看物料在标准成本价格变更前后的库存成本变化情况。找了下资料&#xff0c;需要用到 CKMPCSEARCH这个事务&#xff0c;相当于是一个用于价格修改凭证查询的事务。但试了一下在本公司的系统中并没有从搜索到其菜单位置。 尝试直接输入Tcode后&#xff0c;是可…

CSRF 伪造跨域请求

文章目录一、什么是伪造跨域请求二、攻击方式三、防御措施1、检查Referer字段2、添加校验token一、什么是伪造跨域请求 伪造跨域请求&#xff08;英语&#xff1a;Cross-site request forgery&#xff09;&#xff0c;通常缩写为 CSRF&#xff0c; 是一种挟制用户在当前已登录…

IntelliJ IDEA 2021.2(Community Edition)安装阿里编码规约插件,亲测有效

1.背景阿里巴巴java开发手册不断完善并出了很多版本到目前2023年1月截止&#xff0c;已经出了黄山版&#xff0c;在文章最后有参考资料可根据需要下载&#xff1b;随着企业对项目质量的要求&#xff0c;对开发代码也有了更高的要求和规范&#xff0c;借助阿里巴巴编码规约插件&…

redis geo 没有迁移手工插入数据

1、docker ps |grep redis2、docker exec -it qinghai-sc-xining-redis-single/eadd4cc4eefe bin\sh --进入redis容器[rootlocalhost ~]# [rootlocalhost ~]# [rootlocalhost ~]# [rootlocalhost ~]# docker ps|grep rediseadd4cc4eefe redis "docker-entrypoint.s…"…

python 气体扩散,在 Python中用数值模拟研究气体扩散

在 Python 中&#xff0c;可以使用数值模拟来研究气体扩散。 模拟气体扩散需要解决两个问题&#xff1a;流体动力学方程&#xff08;如 Navier-Stokes 方程&#xff09;和扩散方程。 文章目录Python 代码模拟气体扩散计算并显示气体浓度的均值和标准差研究气体扩展的高级方法Py…

Word控件Spire.Doc 【Table】教程(7): 如何在C#中用表格替换word文档中的文本

Spire.Doc for .NET 是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

【金三银四系列】之Java基础面试(2023版)

Java基础面试题 一: Java基础 1: 简单说说Java中对象如何拷贝? 一、浅拷贝clone&#xff08;&#xff09;如果对象中的所有数据域都是数值或者基本类型&#xff0c;使用clone&#xff08;&#xff09;即可满足需求&#xff0c;如&#xff1a;Person p new Person();Person…

30天自制操作系统(Mac版)读书笔记(day9)

day7和day8都是鼠标和32位的操作&#xff0c;看起来都是理论&#xff0c;先略过。 检测内存块数量 使用中断去检测内存&#xff0c;把这个当成一个函数调用吧。这里面di寄存器给的地址就是结果存在的内存位置。 ComputeMemory:mov ebx, 0mov di, MemChkBuf .loop:mov e…

linux安装vnc服务

1、 如操作系统是最小化安装&#xff0c;那么需要安装GNOME桌面&#xff0c;安装参考&#xff1a;https://blog.csdn.net/carefree2005/article/details/119417234 2、 安装vnc-server yum -y install tigervnc-server3、 复制配置文件模板&#xff0c;将无关的内容清除 cat…

图灵 | 计算机器与智能

【“计算机器与智能”选自《Mind》&#xff0c;no.2236&#xff08;1950.10&#xff09;&#xff0c;P433-460。牛津大学出版社允许重印。刘西瑞、王汉琦 翻译】1. 模仿游戏我建议来考虑这个问题 &#xff1a;“机器能够思维吗&#xff1f;” 这可以从定义 “机 器” 和 “思维…

Docker数据目录迁移

背景在CentOS中安装了Docker&#xff0c;默认Docker Root目录是/var/lib/docker。但是该目录磁盘空间很有限&#xff0c;后期很容易导致系统盘满了&#xff0c;所以考虑迁移到更大磁盘目录下&#xff0c;比如下面的/fsc目录下。解决在Docker官方文档https://docs.docker.com/co…

excel查找定位:INDEX函数——精确制导导弹

一、认识INDEX函数Index函数&#xff1a;在给定的单元格区域中&#xff0c;返回特定行列交叉处单元格的值或引用。函数结构&#xff1a;index&#xff08;单元格区域,行号,列号&#xff09;区域&#xff0c;行号&#xff0c;列号&#xff0c;很像通过坐标瞄准打靶呀。就像下面动…

高阶数据结构之AVL树

文章目录回顾二叉搜索树AVL树在AVL树中插入新节点AVL树中的各种旋转右单旋左单旋左右双旋右左双旋验证是否是AVL树验证是否是二叉搜索树验证是否是平衡树总结AVL树回顾二叉搜索树 二叉搜索树的一些特点回顾&#xff1a; &#xff08;1)每一个节点左树上所有节点的值都是…

vue多实例的骚操作,主要用于解决组件全局弹窗面板的问题。。。

1.问题背景 主要是自己写了一个组件库&#xff0c;其中涉及到弹出面板的组件遇到兼容性问题。 举个例子&#xff0c; 日期选择组件例如 DaterPicker组件 大概的代码如下&#xff08;省略了细节实现&#xff09; <template> <label>日期</label> <input …

一文详解PHP用流方式实现下载文件(附代码示例)

一淘模板给大家带来了关于PHP的相关知识&#xff0c;其中主要介绍了在PHP中怎么使用流方式来实现下载文件的&#xff0c;下面一起来看一下&#xff0c;希望对大家有帮助。 PHP 中使用流方式下载文件 在 PHP 中&#xff0c;可以使用 fopen() 函数打开一个远程文件&#xff0c;并…