*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}

 

posted @ 2020-08-07 15:08  kubopiy  阅读(265)  评论(0编辑  收藏  举报