解题流程

下载程序
运行:

翻译为:
玩游戏
n是灯的序列号,m是灯的状态
如果第n个灯的m是1,它就亮,如果不是,它就灭
起初所有的灯都关上了
现在您可以输入n来更改其状态
但是你应该注意一件事,如果你改变Nth的状态p、 (N-1)th和(N+1)th的状态也改变
所有灯亮起时,flag将出现
现在,输入n
输入n,n(1-8)
就是输入一个1到8之间的数,例如1:就会改变周围的三个数的状态,令8、1、2三个数变亮,再输入一个2:也会改变2周围三个数的状态,令1、2熄灭,3亮起。多次输入后,最后8个数都亮起的时候就会输出flag。

方法一

逐渐输入1~8,得到flag

方法二

动态调试
先查壳

OD打开文件
右键 >> 搜索引擎 >> 智能搜索,一眼找到flag相关字符串"done!!! the flag is"

双击字符串找到对应的汇编指令,能推断出这是一个输出flag的函数,向上找到这个函数的入口地址为0099E940,因此只要让程序跳转到这里就能输出flag。

根据搜索到的字符串确定到输出flag函数的位置0099E940,点击可以看到显示“跳转来自 007A7AB4”,右键转到该地址。

又看到在007A7AB4位置显示“本地调用来自 007AF66C”,右键转到这个地址。

可以看到,在007AF66C地址的call指令之上有八个jnz指令,对应的是程序里八盏灯的明暗判断。
在各jnz指令处都设置断点。按F9运行程序,程序需输入1-8任意一数字,程序会运行到第一个jnz处的断点暂停。输入1的结果如下图:

这时看程序运行到时,对应的ZF标志寄存器值为多少,若为0则右键“置1”,然后运行。接下来的七个断点也是如此。

八个jnz处的断点位置z寄存器的值都为1,函数接着就会跳转到输出flag的函数。后面没有设置断点,直接继续运行就能得到flag。

注意: 这里用jnz去举例,jnz的判断检查Z位,当Z位是1的时候就不跳转,在Z位是0的时候就跳转

方法三

DA打开无壳
1.SHIFT+F12打开string窗口
2.ALT+T查找flag

3.双击查看该字符串的内存地址
变量位于只读数据区(rdata)

4.通过X键定位变量的交叉引用地址

F5查看伪代码(关键部分)

此IDA为IDAPro6.6

分析后是两步异或的过程
flag生成逻辑为:将v2 ~ v58各字符分别与v59 ~ v115进行异或,再与0x13u(十进制19)进行异或,所得的v2~58字符即为flag
5.Python对数据处理得到flag

方法五

修改源码
用OD打开,查找字符串“done!!! the flag is”找到输出flag的关键位置:


发现它是跳转来自 01077AB4。所以我们再往上转到 01077AB4:
01077AB4为跳转到flag的地址,后面修改的正为此地址01077AB4


0107E940=ConsoleA.0107E940 表明了它指向了输出flag的函数;本地调用来自 0107F66C说明它是由0107F66C调用的,所以我们再往回转到 0107F66C:

我们到了这,发现上面由8个JNZ,这不就是源代码里的8个判断吗?

一旦只要由一个判断不满足,程序就跳转到输出flag的函数的下一条去了,这样就不会输出flag而重新开始循环要求你输出n了:

所以我们要修改源代码令程序不管怎样都会进入输出flag的函数,这样我们只要运行程序就能得到flag了。将原来的“jmp 0107F4FB”(跳转到循环重新开始的位置)改为jmp 01077AB4(跳转到输出flag函数的位置),这样只要我们输入1~8直接的数,程序最后都为跳转到01077AB4(flag函数的入口地址):

建议:将jmp ConsoleA.01077AB4改为call ConsoleA.01077AB4
即不要跳到里面去

