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}即可