bugku-逆向-4、游戏过关(4种简单的方法介绍)

2023-10-27

题目是个consoleapplication4.exe,运行一下:
在这里插入图片描述
是一个游戏:
n是灯的序列号,m是灯的状态
如果m (n) = 1,它是开着的,如果不是,它是关着的
起初所有的灯都关着
现在你可以输入n来改变它的状态
但是你要注意一件事,如果你改变N灯的状态,(N-1)th和(N+1)th的状态也会改变
当所有的灯都亮着的时候,flag就会出现
现在,输入n。
就是输入一个1到8之间的数,例如1:就会改变周围的三个数的状态,使8、1、2三个数变亮,再输入一个2:也会改变2周围三个数的状态,使1、2熄灭,3亮起。无限次输入后,最后8个数都亮起的时候就会输出flag。

方法一,直接玩!

玩了好一会儿,发现把1到8之间的数字都输一遍就能通过这个游戏,出现flag:
在这里插入图片描述
但逆向总不能每次都自己试出来吧。下面开始逆向的分析:

方法二:自己计算flag

用IDA打开exe之前要先查壳,这个exe是没有加壳的,用IDA打开静态分析,通过之前运行exe文件出现的字符串定位到关键函数的位置,按F5:这个exe可以反编译,那我们就直接看到类似源代码的代码:
在这里插入图片描述
关键函数的主要逻辑就是上面说的游戏规则的实现。
再看一下输出flag的函数:就是将两个已经初始化的数组求与之后,再按位和0x13求与之后,转化成字符串输出即可:
在这里插入图片描述
所以我们在这就可以直接自己把两个数组拿出来,然后自己算一遍得到flag。
源代码:

# py -3
# coding:utf-8

array1 = [18,64,98,5,2,4,6,3,6,48,49,65,32,12,48,65,31,78,62,32,49,32,1,57,96,3,21,9,4,62,3,5,4,1,2,3,44,65,78,32,16,97,54,16,44,52,32,64,89,45,32,65,15,34,18,16,0]
array2 = [123,32,18,98,119,108,65,41,124,80,125,38,124,111,74,49,83,108,94,108,84,6,96,83,44,121,104,110,32,95,117,101,99,123,127,119,96,48,107,71,92,29,81,107,90,85,64,12,43,76,86,13,114,1,117,126,0]

flag = ''
for i in range(len(array1)):
    flag+= chr(array1[i] ^ array2[i] ^ 0x13 )
print (flag)

在这里插入图片描述
得到flag为:zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t}

方法三:修改源代码

用OD打开,查找字符串“done!!! the flag is”找到输出flag的关键位置:
在这里插入图片描述
网上找几行找到这个输出flag的函数的入口位置:
在这里插入图片描述
发现它是跳转来自 01077AB4。所以我们再往上转到 01077AB4:
在这里插入图片描述

0107E940=ConsoleA.0107E940 本地调用来自 0107F66C

0107E940=ConsoleA.0107E940 表明了它指向了输出flag的函数;本地调用来自 0107F66C说明它是由0107F66C调用的,所以我们再往回转到 0107F66C:
在这里插入图片描述
我们到了这,发现上面由8个JNZ,这不就是源代码中的8个判断吗?
在这里插入图片描述
一旦只要由一个判断不满足,程序就跳转到输出flag的函数的下一条去了,这样就不会输出flag而重新开始循环要求你输出n了:
在这里插入图片描述
所以我们要修改源代码使得程序不管怎样都会进入输出flag的函数,这样我们只要运行程序就能得到flag了。将原来的“jmp 0107F4FB”(跳转到循环重新开始的位置)改为jmp 01077AB4(跳转到输出flag函数的位置),这样只要我们输入1~8直接的数,程序最终都是跳转到0107F4FB(flag函数的入口地址):
在这里插入图片描述
保存到可执行文件,运行:
在这里插入图片描述
同样也得到flag。这样一想其实我们也可以修改其他地方的call和JMP,让程序跳转到输出flag的函数也行,前提是不影响程序的正常运行,至少在输出flag之前要正常运行,可以修改的地方很多,就不一一演示了。

