ZCTF2017-reeverse

ZCTF2017-reeverse

Reverse200-EasyReverse

首先找到关键的算法部分,题目主要的思路就是将输入的字符进行加密与给定的字符串比较,但是算法比较复杂,不过其实不用太过关注算法的过程,只要将伪代码修改一下就可以作为逆向算法的代码。

最终修改的代码如下:

#include<stdio.h>
#include<windows.h>

char key[]="\xDE\xAD\xBE\xEF";

int encrypt(char *ptr, char *key)
{
  int v4;
  int result;
  unsigned int bit1=0,bit2=0;

  memcpy(&v4,&ptr,4);
  bit1 = *(char *)ptr;
  bit2 = *(char *)(ptr + 1);
  v4 = 217;
  do
  {
    v4 += 71;
    bit2 -= (v4 + *(BYTE *)(key + (((char)v4 >> 11) & 3))) ^ (bit1 + (16 * (char)bit1 ^ ((char)bit1 >> 5)));
    bit1 -= (bit2 + (((char)bit2 >> 5) ^ 16 * (char)bit2)) ^ (v4 + *(BYTE *)(key + (v4 & 3)));


  }
  while ( (BYTE)v4 != 185 );

  *(BYTE *)ptr = bit1;
  *(BYTE *)(ptr + 1) = bit2;
  return result;
}

int main()
{
    char en[]="\xBF\xF1\x6A\x2C\x10\x0B\x16\x59\xBA\x3A\x8C\x49\x05\x1B\x04\xE2\x85\xD5\xC2\xFC\xD7\x9B\xE9\x42\x00";
    int len=strlen(en);
    char *ptr;
    char *final;
  int result = len / 2;
  if ( len / 2 > 0 )
  {
    ptr = en;
    final = en + 2 * result;
    do
    {
      result = encrypt(ptr, key);
      ptr += 2;
    }
    while ( ptr != final );
  }
  printf("%s\n",en);
    return 0;
}

##

文章目录
  1. 1. ZCTF2017-reeverse
    1. 1.1. Reverse200-EasyReverse
|