본문 바로가기

CTF

TUCTF 2016 Reverse for the Holy Grail

TUCTF 2016 Reverse for the Holy Grail (Reversing 350) Write up


해당 문제 main 함수 모습입니다. C++ 로 만들어진 리버싱 문제 같네요.

해당 문제는 총 두 번의 Check 로 플래그 인지 아닌지를 판단합니다.


첫번째로 validChars 함수

validChars 함수에서는       : ; < = > ? Z [ \ ] ^ _ z { | } ~ 의 문자들을 필터링 합니다.


두번째로 핵심인 stringMod 함수

                                                   

이 프로그램 동작 원리를 pseudo code 로 나타내보았습니다.


[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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
firstchar = [0x410x690x6e0x450x6f0x61]
thirdchar = [0x2ef0x2c40x2dc0x2c70x2de0x2fc]
masterarray = [0x1d70xc0x2440x25e0x930x6c]
 
 
def validchars(password):
    if not len(password):
        return 0
 
    result = 0
    for i in password:
        if (i & 0xdf- 65 > 0x19 and i != 63:
            result = -1
    return result
 
 
def stringMod(password):
    v14 = []
    v4 = 0
    v3 = 0
    if len(password):
        for i in password:
            v14.append(i)
            if * (v3 / 3== v3 and i != firstchar[v3 / 3]:
                v4 = -1
            v3 += 1
    else:
        v4 = 0
 
    xor_list = v14
    v7 = 666
    for i in range(len(xor_list)):
        xor_list[i] = v7 ^ xor_list[i]
        v7 += (v7 % 5)
 
    v11 = 0
    v9 = 0
    v10 = 1
    for i in range(len(password)):
        if v11 == 2:
            if xor_list[i] != thirdchar[v9]:
                v4 = -1
            if v10 % xor_list[i] != masterarray[v9]:
                v4 = -1
            v9 += 1
            v10 = 1
            v11 = 0
        else:
            v10 *= xor_list[i]
            if v11 + == 3:
                v11 = 0
    return v7 * v4
 
 
if __name__ == "__main__":
 
    password = bytearray(raw_input("What... is the secret password? "))
    v3 = validchars(password)
    if v3 < 0:
        exit(0)
 
    v4 = stringMod(password)
    if v4 < 0:
        exit(0)
    else:
        print "Go on. Off you go. tuctf{" + password + "}"
 
cs


[TUCTF_Reversing_350_solve.py]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
firstchar = [0x410x690x6e0x450x6f0x61]
thirdchar = [0x2ef0x2c40x2dc0x2c70x2de0x2fc]
masterarray = [0x1d70xc0x2440x25e0x930x6c]
 
flag = ""
 
xor_list = []
xor_value = 666
for i in range(18):
    xor_list.append(xor_value)
    xor_value += (xor_value % 5)
 
for i in range(6):
    first = firstchar[i]
    third = thirdchar[i]
    for j in range(128):
        if (first ^ xor_list[* i]) * (j ^ xor_list[* i + 1]) % third == masterarray[i]:
            flag += (chr(first) + chr(j) + chr(third ^ xor_list[* i + 2]))
            break
print flag
cs


1
2
3
4
What... is the secret password? 
> AfricanOrEuropean?
 
Go on. Off you go. tuctf{AfricanOrEuropean?}
cs


'CTF' 카테고리의 다른 글

[CSAW CTF 2017] tableEZ  (0) 2018.01.16
[Christmas CTF 2017] Simple_Bit  (2) 2018.01.10
제 1회 서울디지텍고등학교 청소년 해킹방어대회  (0) 2017.12.09
TUCTF 2017 write up  (0) 2017.12.03
화이트해커리그 예선 write up  (0) 2017.11.17