zoukankan      html  css  js  c++  java
  • BUUCTF-RE-[V&N2020 公开赛]strangeCpp

    查壳

    image-20200724222245350

    运行程序

    image-20200724222454101

    它提示说cpu num是8 这个信息是有用的

    搜索字符串

    image-20200724222330342

    也就这一块了。

    flag{where_is_my_true_flag?}肯定是假的了。

    image-20200724222650993

    这一块就是提示cpu数值的。我们交叉引用看看。

    image-20200724222747559

    然后我们就能找到解题的关键函数了。

    __int64 sub_140013580()
    {
      __int64 *v0; // rdi
      signed __int64 i; // rcx
      __int64 result; // rax
      __int64 v3; // [rsp+0h] [rbp-20h]
      int v4; // [rsp+24h] [rbp+4h]
      int j; // [rsp+44h] [rbp+24h]
      __int64 v6; // [rsp+128h] [rbp+108h]
    
      v0 = &v3;
      for ( i = 82i64; i; --i )
      {
        *(_DWORD *)v0 = -858993460;
        v0 = (__int64 *)((char *)v0 + 4);
      }
      v6 = -2i64;
      sub_1400110AA((__int64)&unk_140027033);
      result = sub_140011384((unsigned int)dword_140021190);
      v4 = result;
      if ( (_DWORD)result == 607052314 && dword_140021190 <= 14549743 )
      {
        for ( j = 0; j < 17; ++j )
        {
          putchar((unsigned __int8)(dword_140021190 ^ *((_BYTE *)&qword_140021008 + j)));
          result = (unsigned int)(j + 1);
        }
      }
      return result;
    }
    

    putchar是输出函数,我们推测可能是flag了这里。然后16个字符串也比较符合常规。那我们首先要知道dword_140021190的值,进入sub_140011384

    signed __int64 __fastcall sub_140013890(int a1)
    {
      __int64 *v1; // rdi
      signed __int64 i; // rcx
      signed __int64 result; // rax
      __int64 v4; // [rsp+0h] [rbp-20h]
      int v5; // [rsp+24h] [rbp+4h]
      int v6; // [rsp+44h] [rbp+24h]
      unsigned int v7; // [rsp+64h] [rbp+44h]
      int v8; // [rsp+160h] [rbp+140h]
    
      v8 = a1;
      v1 = &v4;
      for ( i = 82i64; i; --i )
      {
        *(_DWORD *)v1 = -858993460;
        v1 = (__int64 *)((char *)v1 + 4);
      }
      sub_1400110AA((__int64)&unk_140027033);
      v5 = v8 >> 12;
      v6 = v8 << 8;
      v7 = (v8 << 8) ^ (v8 >> 12);
      v7 *= 291;
      if ( v7 )
        result = v7;
      else
        result = 987i64;
      return result;
    }
    

    结合上一个函数我们知道result == 607052314且dword_140021190 <= 14549743

    经过sub_140011384操作过后的值等于607052314

    我们算这个v7=607052314 我们要通过v7来推v8

    然后我们写脚本把v8解出来 dword_140021190在sub_140011384里是a1也就是v8

    v8解出来之后拿到外面跟qword_140021008数组做异或

    注意小端

    解题脚本

    #include<stdio.h>
    int main()
    {
    	int m,i;
    	char flag[17];
    	char str[17] = { 0x26,0x2C,0x21,0x27,0x3B,0x0D,0x04,0x75,0x68,0x34,0x28,0x25,0x0E,0x35,0x2D,0x69,0x3D };
    for (i = 0; i < 14549743; i++) {
    	m = (i >> 12) ^ (i << 8);
    	if (m * 291 == 607052314) {
    		printf_s("%d
    ",i);
    		break;
    	}
    }
    
    for (int j = 0; j < 17; j++) 
    	putchar(str[j]^i);
    return 0;
    }
    

    结果:

    123456
    flag{MD5(theNum)}

    md5

    import hashlib
    
    print("
    flag{"+hashlib.md5('123456'.encode(encoding='utf-8')).hexdigest()+'}')
    

    flag{e10adc3949ba59abbe56e057f20f883e}

  • 相关阅读:
    python — 文件操作
    Android存储
    JAVA 里面 synchronized作用
    UML元素
    ubuntu18.04 命令行安装gradle
    UML时序图
    视觉SLAM中的数学——解方程AX=b与矩阵分解:奇异值分解(SVD分解) 特征值分解 QR分解 三角分解 LLT分解
    现行最小二乘过约束和欠约束如何求解
    SLAM-G2O分析
    自定义Gradle插件
  • 原文地址:https://www.cnblogs.com/Nickyl07/p/13412963.html
Copyright © 2011-2022 走看看