分析这道题,爽,能够结合IDA和ollydbg分析代码,美滋滋。但如果以后能直接根据汇编容易地看懂逻辑那就更好了。
参考链接:
  首先根据IDA分析得知主函数是sub_411B70()。查看功能,可知它先随机生成了二维随机数组序列(这其实是伪随机的),然后提示用户输入数,还有个可疑函数sub_41114F(),猜测会处理输入数,最后判断输入的数能在二维随机数组序列中顺利走多久。看回显可知要输入能走得最久且最终数字和最大的数(如下图),即既能走到数组头,又经过的所有点的随机数和最大。emmmm,牵扯到的点有PRNG和Maze(迷宫),哦,还有个加密。

(1)PRNG
  它是一种伪随机数生成器(如下图),使用种子作为输入,攻击者知道种子和算法就能重现输出流。

  看上图,程序提供的种子一直是0xCu,则rand的值就是固定的,那就能复现这个随机数组啦。
(2)可疑函数sub_41114F()
  使用ollydbg动态调试输入的数据,看经过这个函数后的输出数据,可知它将偶数位的字符都变化了,可以认为是单表替换加密,即将固定的字母换成了其他字母。
  经过测试,得知它的替换结果如下。
原数   ABCDEFGHIJKLMNOPQRSTUVWXYZ
替换结果 EFG@ABCLMNOHIJKTUVWPQRS\]^
(3)Maze(迷宫)
  在迷宫中要想走出去且获取的值最大,起点已定,就要从当下着眼,每一步走最大的,这样结果才是最大的。迷宫算法如下图。

  接下来开始破解。可以先复现逻辑数组,然后逆向思维算出最好的走法,最后将走法偶数位通过单表计算替换字符即可。程序如下:
#include<iostream>
using namespace std;
int main() {
       int mountain[20][20];
       memset(mountain, 0, 400 * sizeof(int));
 
       srand(12);
       for (int i = 1; i <= 20; ++i)
       {
              for (int j = 1; j <= i; ++j)
              {
                     mountain[i][j] = rand() % 100000;
              }
       }
 
       int x = 1, y = 1;
       int sum = mountain[x][y];
       for (int i = 0; i < 19; i++) {
              int L = mountain[x + 1][y];
              int R = mountain[x + 1][y + 1];
 
              if (R > L) {
                     printf("R");
                     sum += R;
                     x++;
                     y++;
              }
              else {
                     printf("L");
                     sum += L;
                     x++;
              }
       }
       printf("\n%d\n", sum);
       system("pause");
       return 0;
}
  计算出来路线是RRRRRLLRRRLRLRRRLRL,通过单表计算结果是RVRVRHLVRVLVLVRVLVL,结果出来啦-。-
 
 
 
 
 
 
 