方法四:直接用OD边调试边运行

主要思想是修改8次JNZ判断的值:开始程序每次判断出我们的1~8数字有没亮起的就跳转的循环重新开始的位置,所以我们每次在程序要跳转的时候通过修改ZF的值,让程序不跳转。先在8次JZN的位置设上断点:
在这里插入图片描述
开始运行后程序会先停在让我们输入数字的位置,输入数字“1”后程序会自动停在第一个JNZ断点上:
在这里插入图片描述
因为我们输入的数字是1,点亮了8、1、2三个数字,所以程序在第8、第1、第2个JNZ处已经符合要求不会调转了,我们只需要修改第3~7个JNZ跳转处的值,接着我们按F7向下单步运行,我们也可以清楚的看到寄存器中的每个值的变化:下面是单步运行到第2个JNZ的位置上,我们可以看到第二次的ZF已经为1,JNZ不会跳转,所以我们也不用修改了:

在这里插入图片描述
继续单步运行到第三个JNZ处,可以看到ZF为0,程序原本是要跳转到重新开始循环的位置的:
在这里插入图片描述
我们把ZF标志位改为1,让程序继续向下单步运行:
在这里插入图片描述
如法炮制:我们将第4~7个JNZ处的ZF标志为也改为1:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
到这所有需要修改的值都已经改好了,点一下OD的开始运行,只要你没有在后面的程序设断点程序就会直接运行处flag了。接下来的只是一些继续的分析和佐证我们上面的步骤正确性的单步调试。下面继续单步运行,到下面第8个JNZ,前面已经说了ZF标志位已经为1了,这里果然已经为1证明我们之前的分析是正确的:
在这里插入图片描述
让程序逐行运行,最终到达跳转到输出flag的那个函数的那条指令处:
在这里插入图片描述
再运行就可以进入输出flag函数了,这里我们为了看的更清楚,继续单步进入flag函数:
在这里插入图片描述
我们就成功的进入了输出flag的函数,看到了之前通过定位字符串找到的位置。再继续单步运行,我们可以对这个函数理解的更清楚:我们可以看到数组是如何生成的,在数据窗口中的位置、值的变化:
在这里插入图片描述
后续的就是两个数组求与,再按位和0x13求与了,你在数据窗口中可以清楚的看到每一位的变化,这里就不截图了。
上面也说了,其实你只要修改完需要修改的JNZ的值,之后点开始运行就好了,这里放出运行结果的截图:
在这里插入图片描述
flag为:zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t}
这种方法和上一种OD修改源代码的区别就是:这种是通过修改ZF标志位来控制跳转,使程序进入输出flag的函数,严格来说是修改标志位,并没有修改源代码;而上一种方法是通过修改跳转的源代码,让程序进入输出flag的函数。

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

