buuctf/每日水题/不一样的flag(详细解释)

2023-11-16

首先查壳

无壳,然后用IDA打开,跳转到main函数

反编译到C

int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{
  _BYTE v3[29]; // [esp+17h] [ebp-35h] BYREF
  int v4; // [esp+34h] [ebp-18h]
  int v5; // [esp+38h] [ebp-14h] BYREF
  int i; // [esp+3Ch] [ebp-10h]
  _BYTE v7[12]; // [esp+40h] [ebp-Ch] BYREF

  __main();
  v3[26] = 0;
  *(_WORD *)&v3[27] = 0;
  v4 = 0;
  strcpy(v3, "*11110100001010000101111#");
  while ( 1 )
  {
    puts("you can choose one action to execute");
    puts("1 up");
    puts("2 down");
    puts("3 left");
    printf("4 right\n:");
    scanf("%d", &v5);
    if ( v5 == 2 )
    {
      ++*(_DWORD *)&v3[25];
    }
    else if ( v5 > 2 )
    {
      if ( v5 == 3 )
      {
        --v4;
      }
      else
      {
        if ( v5 != 4 )
LABEL_13:
          exit(1);
        ++v4;
      }
    }
    else
    {
      if ( v5 != 1 )
        goto LABEL_13;
      --*(_DWORD *)&v3[25];
    }
    for ( i = 0; i <= 1; ++i )
    {
      if ( *(int *)&v3[4 * i + 25] < 0 || *(int *)&v3[4 * i + 25] > 4 )
        exit(1);
    }
    if ( v7[5 * *(_DWORD *)&v3[25] - 41 + v4] == 49 )
      exit(1);
    if ( v7[5 * *(_DWORD *)&v3[25] - 41 + v4] == 35 )
    {
      puts("\nok, the order you enter is the flag!");
      exit(0);
    }
  }
}

 打开程序

叫我们输入数字然后实现操作

首先是定义了 byte类型的数组,然后是int类型(占用四个字节)的v4,v5,i(实际上也可以叫做v6)

 

这里的复制字符串的操作,是将这25个字符(每个字符一个字节)复制到v3的0~24的位置

 

然后下面便是根据我们的输入(V5)来判断

主要是看后面的判断语句

当以int类型强制转化的v3[25]转化的数或者v3[29]大于4或者小于0的时候,程序异常退出

这里为什么是4*i呢?

别忘了,int类型占有四个字节

然后继续看下面,发现49和35的ascii码正好对应1和#,再结合上面那一大堆01字符串和所谓的“up”"down",猜想是一个迷宫。破案了,实际上v3[25]与v3[29]指的就是你所在位置的行和列

以int类型(Dword,也就是双字,四个字节)表示的行的位置占用了v3数组的25~28的位置

至于为什么要减去41呢?

这里要减去的数组是v7,从最上面的定义来看,v7数组的第一个字节地址=v3数组首字节地址+29+4*3=41,当然要根据v3的内容来判断你是否走正确

最后简单画一个图,得出flag

flag{222441144222}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

buuctf/每日水题/不一样的flag(详细解释) 的相关文章

  • 开发支付宝小程序对比开发微信小程序

    接触使用开发支付宝小程序 之前弄微信小程序现在也做一点点支付宝小程序的需求 发现支付宝小程序和微信小程序这两者还有很多东西是共通的 当然也有很多差异 本文旨在在自己接触的过程中进行对比总结 会一直更新比较 1 开发工具 提供功能 开发工具上
  • redis专题-----11-----redis订阅发布以及stream

    参考文章 Redis发布订阅模式 publish subscribe 一 订阅发布 1 概念 1 为了支持消息的多播机制 redis 引入了发布订阅模块 Redis发布 订阅 Pub Sub 是一种通信机制 将数据推到某个信息管道中 其他客
  • 前端不规则气泡图实现方案

    背景介绍 由于项目大屏可视化的需求 需要实现在一个不定长宽的长方形容器中 实现不重叠分布的气泡图 每个气泡代表一类数据的统计值 气泡个数最大值已知 气泡大小与数据值大小正相关 并且气泡图需要有浮动特效 页面尺寸改变时 气泡尺寸需要自适应容器
  • 微信小程序0基础到精通

    写在开头 此篇文章只是简单描述了一下一条学习路线 具体学习资源获取方式请看文末 第一步 想快速入门小程序开发就需要从必备的API和核心开发等基础知识入手 建立整个小程序的知识体系 学习目标 新手入门与项目实战 课程重点 1 小程序核心技术
  • 计算机原理提问,计算机原理的计算机原理人话版

    Windows关机步骤涉及到Windows多个组件和多个过程 简单的说 Windows的关机步骤不是大多数人认为的那么简单 基本的过程是这样的 1 用户发起关机指令以后 发起关机指令的程序会通知Windows子系统CSRSS EXE CSR
  • 提高ChatGPT稳定性:告别GPT网页登录使用PC软件进入GPT

    一 GPT时不时断线 在日常生活中 我们经常需要使用智能语言模型来辅助我们完成各种任务 而ChatGPT作为一款非常优秀的智能语言模型 被广泛应用于各个领域 然而 使用ChatGPT的过程中 我们不可避免地会遇到一个非常让人头疼的问题 Ch

