본문 바로가기

Wargame/▷ Reversing.kr

[Reversing.kr] HateIntel

Reversing.kr HateIntel (150pt)


Reversing.kr 문제들은 지금 너무 어려워서 놓고 있다가 친구가 올클못했냐고 놀려서 바로 잡게되었다.

포인트 점수대로 풀고 있는데 autohotkey2 130pt.. 에서 막혀가지고 HateIntel 로 건너뛰었다.


해당 문제 Readme 를 읽어보면 password 를 찾으라고 나온다. 

파일 종류를 보면 HateIntel: Mach-O arm executable 로 나오는데 arm 이길래 IDA로 분석하였다.


봐야할 함수는 총 3개로 처음에 입력을 받고 암호화 후 byte_3004[28] 의 값들과 비교하면 된다. 


[pseudo 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
#pragma warning(disable: 4996)
#include <stdio.h>
#include <string.h>
 
int byte_3004[] = { 0x440xF60xF50x570xF50xC60x960xB6
0x560xF50x140x250xD40xF50x960xE60x370x470x27
0x570x360x470x9630xE60xF30xA30x92};
 
int sub_2494(int v1)
{
    v1 *= 2;
    if (v1 & 0x100)
        v1 |= 1;
 
    return v1;
}
 
void sub_232C(char v1[], int v2)
{
    int result = 0;
    for (int i = 0; i < v2; i++)
    {
        for (int j = 0; ; j++)
        {
            result = strlen(v1);
            if (result <= j)
                break;
            v1[j] = sub_2494(v1[j]);
        }
    }
}
 
int main()
{
    unsigned char v1[30= { 0, };
    int v2 = 4;
    printf("Input key : ");
    scanf("%s", v1);
    int v3 = strlen(v1);
 
    sub_232C(v1, v2);
    for (int i = 0; i < v3; i++)
    {
        if (v1[i] != byte_3004[i])
        {
            puts("Wrong Key!");
            return 0;
        }
    }
    puts("Correct Key!");
    return 0;
}
cs


[HateIntel_Solve.c]

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
#include <stdio.h>
 
int sub_2494(int v1)
{
    v1 *= 2;
    if (v1 & 0x100)
        v1 |= 1;
 
    return (unsigned __int8)v1;
}
 
int main()
{
    int byte_3004[] = { 0x440xF60xF50x570xF50xC60x960xB6
0x560xF50x140x250xD40xF50x960xE60x370x470x270x57
0x360x470x9630xE60xF30xA30x92};
 
    int v1[30= { 0, };
    
    int c = 0;
    for (int i = 0; i < 29; i++)
    {
        for (int brute = 0; brute <= 127; brute++)
        {
            c = brute;
            for (int j = 0; j < 4; j++
            {
                c = sub_2494(c);
            }
 
            if (c == byte_3004[i]) 
            {
                printf("%c", brute);
                break;
            }
        }
    }
    puts("");
    return 0;
}
 
cs


'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] Position  (2) 2017.05.17