문제 설명

문제 정보

  • 문제 이름 : secret message
  • 문제 유형 :

문제 풀이

문제 분석

main 함수

undefined8 main(void)
 
{
  long lVar1;
  int iVar2;
  size_t sVar3;
  undefined8 correct;
  long in_FS_OFFSET;
  char input [264];
  
  lVar1 = *(long *)(in_FS_OFFSET + 0x28);
  __isoc99_scanf("%63s",input);
  sVar3 = GetStrLen(input);
  if (sVar3 == 0x20) {
    XORWithParam2(input,&data_1);
    IncWithParam2(input,31);
    DecWithParam2(input,90);
    XORWithParam2(input,&data_2);
    DecWithParam2(input,77);
    IncWithParam2(input,-13);
    XORWithParam2(input,&data_3);
    iVar2 = memcmp(input,answer,0x20);
    if (iVar2 == 0) {
      puts("Correct!");
      correct = 0;
    }
    else {
      puts("your input is wrong x(");
      correct = 1;
    }
  }
  else {
    puts("your input length is wrong x(");
    correct = 1;
  }
  if (lVar1 != *(long *)(in_FS_OFFSET + 0x28)) {
                    /* WARNING: Subroutine does not return */
    __stack_chk_fail();
  }
  return correct;
}
 

FUN_004011ef

void XORWithParam2(char *input, char *param_2) {
  size_t sVar1;
  int local_14;
  
  sVar1 = GetStrLen(param_2);
  for (local_14 = 0; local_14 < 0x20; local_14 = local_14 + 1) {
    input[local_14] = param_2[(ulong)(long)local_14 % sVar1] ^ input[local_14];
  }
  return;
}
 

두 매개변수 배열에 xor를 연산을 진행함.

FUN_00401263

void IncWithParam2(char *input, char num) {
  int local_c;
  
  for (local_c = 0; local_c < 0x20; local_c = local_c + 1) {
    input[local_c] = num + input[local_c];
  }
  return;
}

해당 코드를 분석해 보면 input 이라는 문자열에 모든 문자값에 num이라는 값을 덧하는 코드입니다.

FUN_004012b0

void DecWithParam2(char *input, char num) {
  int i;
  
  for (i = 0; i < 0x20; i = i + 1) {
    input[i] = input[i] - num;
  }
  return;
}

해당 코드를 분석해 보면 input 이라는 문자열에 모든 문자값에 num이라는 값을 뺴는 코드입니다.

역산 코드

encrypt_data = [0xf8, 0xe0, 0xe6, 0x9e, 0x7f, 0x32, 0x68, 0x31, 0x05, 0xdc,
                0xa1, 0xaa, 0xaa, 0x09, 0xb3, 0xd8, 0x41, 0xf0, 0x36, 0x8c, 
                0xce, 0xc7, 0xac, 0x66, 0x91, 0x4c, 0x32, 0xff, 0x05, 0xe0, 
                0xd9, 0x91]
 
data1 = [0xde, 0xad, 0xbe, 0xef]
data2 = [0xef, 0xbe, 0xad, 0xde]
data3 = [0x11, 0x33, 0x55, 0x77, 0x99, 0xbb, 0xdd]
 
def XOR_FUNC_REV(output_data, num):
    for i, value in enumerate(output_data):
        output_data[i] ^= num[i % len(num)]
 
def ADD_FUNC_REV(output_data, num):
    for i, value in enumerate(output_data):
        output_data[i] -= num
 
def SUB_FUNC_REV(output_data, num):
    for i, value in enumerate(output_data):
        output_data[i] += num
 
if __name__ == "__main__":
    XOR_FUNC(encrypt_data, data3)
    ADD_FUNC(encrypt_data, -13)
    SUB_FUNC(encrypt_data, 77)
    XOR_FUNC(encrypt_data, data2)
    SUB_FUNC(encrypt_data, 90)
    ADD_FUNC(encrypt_data, 31)
    XOR_FUNC(encrypt_data, data1)
 
    for i in encrypt_data:
        print(chr(i % 128), end='')

트러블 슈팅

1. chr 유니 코드 출력 문제

33번째 줄에서 chr()를 이용해서 i 값을 문자로 변환해 준다. 이때 chr() 함수는 숫자를 유니코드로 변환해 주기때문에 128을 넘길 경우 이상한 값이 출력됩니다.

따라서 다음과 같은 코드로 실행될 경우 아래와 같이 이상한 문자가 출력됩니다.

print(chr(i), end='')