bugku-逆向-4、游戏过关(4种简单的方法介绍) 的相关文章

  • 11、MyBatis的逆向工程

    文章目录 11 MyBatis的逆向工程11 1 创建逆向工程的步骤1 添加依赖和插件2 创建mybatis config xml的核心配置文件3 创建逆向工程的配置文件4 执行MBG插件的generate目标5 效果6 窜库问题 11 2
  • Mybatis 逆向工程

    Mybatis 逆向工程 Maven项目generatorConfig xmlpom xml Maven项目 项目结构 xff1a generatorConfig xml span class token prolog lt xml ver
  • 华为OD机试 - 最大平分数组( Python)

    题目描述 给定一个数组nums 可以将元素分为若干个组 使得每组和相等 求出满足条件的所有分组中 最大的平分组个数 输入描述 第一行输入 m 接着输入m个数 表示此数组 数据范围 1 lt M lt 50 1 lt nums i lt 50
  • Bugku:Simple_SSTI_1

    很简单的模板注入 直接F12查看提示 flag在secret key下 bugku才是对萌新最友好的平台
  • bugku-逆向-4、游戏过关(4种简单的方法介绍)

    文章标题 方法一 直接玩 方法二 自己计算flag 方法三 修改源代码 方法四 直接用OD边调试边运行 题目是个consoleapplication4 exe 运行一下 是一个游戏 n是灯的序列号 m是灯的状态 如果m n 1 它是开着的
  • 电子科技大学软件工程期末复习笔记(八):软件维护

    目录 前言 重点一览 软件维护的定义 四种类型的维护 软件维护的必要性 软件维护的成本 软件维护的困难性 可维护性的定义 决定软件可维护性的因素 软件维护的过程模型 维护费用估算 软件再工程 软件逆向工程 本章小结 前言 本复习笔记基于王玉
  • Bugku:社工-进阶收集

    Bugku过年上了几道新的社工题 有空了来试着写看看 先打开附件可以发现存在一张空间截图 盲猜应该是西安的 烂怂 大雁塔吧 从评论中主角和朋友的对话 我们大概可以获得以下信息 主角家距离大雁塔一共有七站地铁 其中要进行中转 同时作者是从始发
  • 【python爬虫】js逆向分析及AES解密

    一 原理简述 1 首先查看需要获取的数据即热门评论是否在源代码中 如果在源代码中就可以直接xpath等方式进行抓取 2 但是发现在网页和框架源代码里面都无法搜到评论内容 此时 使用网络抓包工具即 查看network中的XHD 在js代码中
  • 七种寻址方式

    文章目录 1 立即寻址方式 2 直接寻址方式 3 寄存器寻址方式 4 寄存器间接寻址方式 5 寄存器相对寻址方式 6 基址加变址寻址方式 7 相对基址加变址寻址方式 七种寻址方式总结 寻址方式就是处理器根据指令中给出的地址信息来寻找有效地址
  • 反反调试:app 检测 data/local/tmp 目录绕过手段

    最近在逆向某app时遇到一个非常恶心的反调试手段 只要是maps和fd中存在 data local tmp 甚至只有tmp的字段 app就给kill掉 因为这个目录对于安卓逆向工作来说 是一个比较敏感的目录 hluda server和fri
  • 浅谈逆向——静态分析简介(静态分析1)

    浅谈逆向 IDA简介 IDA PRO IDA反汇编选项配置 IDA界面简介 交叉参考 参考重命名 标签 创建函数 代码和数据的转换 IDA 对简单结构的处理 IDA对复杂结构的处理 IDA调试器 IDA PRO IDA是按照区块装载PE文件
  • 微博登录和session恢复过程

    微博登录和session恢复过程 登录 预登录 获取验证码 登录 密码密文sp计算 登录请求 跨域广播登录 解决cookie设置不上的问题 跨域广播之后 恢复session 完整源码参考我的pixiv to weibo项目 只实现了核心部分
  • Bugkuctf--逆向第三题游戏过关题解

    题目链接 https ctf bugku com challenges 先让我们来打开文件 既然题目都说是游戏过关了 那就玩玩这个游戏呗 雾 游戏还是很简单的 但显然这道题应该用逆向的思维来做 废话 正式部分 逆向的题拿到手一般能考虑的工具
  • ubantu环境下IDA pro运行时碰到某些so找不到的问题

    最近帮组员解决IDA的问题 做个记录 问题 执行启动idea时出现报错 IDA Pro idaq64 报错如下 idaq64 error while loading shared libraries libgthread 2 0 so 0
  • 华为OD机试 - 最差产品奖( Python)

    题目描述 A公司准备对他下面的N个产品评选最差奖 评选的方式是首先对每个产品进行评分 然后根据评分区间计算相邻几个产品中最差的产品 评选的标准是依次找到从当前产品开始前M个产品中最差的产品 请给出最差产品的评分序列 输入描述 第一行 数字M
  • 【华为OD机试2023】字符串解密 java python c++

    字符串解密 题目 题目描述 给定两个字符串string1和string2 string1是一个被加扰的宇符串 string1由小写英文字母 a z 和数字字符 0 9 组成 而加扰字符串由 0 9 a z 组成 string1里面可能包含0
  • 渗透漏洞 Bugku CTF-Web5

    Bugku CTF Web5 一 开启环境 点击链接 二 查看源代码 发现PHP弱类型 三 构造出 payload 提交获得 flag 一 开启环境 点击链接 二 查看源代码 发现PHP弱类型 1 PHP 比较 2 个值是否相等可以用 或
  • CTF BugKu平台——Crypto篇刷题记录(后续更新)

    CTF BugKu平台 Crypto篇 前言 抄错的字符 聪明的小羊 ok lt gt 把猪困在猪圈里 你喜欢下棋吗 小山丘的秘密 EN 气泡 你以为是md5吗 Math English easy crypto 黄道十二官 一段新闻 7 1
  • Bugku题目Reverse逆向部分wp(持续更新)

    目录 入门逆向 Easy Re 游戏过关 sign in Easy vb Next 入门逆向 题目链接 丢入DIE PEID看过 没有壳 32位 直接IDA 汇编代码直接看到 flag Re 1s S0 C0OL Easy Re 题目链接
  • 《CTF特训营》学习总结——Reverse:逆向分析概述

    一 逆向分析的主要方法 逆向分析主要是将二进制机器码进行反汇编得到汇编代码 在汇编代码的基础上 进行功能分析 经过反编译生成的汇编代码中缺失了源代码中的符号 数据结构等信息 因此需要尽可能地通过逆向分析还原以上信息 以便分析程序原有逻辑和功

