某新春杯

这个杯感觉是新手杯,re题比较简单,没啥意思,感觉白来了

一、RE Check In

 

1、 查壳

 

2、IDA静态分析

 

 

base64解密,拿到flag

 

 

3、拿到flag

flag{3f694fe5-8b6a-4512-ad6f-c9556341c011}

 

二、Easy RE

 

 

1、查壳

 

 

无壳

2、IDA静态分析

 

 

一个简单的异或加密

3、写出解密脚本

Dst = [
  0x74, 0x00, 0x00, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x71, 0x00,
  0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00,
  0x6B, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x00, 0x00, 0x1B, 0x00,
  0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00,
  0x1C, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x15, 0x00,
  0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00,
  0x61, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x66, 0x00,
  0x00, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
  0x12, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x61, 0x00,
  0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
  0x5D, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x59, 0x00,
  0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
  0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0x00,
  0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x00, 0x00,
  0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x4E, 0x00,
  0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00,
  0x48, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00,
]

str = ''
for i in range(42):
  str +=chr(((Dst[i*4] + i)^0x12) % 256)

print(str)

4、拿到flag

flag{bb071403-5bfe-442e-9ddf-03552b97a7bb}

 

三、Dynamic Reverse

名字叫动态逆向,实际上只靠IDA静态分析也能得到结果

 

 1、查壳

无壳

2、IDA静态分析

 

 查找字符串,交叉引用

 

 

简单的看一下代码逻辑,MD5Update与MD5Final函数一起完成md5加密

在整个程序逻辑中,我们需要输入8次正确的字符串(key),才能到达这里

 

 

 

 

v35与v8两个字符串的md5值作比较,相等的话即可输入下一个字符串

 

 

注意这里v3 = ch,点开ch

 

 这里全是一些字符串

 

 又注意到这里v3+=10 ,不难明白,程序每次循环后字符串数组指针向后移动10个字节

3、写出解密脚本

 

// Finaa.cpp : Defines the entry point for the console application.
//

#include <stdio.h>
#include <windows.h>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
    int v4 = 0;
    int v5;
    char v35;
    char v36;
    char v37;
    char v38;
    char v39;
    char v40;
    char v41;
    char v42;
    char v43;
    char * v6;

    BYTE test[0x100] ;
    memset(test,0,0x100);
    strcpy((char*)test,"12/4-.");
    strcpy((char*)(test+0xa),"745.30");
    strcpy((char*)(test+0x14),"cdaf_`");
    strcpy((char*)(test+0x1e),"42764/");
    strcpy((char*)(test+0x28),"uyirp{");
    strcpy((char*)(test+0x32),"fvigdm");
    strcpy((char*)(test+0x3c),"€~exhl");
    strcpy((char*)(test+0x46),"xzv{zbf");
    char* v3 = (char*)test;

    while(1){
        v5 = strlen(v3);
        if ( v5 )
        {
          v35 = *v3 - v4;
          if ( v5 != 1 )
          {
            v36 = (v3[1] + 1 - v4) ^ 1;
            if ( v5 != 2 )
            {
              v37 = (v3[2] + 2 - v4) ^ 2;
              if ( v5 != 3 )
              {
                v38 = (v3[3] + 3 - v4) ^ 3;
                if ( v5 != 4 )
                {
                  v39 = (v3[4] + 4 - v4) ^ 4;
                  if ( v5 != 5 )
                  {
                    v40 = (v3[5] + 5 - v4) ^ 5;
                    if ( v5 != 6 )
                    {
                      v41 = (v3[6] + 6 - v4) ^ 6;
                      if ( v5 != 7 )
                      {
                        v42 = (v3[7] + 7 - v4) ^ 7;
                        if ( v5 == 9 )
                          v43 = (v3[8] + 8 - v4) ^ 8;
                      }
                    }
                  }
                }
              }
            }
          }
          v6 = &v35 + v5;
        }
        else
        {
          v6 = &v35;
        }
        *v6 = 0;
        
        cout<<v35<<v36<<v37<<v38<<v39<<v40<<v41<<endl;
        v3 = (char*)(v3+10);
        v4++;
        if(v4 == 8)
            break;

    }
    
    return 0;
}

 

 获得8个字符串

123456
654321
abcdef
114514
qwerty
asdfgh
zxcvbn
qustsec

 

 放在程序中也能正常运行

4、拿到flag

 

 flag{61970f40f232b7d9dd1f0da5be56a124}

//记得转小写就行

 

四、总结

第三题还算有些难度,比赛还算是比较适合新手

 

posted @ 2022-02-11 16:03  TLSN  阅读(20)  评论(0)    收藏  举报