re 학습 노트 (30) HGAME 2020 - re - Level - Week 1 - bitwiseoperation2

HGAME2020-re-Level-Week1-bitwise_operation 2 초보 자 하나, 오류 가 있 으 면 지적 해 주세요. 감사합니다!!
개인 블 로그: 제목 링크 진입 클릭: HGAME 2020 - re - Level - Week 1 - bitwiseoperation 2 제목 다운로드: 클릭 하여 다운로드
제목 설명
세 번 째 C 언어 교육 의 숙제 인 '비트 연산' 을 기억 하 십 니까?이것 은 2.0 학습 자료 입 니 다.http://q42u2raim.bkt.clouddn.com/bitwise-hint1-xor.png 제목 주소http://q42u2raim.bkt.clouddn.com/bitwise_operation2_9d9dc26c1359ec66
해제
분석 문제
void __fastcall __noreturn main(__int64 a1, char **a2, char **a3)
{
  signed int i; // [rsp+4h] [rbp-6Ch]
  signed int j; // [rsp+8h] [rbp-68h]
  signed int k; // [rsp+Ch] [rbp-64h]
  char v6[8]; // [rsp+10h] [rbp-60h]
  __int64 data_1; // [rsp+20h] [rbp-50h]
  char v8; // [rsp+28h] [rbp-48h]
  __int64 data_2; // [rsp+30h] [rbp-40h]
  char v10; // [rsp+38h] [rbp-38h]
  char user_input[40]; // [rsp+40h] [rbp-30h]
  unsigned __int64 v12; // [rsp+68h] [rbp-8h]

  v12 = __readfsqword(0x28u);
  sub_4007E6();
  v6[0] = 76;
  v6[1] = 60;
  v6[2] = -42;
  v6[3] = 54;
  v6[4] = 80;
  v6[5] = -120;
  v6[6] = 32;
  v6[7] = -52;
  __isoc99_scanf("%39s", user_input);
  if ( strlen(user_input) == 39
    && user_input[0] == 'h'
    && user_input[1] == 'g'
    && user_input[2] == 'a'
    && user_input[3] == 'm'
    && user_input[4] == 'e'
    && user_input[5] == '{'
    && user_input[38] == '}' )
  {
    data_1 = 0LL;
    v8 = 0;
    data_2 = 0LL;
    v10 = 0;
    sub_400616(&data_1, &user_input[6]);       //     6~21
    sub_400616(&data_2, &user_input[22]);      //     22~38
    for ( i = 0; i <= 7; ++i )                  //     
    {
      *(&data_1 + i) = ((*(&data_1 + i) & 224) >> 5) | 8 * *(&data_1 + i);
      *(&data_1 + i) = *(&data_1 + i) & 0x55 ^ ((*(&data_2 + 7 - i) & 0xAA) >> 1) | *(&data_1 + i) & 0xAA;
      *(&data_2 + 7 - i) = 2 * (*(&data_1 + i) & 0x55) ^ *(&data_2 + 7 - i) & 0xAA | *(&data_2 + 7 - i) & 0x55;
      *(&data_1 + i) = *(&data_1 + i) & 0x55 ^ ((*(&data_2 + 7 - i) & 0xAA) >> 1) | *(&data_1 + i) & 0xAA;
    }
    for ( j = 0; j <= 7; ++j )
    {
      *(&data_1 + j) ^= v6[j];                  //     
      if ( *(&data_1 + j) != byte_602050[j] )   //     
      {
        puts("sry, wrong flag");
        exit(0);
      }
    }
    for ( k = 0; k <= 7; ++k )
    {
      *(&data_2 + k) ^= *(&data_1 + k) ^ v6[k]; //     
      if ( *(&data_2 + k) != byte_602060[k] )   //     
      {
        puts("Just one last step");
        exit(0);
      }
    }
    puts("Congratulations! You are already familiar with bitwise operation.");
    puts("Flag is your input.");
    exit(0);
  }
  puts("Illegal input!");
  exit(0);
}

대체 절 차 는 사용자 가 39 자 를 입력 하 는 것 이다.그리고 길 이 를 확인 하 십시오. 앞의 여섯 글자 가 "hgame {" 인지, 마지막 문자 가 "}" 인지, 그리고 sub 인지 확인 하 십시오.400616 은 매번 16 개의 문 자 를 8 개의 문자 로 암호 화 합 니 다.그리고 한 무더기 의 비트 연산 을 한 후에 두 개의 이 또는 그 다음 에 비교 하 였 다.
exp
#include 
int main()
{
	int i;
	char flag[40] = { 'h','g','a','m','e','{' ,0,0 };
	flag[38] = '}';
	unsigned char data0[] = { 76,60,-42,54,80,-120,32,-52 };
	int  j, k;
	char data1[9] = "e4sy_Re_";
	char data2[9] = "Easylif3";
	unsigned char data_1[9] = { 0 }, data_2[9] = {0};
	unsigned char input1[9] = { 0 }, input2[9] = {0};
	for (i = 0; i < 8; i++)
		data_2[i] = data2[i] ^ data0[i] ^ data1[i];
	for (i = 0; i < 8; i++)
		data_1[i] = data1[i] ^ data0[i];
	for (i = 0; i < 8; i++)//    
	{
		for (j = 0; j < 256; j++)
		{
			for (k = 0; k < 256; k++)
			{
				int a1 = j, a2 = k;
				a1 = ((a1 & 0xE0) >> 5) | 8 * a1;
				a1 = a1 & 0x55 ^ ((a2 & 0xAA) >> 1) | a1 & 0xAA;
				a2 = 2 * (a1 & 0x55) ^ a2 & 0xAA | a2 & 0x55;
				a1 = a1 & 0x55 ^ ((a2 & 0xAA) >> 1) | a1 & 0xAA;
				if (a1 == data_1[i] && a2 == data_2[7 - i])
				{
					input1[i] = j;
					input2[7 - i] = k;
				}
			}
		}
	}
	for (i = 0; i < 8; i++)//    
	{
		for (j = 0; j < 16; j++)
		{
			for (k = 0; k < 16; k++)
			{
				if (input1[i] == 16 * j + k)
				{
					if (j > 9)
						flag[6 + 2 * i] = j + 87;
					else
						flag[6 + 2 * i] = j + 48;
					if (k > 9)
						flag[7 + 2 * i] = k + 87;
					else
						flag[7 + 2 * i] = k + 48;
				}
				if (input2[i] == 16 * j + k)
				{
					if (j > 9)
						flag[22 + 2 * i] = j + 87;
					else
						flag[22 + 2 * i] = j + 48;
					if (k > 9)
						flag[23 + 2 * i] = k + 87;
					else
						flag[23 + 2 * i] = k + 48;
				}
			}
		}
	}
	puts(flag);
	return 0;
}

실행 되 는 flag
hgame{0f233e63637982d266cbf41ecb1b0102}

좋은 웹페이지 즐겨찾기