随机推荐

  • Kubernetes 自动化诊断工具:k8sgpt-operator

    背景 在 Kubernetes 上 从部署 Deployment 到正常提供服务 整个流程可能会出现各种各样问题 有兴趣的可以浏览 Kubernetes Deployment 的故障排查可视化指南 2021 中文版 从可视化指南也可能看出这
  • 图的构建和遍历

    图是一种包括节点和边的数据结构 本文对图的构建 图的遍历给出详细的代码 其中 图的表示方法有 邻接矩阵 邻接表 图的遍历方法有 深度优先搜索 DFS 广度优先搜索 BFS 1 图的表示 1 1 邻接矩阵 include
  • python生成词云--完整代码示例

    工作之余 写个python生成词云来玩玩 运行环境 pycharm 需要引入wordcloud包 中文分词需要用到jieba 随便找了一篇介绍 故宫的文章 以该文章为例生成词云 from wordcloud import WordCloud
  • 协同办公工具:在线白板初起步,在线设计已红海

    在产业数字化转型 疫情常态化等多重背景下 在线办公 远程办公的需求不断增长 协同办公市场规模进一步扩大 吸引传统OA厂商 互联网企业 初创公司等玩家入局 市场竞争愈加激烈 按业务划分 协同办公市场可以分为综合协同管理平台 垂直协同办公软件厂
  • B编码(Bencode)解析

    突然就想要解析了 代码写的好乱 想起来以前GIF图片使用的LZW的编码我还没写完解析呢 近期大概也会写的吧 解析了一个7k的 在我这已经算小的种子文件了 dictionary string announce string http trac
  • Unity用代码修改shader的参数值

    需求 护盾实现溶解效果 需要修改shader参数值 解决方案 去网上找了份带溶解效果的护盾shader 也找到了shader中对应的参数值 接下来就是用代码控制这个参数 首先我们去shader代码中找到对应的参数变量名 通过搜索关键字发现检
  • linux 系统调用表

    一 进程控制 fork 创建一个新进程 clone 按指定条件创建子进程 execve 运行可执行文件 exit 中止进程 exit 立即中止当前进程 getdtablesize 进程所能打开的最大文件数 getpgid 获取指定进程组标识
  • 2017滴滴出行笔试题:异或和为0的最大区间个数

    两个bit的异或 下文均用 代表异或运算 1 0 1 0 1 1 1 1 0 0 0 0 也就是左右元素不同时为1 相同时为0 对于两个int的异或 就是对它的二进制表示的每一位进行异或运算 比如2 5 binary 010 101 bin
  • CentOS6.7 下安装JDK

    第一步 从官网上下载rpm版本的jdk文件 第二步 安装JDK 执行命令rpm ivh jdk 8u73 linux i586 rpm 至此 JDK安装完成 我们来看下JDK的安装目录 在 usr java 目录下面 第三步 配置JDK环境
  • [Codeforces] games (R1600) Part.1

    Codeforces games R1600 Part 1 题单 https codeforces com problemset tags games 1201 1600 74B Train 原题指路 https codeforces co
  • 2022寒假第一场训练赛

    7 2 签到题 7 4 最大公因数与最小公倍数 7 6 dh与学妹过桥 7 7 有多少个质数 7 10 无间道 7 2 签到题 小明和小东是生活在二进制世界的人 一天他们分别获得了一个十进制数 他们想通过将该十进制数分解成二进制数 然后取出
  • 开源项目SmartImageView的引用

    SmartImageView是GitHub上面的一个很好用的图形控件工具 在Android开发中 如果要使用图形ImageView控件 都可以利用SmartImageView来简化代码设计 具体要在http github com去下载项目压
  • 03 发送消息自定义消息模态对话框

    03 windows编程3 发送消息 自定义消息 模态对话框 课程内容 发送消息 自定义消息 模态对话框 课程详情 发送消息 方法一 SendMessage 函数原型 LRESULT WINAPI SendMessage In HWND h
  • 微信小程序与uniapp面试题

    目录 简单描述下微信小程序的相关文件类型 简述微信小程序原理 小程序页面间有哪些传递数据的方法 小程序的wxss和css又哪些不一样的地方 小程序的双向绑定和Vue哪里不一样 vue 微信小程序 uni app属性的绑定 vue 微信小程序
  • 回溯经典-m图着色问题(和地图4色问题的区别)

    四色问题 四色问题是m图着色问题的一个特列 根据四色原理 证明平面或球面上的任何地图的所有区域都至多可用四种 颜色来着色 并使任何两个有一段公共边界的相邻区域没有相同的颜色 这个问题可转换成对一平面图的 着色判定问题 平面图是一个能画于平面
  • Echars柱状图嵌套 居中对齐 柱子占比宽度由大到小嵌套包含 并用小箭头标记当前产出位置

    效果图 div style width 100 height 400px div
  • 使用ajax异步刷新的例子,asp.net jquery+ajax异步刷新实现示例

    function sys post test1 ashx Name text1 val function data text2 val data 第一种方案 要在text1添加 nblur sys 事件响应 document ready f
  • FFmpeg 被声明为已否决 deprecated(2018 精)

    不用再取消SDL检查 不用再添加 pragma warning disable 4996 下面才是正确的解决方法 以下是一些常见的deprecated问题 遇到下述没有列出的问题 可以打开相应的头文件 在里面搜索ctrl F 会有英文说明的
  • static详解

    static详解 static是什么 static怎么用 1 修饰局部变量 2 修饰全局变量 3 修饰函数 总结 C 中的static static是什么 static是C C 语言中常见的一个关键字 就像int break while f
  • bugku-逆向-4、游戏过关(4种简单的方法介绍)

    文章标题 方法一 直接玩 方法二 自己计算flag 方法三 修改源代码 方法四 直接用OD边调试边运行 题目是个consoleapplication4 exe 运行一下 是一个游戏 n是灯的序列号 m是灯的状态 如果m n 1 它是开着的