본문 바로가기
해킹&보안/악성코드 및 치트

Reverse Engineering 5

문제

 
풀어보겠습니다.
 

데이터 섹션

해석해보면
사용자로부터 입력을 요청하는데 형식지정자인 %256을 사용하여 최대 256자의 문자를 받고, 입력이 올바를 때는correct, 입력이 잘못되었을때는 wrong을 출력하는 느낌입니다.
 
메인함수로 가서 디컴파일링을 해보겠습니다.

int __fastcall main(int argc, const char **argv, const char **envp)
{
  char v4[256]; // [rsp+20h] [rbp-118h] BYREF

  memset(v4, 0, sizeof(v4));
  sub_1400011C0("Input : ", argv, envp);
  sub_140001220("%256s", v4);
  if ( (unsigned int)sub_140001000(v4) )
    puts("Correct");
  else
    puts("Wrong");
  return 0;
}

데이터 섹션에서 본 것과 같은 내용이 보기 쉽게 담겨있습니다. 
sub_140001000함수를 들어가 무슨 내용이 들어있는지 확인해보겠습니다.
 

1 __int64 __fastcall sub_140001000(__int64 a1)
2 {
3   int i; // [rsp+0h] [rbp-18h]
4 
5   for ( i = 0; (unsigned __int64)i < 0x1C; ++i )
6   {
7     if ( ((unsigned __int8)(16 * *(_BYTE *)(a1 + i)) | ((int)*(unsigned __int8 *)(a1 + i) >> 4)) != byte_140003000[i] )
8      return 0i64;
9   }
10  return 1i64;
11 }

sub_140001000내부 모습입니다.
5라인에서  0x1c인 것을 보니 28번 반복한다는 것을 볼 수 있다, 즉 길이는 28인 것을 알 수 있었습니다.

더보기

[  1c(16)  =   28(10)   ]  =  16진수 1c는 10진수 28과 같다

연산 과정은 7라인에 나와있습니다.

비교값

byte_140003000에 진입하면 나오는 이 값들이 우리가 비교해야할 값인데 코드를 짜서 진행해보겠습니다.
 

c언어로 코드를 짜보려 했지만 DEV C++ 이슈가 생겨서 파이썬으로 짜봤습니다.
이대로 실행해보면 

더보기
플래그 값이 나오게 됩니다.

 

해당 값으로 넣어보면 정답이 됩니다.

'해킹&보안 > 악성코드 및 치트' 카테고리의 다른 글

Reverse Engineering 7  (0) 2024.05.11
Reverse Engineering 6  (0) 2024.05.10
Reverse Engineering 4  (1) 2024.03.27
Reverse Engineering 3  (2) 2024.03.25
Reverse Engineering 2  (0) 2024.03.25