CodeEngn Write Up/Advance

CodeEngn Advance RCE L07 Write Up

서원근양학계정 2022. 5. 28. 23:56

Name이 CodeEngn일때 Serial은 28BF522F-A5BE61D1-XXXXXXXX 이다.
XXXXXXXX 를 구하시오

https://ch.codeengn.com/

 

CodeEngn.com [코드엔진]

코드엔진은 국내 리버스엔지니어링 정보공유를 위해 2007년 부터 리버스엔지니어링 컨퍼런스 및 세미나, 워크숍을 현업 실무자들과 함께 운영하고 있는 비영리 커뮤니티입니다.

ch.codeengn.com

 

먼저 문제 파일을 실행시키도록 하겠습니다.

 

아무 값이나 넣어보도록 하겠습니다.

 

상당히 곤란하군요... 이것도 문제의 일부인 걸까요?

주어진 시리얼을 침착하게 다시 확인해보니 숫자와 A와 F사이의 영어 알파벳만 사용된 것을 알 수 있습니다.

저도 그런 방식을 따라서 다시 입력해보도록 하겠습니다.

 

아무런 반응이 없네요...

상당히 무례한 프로그램입니다.

어쨌든 ExeinfoPE로 더 자세히 분석해보겠습니다.

 

C#으로 짜여진 프로그램이라는 사실을 확인할 수 있습니다.

OllyDBG는 C#으로 만들어진 프로그램을 분석할 수 없습니다.

이유는 저도 잘 모르겠네요.

어쨌든 C#으로 만들어진 프로그램을 디컴파일할 수 있는 dotPeek을 이용하도록 하겠습니다.

 

이 부분이 성공메시지를 출력하는 부분이라고 추정되는 부분입니다.

여기서 분석할 수도 있겠지만 더 용이한 분석을 위해서 Visual Studio에서 분석해보도록 하겠습니다.

 

Visual Studio에서 열었더니 이런 창이 뜨네요.

 

자세히는 모르겠으니 확인을 눌러줍니다.

그리고 Visual Studio에서 실행시켰더니 오류가 발생합니다.

 

(IntPtr)을 지워줍니다.

이 부분을 0xFFFFFFFF로 바꿔줍니다.

그리고 실행시켜보았습니다.

 

또 오류가 발생하네요;;;

 

(string)을 Convert.ToString으로 바꿔줍니다.

모두 세 군데에서 이 예외가 발생하는데 모두 고쳐줍시다.

그러면 프로그램이 아무 문제없이 실행됩니다.

감동적이네요.

 

이제 본격적으로 문제를 풀어보겠습니다.

코드가 복잡하니 직접 분석하는 방식보다는 무차별 대입을 통해서 플래그를 구해보도록 하겠습니다.

코드는 이렇게 짜보았습니다.

private void button1_Click(object sender, EventArgs e)
        {
            string str1 = "";
            string str2 = "";
            string str3 = "";

            ytrewq ytrewq = new ytrewq();
            //for (int index = 0; index < 8; ++index)
            //      {
            //          str1 += Convert.ToString((object)this.textBox2.Text[index]);
            //          //str1 += (string) (object) this.textBox2.Text[index];
            //      }
            str1 = "28BF522F";
            uint uint32_1 = Convert.ToUInt32(str1, 16);
            //for (int index = 9; index < 17; ++index)
            //  str2 += Convert.ToString((object) this.textBox2.Text[index]);
            str2 = "A5BE61D1";
            uint uint32_2 = Convert.ToUInt32(str2, 16);
            //for (int index = 18; index < 26; ++index)
            //  str3 += Convert.ToString((object) this.textBox2.Text[index]);

            for (long i = 0x00000000; i <= 0xFFFFFFFF; i++)
            {
                uint uint32_3 = Convert.ToUInt32(i);
                uint num1 = ytrewq.qwerty(Form1.dfgsf(this.textBox1.Text));
                uint hashCode = (uint)this.textBox1.Text.GetHashCode();
                uint fsfsdf = uint32_3 ^ hashCode;
                this.yreee[0] = uint32_1;
                this.yreee[1] = uint32_2;
                this.yreee[2] = uint32_1;
                this.yreee[3] = uint32_2;
                if (!this.vxzzz(this.yreee, this.ewrrr, 2415796773U, fsfsdf) || (int)this.yreee[2] != (int)hashCode || (int)this.yreee[3] != (int)num1)
                    continue;
                int num2 = (int)MessageBox.Show("Congratulations, mate! Flag: " + i, "Fine!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            }
            Application.Exit();
        }

 

많은 시간이 흐른 뒤...

 

이제 이 값을 16진수로 바꾼 값을 입력해보겠습니다.

기대되는 순간이네요.

 

Check버튼을 눌러도 아무 일도 일어나지 않습니다.

상당히 당황스럽네요.

그래서 검색을 해봤더니 프로그램에 사용된 GetHashCode함수가 32비트 환경과 64비트 환경에서 다른 리턴 값을 가진다고 하네요.

VMware를 이용해서 32비트 환경에서 이 값을 입력해보겠습니다.

 

Flag: 11E051D1

'CodeEngn Write Up > Advance' 카테고리의 다른 글

CodeEngn Advance RCE L09 Write Up  (7) 2022.06.01
CodeEngn Advance RCE L08 Write Up  (3) 2022.05.29
CodeEngn Advance RCE L06 Write Up  (2) 2022.05.19
CodeEngn Advance RCE L05 Write Up  (2) 2022.05.19
CodeEngn Advance RCE L04 Write Up  (4) 2022.05.18