http://ctf.bugku.com/challenges#Mountain%20climbing:bugku--Mountain-Climbing的更多相关文章

  1. http://ctf.bugku.com/challenges#love:bugku--love

      做了一道逆向题目,主要关联到base64编码的知识点.下面做一分析. 题目如下:   通过测试,可知它没有加壳.尝试使用IDA进行分析. 1.IDA分析文件   打开文件后,按[shift+F12 ...

  2. http://ctf.bugku.com/challenges#%E9%80%86%E5%90%91%E5%85%A5%E9%97%A8:bugku--逆向入门

      文件是:   分析挺简单,主要是data urls知识点.     首先使用peid检测是否加壳,发现它居然是jpg文件.使用notepad++查看,结果如下.   嗯,百度一下子,知道了data ...

  3. http://ctf.bugku.com/challenges#Timer(%E9%98%BF%E9%87%8CCTF):Bugku——Timer(阿里CTF)

      做了第一个android apk逆向题,很多工具啥的还没用过,再接再厉.   找到方法发现这个apk支持的SDK API是15-17,于是就下载了API 16并制作了模拟器,但发现还是运行不起来, ...

  4. http://ctf.bugku.com/challenges#%E6%B8%B8%E6%88%8F%E8%BF%87%E5%85%B3--游戏过关

      做成功这道逆向题了,哈哈哈哈.   启程.   运行了一下子程序,发现它是要保证所有灯亮着才会给flag.如下图所示.   我聪明滴认为首先可以通过关键字符串找到关键代码位置哦. 1.找到关键代码 ...

  5. http://ctf.bugku.com/challenges#Easy_Re

      今天做一道逆向题,开心,见证了自己汇编的用途.     首先看它是否加壳? 1.加壳检测   是vc编程的,没有加壳,可以愉快地分析了.   2.分析程序,找到flag.   首先运行一下子程序, ...

  6. bugku 神秘的文件

      题目链接: https://ctf.bugku.com/challenges#%E7%A5%9E%E7%A7%98%E7%9A%84%E6%96%87%E4%BB%B6 工具准备: 1.PC 2. ...

  7. Bugku练习题---MISC---FileStoragedat

    Bugku练习题---MISC---FileStoragedat flag:bugku{WeChatwithSteg0} 解题步骤: 1.观察题目,下载附件 2.下载后发现是一个后缀名为.dat的文件 ...

  8. ctf题目writeup(7)

    2019.2.10 过年休息归来,继续做题. bugku的web题,地址:https://ctf.bugku.com/challenges 1. http://123.206.87.240:8002/ ...

  9. ctf题目writeup(6)

    2019.2.2 依旧是bugku上面的题目,地址:https://ctf.bugku.com/challenges 1. 解压后是60多个out.zip,都是真加密,里面都是1kb的data.txt ...

随机推荐

  1. maven安装操作

    首先检查我们的系统是否有安装JDK,检验方法:1.首先在我们的“文件资源管理器”地址栏输入cmd.在“文件资源管理器”地址栏输入cmd命令后,按下键盘上的“Enter”键,进入黑科技模式.在我们的“D ...

  2. python socket 函数介绍

    socket 函数原型:socket.socket([family[,type[,proto]]]) family参数取值(协议族): socket.AF_INET        -->ipv4 ...

  3. Python垃圾回收详解:引用计数+标记清理+分代回收

    Python采用的是引用计数机制为主,标记-清理和分代收集两种机制为辅的策略. 1.引用计数 python中一切皆对象,所以python底层计数结构地就可以抽象为: 引用计数结构体{ 引用计数; 引用 ...

  4. 【SpringBoot】搜索框架ElasticSearch介绍和整合SpringBoot

    ========================12章 搜索框架ElasticSearch介绍和整合SpringBoot ============================= 加入小D课堂技术交 ...

  5. PythonStudy——内存管理之垃圾回收 Memory management Garbage collection

    内存管理 引用计数:垃圾回收机制的依据 # 1.变量的值被引用,该值的引用计数 +1# 2.变量的值被解绑,该值的引用计数 -1# 3.引用计数为0时就会被垃圾回收机制回收 标记清除:解决循环引用问题 ...

  6. Spring/Spring MVC

    90.为什么要使用 spring? 答:spring是一个开源框架,是个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架 方便结构简化开发 AOP编码的支持 声明式事物的支持 方便程序的测试 ...

  7. <a>标签里的函数事件写法的实战建议

    如果在实际应用中确实是要用到标签来响应onclick事件的, 那么就建议使用下面三种方法 <a href="javascript:void(0);" onclick=&quo ...

  8. icomoon:生成字体图标的方法并应用

    字体图标任意缩放不会失真,也大大减少请求数量,非常好用. 在线生成工具:https://icomoon.io/app/#/select 在线SVG图库(阿里),  用于导入:http://www.ic ...

  9. TensorFlow 安装报错的解决办法(安装1.5版本)

    1.安装Anaconda 百度下载windows版本,一路点下一步,安装好了Anaconda,自带python3.6.6. 2.安装TensorFlow (1)打开Anaconda Prompt,输入 ...

  10. 源码:Java集合源码之:哈希表(二)

    要想知道一个元素是否在数组或链表中,只能从前向后挨个对比,无论是数组还是链表,其对数据的查询表现都比较无力.在的二叉排序树中,还会将数据排序以进行二分查找,将时间复杂度从O(n)降低到O(lg n). ...