본문 바로가기

Wargame/▷ xcz.kr

[xcz.kr] prob34 - Get the key, If You Can

[xcz.kr prob34]

Get the key, If You Can 라는 제목의 xcz.kr 34번 문제입니다.



파일을 다운로드 해보면 두개의 파일이 나옵니다.  exe파일을 먼저 실행 해보았습니다.



단순한 크랙같이 보입니다. 정확한 ID와 PW를 입력해주면 답이 나오겠네요



dat 파일을 열어보니 좋은 정보가 들어있는걸 알수있습니다. 정리해보면

guest : 7C685308952F1AC56FD3CAA2B2CB2D5A : 01541

admin : A0F60D70FAD9DC9846D971FD61D2B7A0 : 31337

이런 정보가 들어있다는 것을 알수있습니다. 보기에 guest 나 admin 같은 경우에는 id값으로 보입니다. 

하지만 뒤에 있는 hash값과 숫자는 어디에 쓰일지 알아보도록 하겠습니다.



exe파일은 C#으로 코딩되어 있습니다 올리디버거로는 못열겠네요 .

분석환경으로 저는 C# 디컴파일 툴인 JetBrains dotPeek을 사용하였습니다.



문제파일의 C# 디컴파일 소스 입니다. 핵심코드만 설명하겠습니다.

1. string[] strArray = streamReader.ReadLine().Split(":".ToArray<char>());

:를 기준으로 문자열(배열)을 나눕니다 

ID 값은 admin 이니 위에 있던 값 admin : A0F60D70FAD9DC9846D971FD61D2B7A0 : 31337 을 기준으로 split 하면

strArray[0] = "admin" 

strArray[1] = "A0F60D70FAD9DC9846D971FD61D2B7A0"

strArray[2] = "31337"  이 됩니다.


2. strArray[0] == this.textBox1.Text

자신이 프로그램 첫줄에 입력한 값과 strArray[0]이 같은지 확인합니다


3. MD5CryptoServiceProvider().ComputeHash(Encoding.ASCII.GetBytes(strArray[0] + this.textBox2.Text + strArray[2]))

합친 값을 바이트타입으로 바꿔준 후에 아스키코드 값으로 변형해 MD5 암호화해줍니다.

stringBuilder.Append(num2.ToString("X2"));     후에 foreach 반복문을 통해 16진법(2자릿수 대문자)로 변경해줍니다.


4. stringBuilder.ToString() == strArray[1]    암호화 한 hash값과 strArray[1]의 값이 동일하면 최종적으로 성공문을 띄워줍니다.

후에  this.textBox1.Text == "admin" 코드를 통해 크랙의 첫번째 줄에는 admin 값이 들어가야 되는 것을 알수 있습니다.

마지막으로 크랙의 두번째 줄에 들어가야할 this.textBox2.Text의 값만 알면 문제를 풀수 있습니다.


간단히 Brute Force 해주었습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System;
using System.Text;
using System.Security.Cryptography;
 
namespace ConsoleApplication42
{
    class Program
    {
        static void Main(string[] args)
        {
            int i, j, k, z, l;
            String[] a = { "a""b""c""d""e""f""g""h""i""j""k""l""m""n""o""p""q""r""s""t""u""v""w"
"x""y""z""0""1""2""3""4""5""6""7""8""9" };
            
            for(i=0; i<36; i++)
            {
                for(j=0; j<36; j++)
                {
                    for(k=0; k<36; k++)
                    {
                        for(z=0; z<36; z++)
                        {
                            for(l=0; l<36; l++)
                            {
                                String b = a[i] + a[j] + a[k] + a[z] + a[l];
                                StringBuilder stringBuilder = new StringBuilder();    
                                foreach (byte num2 in new MD5CryptoServiceProvider().ComputeHash(Encoding.ASCII.GetBytes("admin" + b + "31337")))
                                    stringBuilder.Append(num2.ToString("X2"));
                                if (stringBuilder.ToString() == "A0F60D70FAD9DC9846D971FD61D2B7A0")
                                {
                                    Console.WriteLine("key : " + b);
                                    Console.ReadKey();
                                    Environment.Exit(0);
                                }
                            }
                        }
                    }
                }
            }
            Console.WriteLine("Not find..");
            Console.ReadKey();
            Environment.exit(0);
        }
    }
}
 
cs




입력칸 안에 this.textBox2.Text 값을 넣어주면 Key 값이 나옵니다.

'Wargame > ▷ xcz.kr' 카테고리의 다른 글

[xcz.kr] prob25 XCZ Captcha!  (0) 2018.02.08
[xcz.kr] prob26 ju57_ENc0dE  (0) 2018.02.08
[xcz.kr] prob19 - Revershit!  (0) 2017.01.30
[xcz.kr] prob18 - Web Basic  (0) 2017.01.30
[xcz.kr] prob17 - Password Recover...  (0) 2017.01.29