pwnable.tw的calc和pwnable.kr的memcpy难度提升得让我突然像是到了一片知识的孤岛上,举目所望是无尽的未知。才发现自己的汇编基础实在薄弱,另外只通过0day安全分析学了windows的堆管理,对linux的堆管理实在是所知甚少,鉴于此,在补足基础的时候,打算做一下bugku上的逆向维持一下基本的做题感觉。

bugku逆向的前三题都是用IDA打开就看到答案了,所以从游戏过关这一题开始。

用IDA打开,搜索main,没看到,搜索_main查到主函数。

一进主函数就看到

  sub_45A7BE((int)&unk_50B110, v21);sub_45A7BE((int)&unk_50B158, v3);sub_45A7BE((int)&unk_50B1A0, v4);sub_45A7BE((int)&unk_50B1E8, v5);sub_45A7BE((int)&unk_50B230, v6);sub_45A7BE((int)&unk_50B278, v7);sub_45A7BE((int)&unk_50B2C0, v8);sub_45A7BE((int)&unk_50B308, v9);sub_45A7BE((int)&unk_50AFD0, v10);sub_45A7BE((int)"|              by 0x61                                 |\n", v11);sub_45A7BE((int)"|                                                      |\n", v12);sub_45A7BE((int)"|------------------------------------------------------|\n", v13);sub_45A7BE((int)"Play a game\n""The n is the serial number of the lamp,and m is the state of the lamp\n""If m of the Nth lamp is 1,it's on ,if not it's off\n""At first all the lights were closed\n",v14);

这样一篇看不懂的代码,sub_45A7BE竟然还Decompliation failure,直接打开程序知道了是一个把黑灯全转化成亮灯的游戏。

顺着main函数查看

    while ( 1 ){sub_45A7BE((int)"input n,n(1-8)\n", v22);sub_459418();sub_45A7BE((int)"n=", v19);sub_4596D4("%d", &v24);sub_45A7BE((int)"\n", v20);if ( v24 >= 0 && v24 <= 8 )break;sub_45A7BE((int)"sorry,n error,try again\n", v22);}if ( v24 ){sub_4576D6(v24 - 1);}else{for ( i = 0; i < 8; ++i ){if ( (unsigned int)i >= 9 )j____report_rangecheckfailure(a1, a2, a3);byte_532E28[i] = 0;}}

通过sub_4596D4知道了v24就是我们输入的值,else就是重置游戏,通过byte_532E28[i]=0知道0是关灯的状态,那main函数最后的if语句就是判断游戏胜利的条件了。

    if ( byte_532E28[0] == 1&& byte_532E28[1] == 1&& byte_532E28[2] == 1&& byte_532E28[3] == 1&& byte_532E28[4] == 1&& byte_532E28[5] == 1&& byte_532E28[6] == 1&& byte_532E28[7] == 1 ){sub_457AB4();}

跟进sub_457AB4,看到一百多个从v3-v116的参数,后面跟着一个函数

  for ( i = 0; i < 56; ++i ){*(&v3 + i) ^= *(&v60 + i);*(&v3 + i) ^= 0x13u;}return sub_45A7BE((int)"%s\n", (unsigned int)&v3);

明白了这114个参数分成两组进行异或运算,最后再和0x13异或。

把一百多个参数直接复制到nodepad++里面,然后按着alt选择前面几列删除,把分号替换成逗号,在这114行数字前加上a=[,末尾加上],就变成了一个python列表了

for i in range(0,56):print(chr((a[i]^a[i+57])^19))

加上一个循环,成功输出flag

其实这道题并没有怎么顺着分析。。点开main函数顶部的unk_50B110,碰巧在数据段内发现flag

.rdata:0050B0F0 aDoneTheFlagIs  db 'done!!! the flag is ',0
.rdata:0050B0F0                                         ; DATA XREF: sub_45E940+28↑o
.rdata:0050B105                 db    0
.rdata:0050B106                 db    0
.rdata:0050B107                 db    0
.rdata:0050B108                 db    0
.rdata:0050B109                 db    0
.rdata:0050B10A                 db    0
.rdata:0050B10B                 db    0
.rdata:0050B10C aS              db '%s',0Ah,0           ; DATA XREF: sub_45E940+288↑o
.rdata:0050B110 unk_50B110      db  20h                 ; DATA XREF: _main_0+1E↑o

