본문 바로가기

Wargame/▷ Reversing.kr

[Reversing.kr] Position


Reversing.kr Position 문제 입니다. 

알맞은 Name값과 Serial 값을 입력하면 풀리는 문제같네요.





ReadMe 를 읽어보니 찾는 Name의 Serial 값은 76876-77776 이며 답은 여러개가 있을수 있다고 하네요

Name의 마지막 글자는 p이고 Name의 글자수는 4글자라고 힌트를 줍니다.




올리디버거로 문제를 분석해본 결과 Correct 문과 Wrong 문 위에 있는 CALL문에서 연산코드가 진행된다는 것을 알수있었습니다.




첫번째 루프를 보니 Name값들이 a~z 범위 안인지 확인합니다.




두번째 루프를 확인해보니 Name 값들의 중복이 없는지 확인합니다.




세번째 비교 구문을 보니 Serial 글자수가 총 11글자 이며 Serial 가운데 문자가 ' - ' 인지 확인합니다.




그다음 코드는 워낙 길어서 IDA로 분석하였습니다. 

코드를 요약해보자면 Name값이랑 >>, &,+ 등을 하여 나온 값들과 Serial 각 자리숫자들과 비교합니다.

Shift연산, AND연산, ADD연산 때문에 Name값이 여러개가 생길수 있습니다

후에 간단하게 Name값을 Brute Force 해주었습니다.



[ Brute Force code ]


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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <stdio.h>
 
int main()
{
    int a[10= { 7,6,8,7,6,7,7,7,7,};
    int b[4= { 0, };
    int count = 0;
    int i, j, k;
 
    for (i = 97; i <= 122; i++)
    {
        int v8 = (i & 1+ 5;
        int v59 = ((i >> 4& 1+ 5;
        int v53 = ((i >> 1& 1+ 5;
        int v55 = ((i >> 2& 1+ 5;
        int v57 = ((i >> 3& 1+ 5;
        for (j = 97; j <= 122; j++)
        {
            int v45 = (j & 1+ 1;
            int v51 = ((j >> 4& 1+ 1;
            int v47 = ((j >> 1& 1+ 1;
            int v10 = ((j >> 2& 1+ 1;
            int v49 = ((j >> 3& 1+ 1;
 
            if (v8 + v10 == a[0])
            {
                if (v57 + v49 == a[1])
                {
                    if (v53 + v51 == a[2])
                    {
                        if (v55 + v45 == a[3])
                        {
                            if (v59 + v47 == a[4])
                            {
                                if (i != j&&!= 112 && j != 112)
                                {
                                    b[0= i;
                                    b[1= j;
                                    count++;
                                }                            
                            }
                        }
                    }
                }
            }
        }
        if (count == 1)
        {
            for (k = 97; k <= 122; k++)
            {
                int v27 = (k & 1+ 5;
                int v60 = ((k >> 4& 1+ 5;
                int v54 = ((k >> 1& 1+ 5;
                int v56 = ((k >> 2& 1+ 5;
                int v58 = ((k >> 3& 1+ 5;
 
                
                int v46 = (112 & 1+ 1;
                int v52 = ((112 >> 4& 1+ 1;
                int v48 = ((112 >> 1& 1+ 1;
                int v29 = ((112 >> 2& 1+ 1;
                int v50 = ((112 >> 3& 1+ 1;
 
                if (v27 + v29 == a[5])
                {
                    if (v58 + v50 == a[6])
                    {
                        if (v54 + v52 == a[7])
                        {
                            if (v56 + v46 == a[8])
                            {
                                if (v60 + v48 == a[9])
                                {
                                    if (i != k&&!= k &&!= 112)
                                    {
                                        b[2= k;
                                        b[3= 112;
                                        printf("%c%c%c%c\n", b[0], b[1], b[2], b[3]);
                                    }                
                                }
                            }
                        }
                    }
                }
            }
            count--;
        }
    }
}
cs


코드가 너무 지저분하다..




총 3개의 Name값들이 나오게 됩니다. 

하지만 이상하게도 3개의 Name값들중 가장 첫번째 값만 Reversing.kr auth 답으로 인정하네요..

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

[Reversing.kr] Multiplicative  (0) 2018.01.12
[Reversing.kr] WindowsKernel  (0) 2018.01.12
[Reversing.kr] Twist1  (0) 2018.01.08
[Reversing.kr] Flash Encrypt  (0) 2018.01.08
[Reversing.kr] HateIntel  (0) 2017.12.30