zoukankan      html  css  js  c++  java
  • *reverse*练习3——攻防世界-hackme

    拿到题,查壳后用ida64打开。

    老样子查找字符串,找到

    点击进入,找到交叉函数F5反编译,

    由下到上分析,如果要输出即v18不为0,即v13=v16^v12,v13可以查到数据,不是flag,v16是整型,也不会是flag,所以猜测v12是我们要求的flag,v12[i]=v13[i]^v16就可以求出v12。

     这个函数是解题关键,但是我看不懂,

     但与v6相关的都%22了,所以尝试一下遍历0-21个数字来写脚本跑一下。

    以下是脚本代码

     #include <iostream>

    using namespace std;

    int main()
    {
        char v12[22]={0};
        int v6,v15,v11,v16;
        //表示byte时,都用unsigned char
        unsigned char v13[]= {0x5F,0xF2,0x5E,0x8B, 0x4E, 0x0E, 0xA3, 0xAA, 0xC7,0x93, 0x81, 0x3D,0x5F, 0x74,0xA3, 0x09,
                              0x91, 0x2B, 0x49, 0x28, 0x93, 0x67, 00,00
                             };
        //截取了前22个
        int i;

        for(i=0; i<22; i++)
        {
            v11 = v6 % 22 + 1;
            v15 = 0;
            while ( v15 < v11 )
            {
                ++v15;
                v16 = (1828812941 * v16 + 12345);
            }

            v12[i]=v13[i]^v16;
        }

        for(i=0; i<22; i++)
        {
            cout<<char(v12[i]);
        }
    }
    写脚本要注意,我用c++写的unsigned char与char的区别,还有数组初始化。
    解出flag

    flag{d826e6926098ef46}

  • 相关阅读:
    UE4智能指针:TUniquePtr
    浅析UE4垃圾回收
    UE4中资源的引用
    ELF文件基础
    【JVM】JVM和Java 体系架构
    【Java多线程】Java线程生命周期、线程同步、线程通信(二)
    【Java多线程】Java多线程基础(一)
    【Java面试题】MySQL索引底层为什么用到B+树
    【算法】B树、B+树详解
    【Kafka】 Kafka的简介与架构(三)
  • 原文地址:https://www.cnblogs.com/kubopiy/p/13453005.html
Copyright © 2011-2022 走看看