-榮-

[CodeEngn] Advance RCE L07 본문

CodeEngn/Advance

[CodeEngn] Advance RCE L07

xii.xxv 2021. 4. 4. 22:06

● CodeEngn Advance RCE L07 문제

 

CodeEngn Advance RCE L07

 

◎ 파일 실행 화면

[그림 1] 파일 실행 화면 및 잘못된 Serial Check 시 변화 없음

 

◎ 패킹 및 난독화 여부 확인

[그림 2] exeinfo PE - .NET 확인

 


 

● CodeEngn Advance RCE L07 풀이

 

[그림 3] dotPeek / 07.exe (Advance RCE L07 실행파일 - SpareTimrKeygenme)

 

dotPeek에 Advance RCE L07 실행파일을 올리고 [그림 4]의 문자열을 찾았습니다.

[그림 4] IF문과 성공 MessageBox 구문

 

If문의 조건 3가지(this.vxzzz(this.yreee, this.ewrrr, 2415736773U, fsfsdf) / (int) this.yreee[2] == (int) hashCode / (int) this.yreee[3] == (int) num1)가 참이 되는 값이 Advance RCE L07의 답입니다.

[그림 5] IF문과 성공 MessageBox

 

세 번째 단락 Serial을 00000000부터 ffffffff까지 넣어 If문의 조건 3가지를 만족하는 값을 일 경우 출력하는 코드를 추가하여 답을 찾아봅시다. 우선 코드를 수정하기 위해 Export to Project 해줍니다.

[그림 6] 디컴파일 코드 추출

 

[그림 7] Visual Stodio에서 If문과 성공 문자열이 있는 함수

 

함수의 내용을 파악해 보면 아래와 같습니다.

        private void button1_Click(object sender, EventArgs e)
        {
            string str1 = "";
            string str2 = "";
            string str3 = "";
            ytrewq ytrewq = new ytrewq();
            if (this.textBox1.Text.Length < 5 || this.textBox1.Text.Length > 27 || (this.textBox2.Text.Length != 26 || this.textBox2.Text[8] != '-') || this.textBox2.Text[17] != '-')
                return; //Name의 길이는 5보다 크도 27보다 작아야하며, Serial의 길이는 26이여야 하고 9번째와 18번째는 '-'이여야 한다.
            for (int index = 0; index < 8; ++index) //Serial의 1번째부터 8번째까지의 문자를 가져온다.
                str1 += (String)(object)this.textBox2.Text[index];
            uint uint32_1 = Convert.ToUInt32(str1, 16);  //가져온 문자열을 16진수로 uint32_1에 넣는다.
            for (int index = 9; index < 17; ++index) //Serial의 10번째부터 17번째까지의 문자를 가져온다.
                str2 += (String)(object)this.textBox2.Text[index];
            uint uint32_2 = Convert.ToUInt32(str2, 16);  //가져온 문자열을 16진수로 uint32_2에 넣는다.
            for (int index = 18; index < 26; ++index) //Serial의 18번째부터 26번째까지의 문자를 가져온다.
                str3 += (String)(object)this.textBox2.Text[index];
            uint uint32_3 = Convert.ToUInt32(str3, 16);  //가져온 문자열을 16진수로 uint32_3에 넣는다.
            // 밑으로는 암호화(?)
            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)
                return;  //맞는 Serial이면 Congratulations, meta!를 MessageBox로 출력한다.
            int num2 = (int)MessageBox.Show("Congratulations, mate!" + i, "Fine!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            }

 

이 Check 버튼 함수에 00000000부터 ffffffff까지 넣어 If문의 조건 3가지를 만족하는 값을 일 경우 출력하는 코드를 추가하면 아래와 같아집니다.

        private void button1_Click(object sender, EventArgs e)
        {
            string str1 = "";
            string str2 = "";
            string str3 = "";
            ytrewq ytrewq = new ytrewq();
            if (this.textBox1.Text.Length < 5 || this.textBox1.Text.Length > 27 || (this.textBox2.Text.Length != 26 || this.textBox2.Text[8] != '-') || this.textBox2.Text[17] != '-')
                return;
            for (int index = 0; index < 8; ++index)
                str1 += (char)(object)this.textBox2.Text[index];
            uint uint32_1 = Convert.ToUInt32(str1, 16);
            for (int index = 9; index < 17; ++index)
                str2 += (char)(object)this.textBox2.Text[index];
            uint uint32_2 = Convert.ToUInt32(str2, 16);
            for (int index = 18; index < 26; ++index)
                str3 += (char)(object)this.textBox2.Text[index];
            //uint uint32_3 = Convert.ToUInt32(str3, 16); //기존 코드
            
            for (uint i = 0; i < 0xffffffff; i++)
            {	//18~26까지의 16진수를 00000000~ffffffff까지 넣어서 정답 출력
                uint uint32_3 = 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!" + i, "Fine!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                break;
            }

 

수정한 코드를 실행하면 [그림 8]의 결과 화면이 뜹니다.

[그림 8] 수정한 코드 결과 화면

 

코드 수행은 엄청 오래 걸립니다. 따라서 저는 30분 정도 기다리다가 답을 찾아서 그 주변부터 함수를 돌렸습니다.(6시간 정도 걸린다는 말이 있어요...)

[그림 9] 실제로 돌린 For문

 

나온 결과를 16진수로 변환하면 Advance RCE L07의 답이 나옵니다.

[그림 10] 16진수 변환

 


 

● CodeEngn Advance RCE L07 확인

 

[그림 11] Congratulations, mate!

 

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

[CodeEngn] Advance RCE L09  (0) 2021.04.05
[CodeEngn] Advance RCE L08  (0) 2021.04.05
[CodeEngn] Advance RCE L06  (0) 2021.04.02
[CodeEngn] Advance RCE L05  (0) 2021.04.02
[CodeEngn] Advance RCE L04 Serial 생성 분석  (0) 2021.04.02