CodeEngn basic 17(write up)

2023. 11. 19. 21:18리버싱

안녕하세요. 오랜만 입니다. 요즘 이것 저것 준비하면서 바쁘게 지내서 포스팅을 많이 못했네요.. 최근에 CodeEngn문제 다시 풀어보고 있는데 리버싱을 처음접하는 사람이 조금 hard하다라는 문제 위주로 포스팅 진행하고 있습니다. 

다음사진은 문제입니다.

이 문제를 보면 KEY값 주어지고 NAME이 한자리이라고 하네요.. 그리고 NAME값의 MD5 해쉬값을 구하라고 하네요..

음 처음 봤을 때 A-Z,a-z,0~9이런식으로 무작위 대입하면 답이 나올꺼라고 생각하고 답을 구했는데 이 방법은 리버싱 실력향상에 도움이 되지 못합니다. 따라서 내부적인 코드를 분석해보겠습니다.

실행 화면

KEY값은 BEDA-2F56-BC4F4368-8A71-870B입니다. 

 올리 디버거를 이용해 내부 STRING을 서치 합니다.

다음 코드에서 0045BB24에 CMP구문이 보이는데 디버깅 결과 EAX에 제가 입력한 NAME이 들어갑니다. 근데 문제에서 NAME은 한 자리라 했으니까 3을 1로 EDIT해서 패치해줘야 합니다. 패치 과정은 다 아실 거라고 생각하고 패스하겠습니다.

CMP EAX,3 -> CMP EAX,1로 바꿔주세요.

바꾼 부분을 다시 디버깅하면 마지막 성공분기로 갈때 CALL 046B850에서 NAME을 이용해서 KEY값을 생성합니다. 이부분을 스텝 인투(F7)하겠습니다.

이제 이 이부분을 볼수 있는데 여기서 ESI레지스터 입력값이 들어있고 이것을 통해 연산합니다.

이 과정을 통해 BEDA-2F56-BC4F4368-8A71-870B 중 BEDA값을 생성합니다. 그러면 BEDA값하고 포함되는

코드를 작성하면 됩니다.

정리하면 

ESI(입력값)+=EDX
ESI = ESI * 0x772
EDX = ESI
EDX = EDX * ESI
ESI = ESI +EDX
ESI = ESI | ESI
ESI = ESI * 0x474
ESI = ESI + ESI
EDX = ESI

이렇게 됩니다.  이것을 이용해서 C#으로 코드를 작성해보겠습니다.

먼저 ASCII코드를 이용해서 A-Z, a-z까지의 문자를 불러오고 배열에 저장합니다. 그리고 연산을 통해 key값이 포함되는 배열의 i번째를 출력해 NAME을 알아냅니다.

 

using System;

namespace basic17
{
    class Program
    {
        static void Main(string[] args)
        {
            char[] array = new char[52];
            ulong[] hexarray = new ulong[52];
            string key = "BEDA";
            ulong d;
            int c = 65;

            for(int i=0; i<26; i++)
            {
                array[i] = (char)c;

                c++;
            }
            c += 6;
            for(int i=26; i<52; i++)
            {
                array[i] = (char)c;
                c++;
            }

            for(int i=0; i<52; i++)
            {
                hexarray[i] = (ulong)array[i];
                hexarray[i] *= 0x772;
                d = hexarray[i];
                hexarray[i] = d*hexarray[i];
                hexarray[i] = hexarray[i] + d;
                hexarray[i] |= hexarray[i];
                hexarray[i] *= 0x474;
                hexarray[i] += hexarray[i];

                Console.WriteLine("{0} : {1}",array[i],hexarray[i].ToString("X")); //x X대 소문자

                if (hexarray[i].ToString("X").Contains(key))
                    Console.WriteLine("name = {0}", array[i]);

            }

        }
    }
}

이제 name이 F라는 것을 아실 수 있습니다.

이것의 md5 hash값은 800618943025315F869E4E1F09471012입니다.

이상 읽어주셔서 감사합니다.

'리버싱' 카테고리의 다른 글

ImagePrc(reversing.kr) write up  (1) 2023.12.04
codeengn.com (advance 06)  (1) 2023.12.04
Position(reversing.kr) write-up  (1) 2023.11.19
reversing.kr CSHOP풀이  (1) 2023.11.13
Reversing.kr ransomeware  (0) 2023.11.13