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 = [0x41, 0x69, 0x6e, 0x45, 0x6f, 0x61] thirdchar = [0x2ef, 0x2c4, 0x2dc, 0x2c7, 0x2de, 0x2fc] masterarray = [0x1d7, 0xc, 0x244, 0x25e, 0x93, 0x6c] 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 3 * (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 + 1 == 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 = [0x41, 0x69, 0x6e, 0x45, 0x6f, 0x61] thirdchar = [0x2ef, 0x2c4, 0x2dc, 0x2c7, 0x2de, 0x2fc] masterarray = [0x1d7, 0xc, 0x244, 0x25e, 0x93, 0x6c] 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[3 * i]) * (j ^ xor_list[3 * i + 1]) % third == masterarray[i]: flag += (chr(first) + chr(j) + chr(third ^ xor_list[3 * 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 |