zoukankan      html  css  js  c++  java
  • REVERSE-DAILY(5)-rev2

    比较有意思的一道题目  提示是一个迷宫

    链接: http://pan.baidu.com/s/1pLhINBt 密码:91bs

    先运行程序,要求是输入字符串,错误会输出“Sorry you are wrong!”

    先用ida载入,按程序运行流程首先会注意到_main_0函数,函数也与程序结构相符,但如果以此分析下去是错误的,

    注意到ida中有如下结构:

      v6 = 0;
      v5 = 0;
      v7 = 0 / 0;
      printf("Please input your key:
    ");

    v7=0/0明显是错误的,会跳到SE处理程序,这一点可以在od中得到验证

    如图下断点的话,程序在0x0040140d输出字符串“Please input......”,输入字符串后也不能停住,实际上是0/0出错后调到SE处理程序,根据上图可以看到0x004013ed处压入SE处理程序安装地址,最终程序跳到sub_401020函数运行。

    分析sub_401020函数:

    可以得到如下信息:

    1.输入字符串长度为22

    2.输入字符串每个字符为h,j,k,l中的一个

    3.主结构是个大循环,依次逐位检查每一个输入字符

    4.v4= "********* *    ** * ** ** * ** ** * #* ** **** **      *********"

      &v4=bp-c8

      &v6=bp-88

      &v5=bp-bf

      初始时v3=&v5

    5.主结构有四条分支,输入字符为h: v3--

                                               j:  v3+=8

                                               k: v3-=8

                                               l:  v3++

    6.对于v3 < &v4 || v3 > &v6判断条件,v4和v6分别是v4的上下界,这只是检查v3是否出界

    7.对于 *v3 == 42是判断如果*v3为*则报错,

    8.当字符为#时成功

    所以思路即为由最初的v3通过运算到达#,这实际上就类似于走一个迷宫

                                          

    迷宫如上图,第一个*即为v4起始点,最后一个空白格为v6检查点,第三行第一个空格为v3起始地址,

    这样就容易得到了字符串:jjjjjlllllkkkkkhhhjjjl

  • 相关阅读:
    Miracast
    linux软中断与硬中断实现原理概述
    入门视频采集与处理(BT656简介)
    emms指令在MMX指令中的作用
    linux进程的地址空间,核心栈,用户栈,内核线程
    linux 线程的内核栈是独立的还是共享父进程的?
    进程内核栈、用户栈及 Linux 进程栈和线程栈的区别
    Gson JsonParser的使用
    封装JDBC事务操作,执行存储过程测试
    Oracle 存储过程,临时表,动态SQL测试
  • 原文地址:https://www.cnblogs.com/lomooo/p/5966658.html
Copyright © 2011-2022 走看看