然后右键选择Xrefs graph to就发现了sub_45E940调用了这个字段,搜索到这个函数后一路倒着进入了main函数,就明白了flag怎么得到了。

bugku-游戏过关相关推荐

  1. bugku 游戏过关

    常规破解思路,就不多说了,不会可以去看看'逆向工程核心原理' 思路1: 直接通关游戏,也不难. 2: 直接跳转函数地址到输出flag的函数. 3: 读懂flag生成函数, 自己写脚本翻译出来. 更详细 ...

  2. bugku:游戏过关

    先运行下程序发现是点灯小游戏 我随便试了一下,发现12345678就可以. 但是要真正去解,逻辑在这里,就是把两个数组异或 zsctf{T9is_tOpic_1s_v5ry_int7resting_b ...

  3. CTF之Bugku 游戏过关

    这道题硬是拖了两天.. 下载下来,丢到ida和ollydbg里面 在ollydbg里面运 我们看到ida里面,shift+f12搜索字符串 马上就看到有个flag 做这种逆向的时候字符串搜索是一个很方 ...

  4. Bugku逆向-游戏过关

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

  5. bugku_逆向_游戏过关

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

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

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

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

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

  8. 推箱子html5游戏例子,HTML5 推箱子游戏过关演示动画

    点击下面链接可看动画: 外链网址已屏蔽 效果图: 代码: var canvas = document.getElementById("gameBox"); var context ...

  9. BugkuCTF-Reverse题游戏过关多解法

    解题流程 下载程序 运行: 翻译为: 玩游戏 n是灯的序列号,m是灯的状态 如果第n个灯的m是1,它就亮,如果不是,它就灭 起初所有的灯都关上了 现在您可以输入n来更改其状态 但是你应该注意一件事,如 ...

  10. 以前的java单机游戏过关长剑,玩过这些经典单机游戏_就说明你已经老了

    历史上最初的 Windows 1.0 诞生于 1985 年,第一个取得商业上成功的版本 Windows 3.0 则是在 1990 年问世,不过对大多人来说,1995 年的 Windows 95 才是真 ...

最新文章

  1. php与nginx链接,Nginx与PHP的交互
  2. 张莉python 玩转数据答案_大学mooc2020年用Python玩转数据课后答案
  3. sed for windows 双引号内部内容的替换
  4. C语言和设计模式(解释器模式)
  5. 【Spark篇】---Spark调优之代码调优,数据本地化调优,内存调优,SparkShuffle调优,Executor的堆外内存调优...
  6. opencv计算机视觉学习笔记一
  7. mycat 读写分离 处理延时
  8. 欧拉项目(python练习)problem 45
  9. 云服务器的安全设置常识
  10. 修复计算机命令行,命令提示符修复系统方法
  11. java将图片转化为base64码
  12. headers java_RabbitMQ四种Exchange类型之Headers(Java)
  13. 一位IT行业高收入者的理财规划方案
  14. 太阳照常升起(C大调)
  15. 单链表上的直接插入排序
  16. Flowable 6.6.0 BPMN用户指南 -10 流程实例迁移 - 10.1 简单示例
  17. DICOM医学图像处理:DICOM存储操作之 “多幅JPG图像数据存入DCM文件”
  18. 水军为手机应用软件排名造假
  19. VLfeat学习(1)——Covariant feature detectors(协变特征检测器)
  20. java项目甘特图打印

热门文章

  1. 海尔小管家1号店嗨购盛典引爆 市场份额稳居红星美凯龙第一
  2. 网页设计与构架中的几个SEO优化原则
  3. 认识数字影片版本(CAM、TS、TC、DVD、HD、BD、TVRIP等)
  4. 专访Alasend万能登陆器创作团队
  5. GTO、GTR、MOSFET和IGBT的区别及应用
  6. mp4视频 一帧字节大小
  7. Redis缓存雪崩缓存击穿缓存穿透
  8. 万物云开启路演:拟募资8亿美元 淡马锡与高瓴是基石投资者
  9. 阿德莱德大学计算机专业学费,阿德莱德大学费用清单
  10. PPT基础(十五)调整形状的透明度