随机推荐

  • javaee之黑马乐优商城4

    商品规格与数据结构 下面来说一下数据库的设计与分析 其实对于spu这张表来说 大体设计还是比较好设计的 看一下下面这张图是一个产品的规格参数 上面主体就是一个规格参数 基本信息又是一个规格参数 这里就是涉及到了一个商品的具体信息 sku就是
  • Android 中的CreatePackageContext()

    Return a new Context object for the given application name This Context is the same as what the named application gets w
  • 分享一个OJ平台——浙江工商大学的OJ平台

    1 引言 最近是有总喜欢讨论算法题 因为他们在准备考研复试 为什么我不准备呢 这是一个悲伤的故事 刚好自己也有面试遇到只能使用C和C 的代码题 他们说这OJ平台相对简单一些 那些刷不来LeetCode可以试试这个 作为入门算法的跳板 体验体
  • Opencv中copyTo()函数的使用方法

    在Mat矩阵类的成员函数中copyTo roi mask 函数是非常有用的一个函数 尤其是后面的mask可以实现蒙版的功能 我们用几个实例来说明它的作用 我们要注意mask的数据类型 必须是CV 8U 且通道数或者是1 或者与roi一致 首
  • CloudCompare 二次开发(14)——高斯滤波

    目录 一 概述 二 代码集成 三 结果展示 一 概述 使用CloudCompare与PCL的混合编程实现点云高斯滤波 高斯滤波的算法原理见 PCL 高斯滤波 二 代码集成 1 mainwindow h文件public中添加 void doA
  • 深入理解HashMap(及hash函数的真正巧妙之处)

    Hashmap是一种非常常用的 应用广泛的数据类型 最近研究到相关的内容 就正好复习一下 网上关于hashmap的文章很多 但到底是自己学习的总结 就发出来跟大家一起分享 一起讨论 1 hashmap的数据结构 要知道hashmap是什么
  • c++重载函数调用运算符

    函数调用运算符 如果类重载了函数调用运算符则我们可以像使用函数一样使用该类的对象 函数调用运算符必须是成员函数 一个类可以定义多个不同版本的调用运算符 struct absint int operator int val return va
  • 路由选路算法

    RIP OSPF Open Shortest Path First 开放最短路径优先 OSPF路由协议 ISIS BGP 参考博客 最佳路由路径选择算法详解
  • Python 中的魔术方法(七)自定义容器行为, __setitem__ 和 __getitem__ 等

    1 协议 Python 中创建自定义序列通常的方式是继承内置的数据类型 使用collections模块中的UserDict UserList等数据 如果要创建完全自定义的序列 需要实现 Python 中自定义容器类型其中一些协议 首先 有用
  • 剑指offer-问题40

    package offer offer interview 40 public class Test40 public static int findNumbersAppearanceOnce int data int result 0 0
  • 6.10 docker (一) 启动

    启动 下面的命令输出一个 Hello World 之后终止容器 root node docker run ubuntu 18 04 bin echo Hello world Hello world 这在本地直接执行 bin echo hel
  • 使用docker搭建speedtest测速服务器

    文章目录 拉取镜像 启动镜像 开放防火墙12345端口 浏览器打开ip 12345测试 其他说明 拉取镜像 sudo docker pull adolfintel speedtest 检查是否拉取成功 sudo docker images
  • 什么是配置文件,以及如何编辑它们?

    我们使用的绝大多数计算机程序 无论是办公套件 网络浏览器 甚至视频游戏 都是通过菜单界面系统配置的 它几乎成了我们使用机器的默认方式 但是有些程序要求你不止是上述方式 你实际上必须编辑一个文本文件 以便让它们按你的意愿运行 这些文本文件 毫
  • 8层灯塔 共765盏灯

    有一个8层灯塔 每层的灯数都是上一层的2倍 共有765盏灯 编程求最上层的灯数 1 include
  • uniapp中使用pinia (针对于uniapp创建vue3项目,uniapp创建vue2项目此方法不可用)

    1安装pinia 如果新建项目 先初始化一下 npm init y npm install pinia save 2 新建pinia store目录 并创建相关文件 名字自己定我的是pinia store 在目录下新建index js和lo
  • 如何在JavaScript中删除字符串的第一个字符

    Let s say you have a string and you want to remove the first character in it 假设您有一个字符串 并且想要删除其中的第一个字符 How can you do so
  • THREE.JS之文本对象

    在很多应用中 不光是有图像图像对象 有时还要给场景添加必要的文字说明等等 比图说游戏中的积分 生命值等等 或者使用文本做装饰等等 在three js中 使用TextGeometry这个类来创建文本 今天要实现的效果如下图 首先创建文件ind
  • Alibaba Nacos 权限认证绕过漏洞

    漏洞位置 http ip port nacos v1 auth users pageNo 1 pageSize 10 风险等级 高危 漏洞危害 可能泄露敏感信息并被攻击者利用造成威胁 攻击者可能直接利用样例的 漏洞进行攻击 核心数据可能被偷
  • nginx报错:open client_body_temp failed [permission denied]

    问题 生产环境发现请求某个接口时报500 本地开发环境没有问题 查看nginx日志 error log 发现open client body temp failed permission denied 报错 原因 发起的POST请求body
  • buuctf/每日水题/不一样的flag(详细解释)

    首先查壳 无壳 然后用IDA打开 跳转到main函数 反编译到C int cdecl noreturn main int argc const char argv const char envp BYTE v3 29 esp 17h ebp