也可以在断点运行的过程修改跳转地址
保存到可执行文件,(没有直接保存的选项,所以需要右键 复制到可执行文件->选上
运行:

同样也得到flag。

BugkuCTF-Reverse题游戏过关多解法相关推荐

  1. bugku_逆向_游戏过关

    初接触逆向,就先做点简单的题. 参考链接: https://www.52pojie.cn/thread-925121-1-1.html https://blog.csdn.net/calmegm/ar ...

  2. ICG游戏:尼姆游戏异或解法的证明

    描述: 尼姆博奕(Nimm Game),有n堆石子,每堆石子有若干石子,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限.取走最后石子的人获胜. 标准解法: 判断: 先计算先手是必胜还是 ...

  3. C语言编程学习打造——做题游戏

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...

  4. 2020研究生数学建模E题--AlexNet深度网络解法(大雾能见度估计与预测)(含代码)

    2020研究生数学建模E题--AlexNet深度网络解法(大雾能见度估计与预测)(含代码) 一.E题赛题 二.赛题分析 三.解题 3.1 数据预处理 3.2 AlexNet深度网络 (1)AlexNe ...

  5. Bugku逆向-游戏过关

    Bugku游戏过关 od工具推荐用吾爱的:https://www.52pojie.cn/thread-14986-1-1.html 打开后是一个开灯游戏,总共八个灯,每一层用户可以根据情况按一个1-8 ...

  6. 弹球游戏过关之缩短挡板(三)

    弹球游戏过关之缩短挡板(三) 01实现内容介绍 弹球游戏共有五个关卡,本次我们实现关卡3. 关卡3难度也是非常的简单的,规则介绍: 第二关我们是设置了增加障碍物,用户通过第二关后,舞台背景切换至第三关 ...

  7. bugku-reverse-入门逆向 Easy_vb re 游戏过关 逆向入门

    入门逆向 下载文件  解压后 拖入IDA中 Easy_vb 同样方法  解压后 拖入IDA Easy_re 下载解压后 打开 似乎有点逗 查下壳先 拖入IDA 选中这两行字符  转译 单击a 得到fl ...

  8. BugkuCTF 游戏过关

    这道题有两种方式,详细参考博客 https://blog.csdn.net/calmegm/article/details/82844643 一种是通过IDA,分析得出结论.两个数组异或 又和0X13 ...

  9. opengl正方形绕点旋转_一题十五种解法够不够? 旋转,构造,四点共圆乐不停...

    平移,旋转,轴对称是我们初中学习的"几何三大变换".在我们初中阶段学习的几何知识中占据着核心的地位,特别是旋转,那更是核心中的核心(河南中考22题年年考). 如何更好的理解旋转,如 ...

最新文章

  1. 第十六届无线节能信标灯规格说明
  2. 获取有效工作日封装类(原创)
  3. int main(int argc, char* argv[])
  4. 使用Arthas 获取Spring ApplicationContext还原问题现场
  5. linux中统计java数量,linux 统计当前目录下文件数
  6. 并查集(UnionFindSet)
  7. 前端学习(2404):表单验证总结
  8. 不懂电脑如何买电脑_如何选择性价比高的电脑 买电脑要注意什么
  9. orm mysql nodejs_【译】Nodejs最好的ORM
  10. JavaScript中的属性操作
  11. 执行效率太低又怎样? Python 照样火过 Java、C/ C++
  12. 基于gitosis的Git云端服务器配置
  13. 使用 JS 实现一个简单的日历
  14. 助成招聘网站——个人项目06
  15. 京东推荐系统实践——打造千人千面的个性化推荐引擎
  16. PDFEdit编辑器使用教程为PDF增加封面
  17. OpenModelica.VehicleInterfaces离线库安装
  18. python byte转str,str转byte
  19. 或是独体字吗_独体字结构 独体结构的字有哪些字?
  20. 基础数学(五)——数值积分

热门文章

  1. 安全之心:一文读懂可信计算
  2. 分布式事务中间件 Fescar - 全局写排它锁解读 1
  3. 服务化改造实践(二)| Dubbo + Kubernetes
  4. OpenInfra 十一年:OpenStack 部署规模超 2500 万计算核心
  5. 金蝶 2020 云业务收入达 57%,为何 CEO 说“未来三年用订阅模式再造新金蝶”?
  6. 打钱!我的数据库被黑客勒索了!
  7. 异构计算黄金时代下,超强异构计算服务器FP5468G2将会带来哪些变革?
  8. 【耿老师公开课】反转!物联网火爆,开发者却很难入门?
  9. 填补服务机器人市场空白,九号机器人提供智能服务场景解决方案!
  10. opencv opencl加速_回放 | OpenCV Webinar 3:OpenCV深度学习应用与原理分析