BUU-[GXYCTF2019]minecraft

看见给了静态链接库和动态链接库 猜测重要函数应该在链接库里

 

果然存在一个名为string_to_long 的check函数      还不会逆向lib文件,所以分析dll文件

直接搜索string_to_long函数 找到后分析

 

这里的技巧就是  只针对我们的输入串找对应函数 因为IDA会高亮相同串   🈶️勾的地方就是🈶️对i输入串操作对地方

还是感觉c++反汇编里面 有好多没用对函数  所以这里选择性分析函数 

大致流程就是先把input串 base64加密  之后每四个字符分一组,hash之后和值对比

hash函数如下

 

 

 

 相当于是四个字符依次进入while 

 

 这里最后的hash过程 因为是c语言直接复制出来改一改变量

提出来hash函数 直接爆破 因为0xff**4很大 这里就用了常用的几十个字符作为字典

#include<cstdio>

unsigned int goal[10] = {0x6C43B2A7,0x7954FD91,0xA3E9532,0xB87B5156,0xDA847742,0x2395E7F3,0xA679D954,0xE1FAAFF7};
unsigned int flag[10];
char table[100];
using namespace std;
int main()
{
    int num = 0;
    for(int i='a';i<='z';i++)
    {
        table[num++] = i;
    }
    for(int i='A';i<='Z';i++)
    {
        table[num++] = i;
    }
    for(int i='0';i<='9';i++)
    {
        table[num++] = i;
    }
    table[num++] = '{';
    table[num++] = '}';
    table[num++] = '_';
    table[num++] = '-';
    for(int i=0;i<8;i++)
    {
        bool vis = 1;
        for(int n1=0;n1<num&&vis;n1++)
            for(int n2=0;n2<num&&vis;n2++)
                for(int n3=0;n3<num&&vis;n3++)
                    for(int n4=0;n4<num&&vis;n4++)
                    {
                        unsigned long long res = 0;
                        res ^= 0xC6A4A7935BD1E995LL * (((unsigned long long)(0xC6A4A7935BD1E995LL * table[n1]) >> 47) ^ 0xC6A4A7935BD1E995LL * table[n1]);
                        res *= 0xC6A4A7935BD1E995LL;
                        res += 0xE6546B64;
                        
                        res ^= 0xC6A4A7935BD1E995LL * (((unsigned long long)(0xC6A4A7935BD1E995LL * table[n2]) >> 47) ^ 0xC6A4A7935BD1E995LL * table[n2]);
                        res *= 0xC6A4A7935BD1E995LL;
                        res += 0xE6546B64;
                        
                        res ^= 0xC6A4A7935BD1E995LL * (((unsigned long long)(0xC6A4A7935BD1E995LL * table[n3]) >> 47) ^ 0xC6A4A7935BD1E995LL * table[n3]);
                        res *= 0xC6A4A7935BD1E995LL;
                        res += 0xE6546B64;
                        
                        res ^= 0xC6A4A7935BD1E995LL * (((unsigned long long)(0xC6A4A7935BD1E995LL * table[n4]) >> 47) ^ 0xC6A4A7935BD1E995LL * table[n4]);
                        res *= 0xC6A4A7935BD1E995LL;
                        res += 0xE6546B64;
                        unsigned int res2 = (int)res;
                        if(res2 == goal[i])
                        {
                            vis = 0;
                            //printf("%d\n",i);
                            printf("%c%c%c%c",table[n1],table[n2],table[n3],table[n4]);
                        }
                    }
    }
    return 0;
}
/*

*a1 ^= 0xC6A4A7935BD1E995i64 * (((unsigned __int64)(0xC6A4A7935BD1E995i64 * a2) >> 47) ^ 0xC6A4A7935BD1E995i64 * a2);
  *a1 *= 0xC6A4A7935BD1E995i64;
  result = *a1 + 0xE6546B64i64;
  *a1 = result;

*/

得到base64加密后的串 然后解密

 

 这里最后一个单词是friend 最后加上d}即可

 

posted @ 2020-09-24 18:45  Papayo  阅读(484)  评论(0编辑  收藏  举报