IDA를 활용한 정적 분석을 통해 주어진 함수를 분석하여, 올바른 입력값을 역산한다.

(1) 사전에 주어진 설명대로 main함수는 입력값을 sub_140001000 함수에 집어넣는다.
(2) 반환된 값을 if문에 넣어 참 거짓여부에 따라 Correct나 Wrong을 출력한다.
(1) v3, i는 int형으로 4바이트의 크기를 갖는다.
(2) 입력변수 문자열 a1(이하 a1)의 길이(strlen)를 v3에 할당한다.
(3) (v3+1)가 8의 배수인 경우, 0을 반환하고, Wrong이 출력될 것이다.
(4) C 표준에서 strlen은 마지막 null 문자를 세지 않으므로 Correct를 출력할 a1은 8n - 1개의 문자와 null 문자로 이뤄져 있다.
(5) a1[8n](n은 0부터)을 입력변수로 sub_1400010A0 호출
(6) memcmp 함수가 0을 반환해야한다. unk_140004000에 저장된 문자열과 a1이 같아야한다.

(1) i, j로 이중 for문을 사용하고 있다.
(2) "I_am_KEY"를 보아선 sub_1400040A0을 분석해야한다.
(3) 이중 for문의 결과값으로부터 역산한다.

파이썬은 자동으로 자료형을 변경해주므로 0xFF를 곱해서 1바이트로 맞춰주자
####ROL 함수 정의###############################################################
def __ROL__(num, count, bits=8):
return ((num << count) | (num >> (bits - count))) & ((0b1<<bits) - 1)
def __ROR__(num, count, bits=8):
return ((num >> count) | (num << (bits - count))) & ((0b1<<bits) - 1)
##### 상 수 ####################################################################
data_4020 = bytes.fromhex("63 7C 77 7B F2 6B 6F C5 30 01 67 2B FE D7 AB 76 CA 82 C9 7D FA 59 47 F0 AD D4 A2 AF 9C A4 72 C0 B7 FD 93 26 36 3F F7 CC 34 A5 E5 F1 71 D8 31 15 04 C7 23 C3 18 96 05 9A 07 12 80 E2 EB 27 B2 75 09 83 2C 1A 1B 6E 5A A0 52 3B D6 B3 29 E3 2F 84 53 D1 00 ED 20 FC B1 5B 6A CB BE 39 4A 4C 58 CF D0 EF AA FB 43 4D 33 85 45 F9 02 7F 50 3C 9F A8 51 A3 40 8F 92 9D 38 F5 BC B6 DA 21 10 FF F3 D2 CD 0C 13 EC 5F 97 44 17 C4 A7 7E 3D 64 5D 19 73 60 81 4F DC 22 2A 90 88 46 EE B8 14 DE 5E 0B DB E0 32 3A 0A 49 06 24 5C C2 D3 AC 62 91 95 E4 79 E7 C8 37 6D 8D D5 4E A9 6C 56 F4 EA 65 7A AE 08 BA 78 25 2E 1C A6 B4 C6 E8 DD 74 1F 4B BD 8B 8A 70 3E B5 66 48 03 F6 0E 61 35 57 B9 86 C1 1D 9E E1 F8 98 11 69 D9 8E 94 9B 1E 87 E9 CE 55 28 DF 8C A1 89 0D BF E6 42 68 41 99 2D 0F B0 54 BB 16")
data_4020 = data_4020[:256]
unk_4000 = bytes.fromhex("7E 7D 9A 8B 25 2D D5 3D 03 2B 38 98 27 9F 4F BC 2A 79 00 7D C4 2A 4F 58 00")
unk_4000 = unk_4000[:25]
data_1 = [unk_4000[i] for i in range(8)]
data_2 = [unk_4000[i] for i in range(8,16)]
data_3 = [unk_4000[i] for i in range(16,24)]
key = list("I_am_KEY")
key = [ord(i) for i in key]
#### EXPLOIT #################################################################################
def decode(a1):
for i in range(15, -1, -1):
for j in range(7, -1, -1):
v2 = a1[(j+1) % 8]
v2 = __ROL__(v2, 5, bits = 8)
a1[(j+1)%8] = v2 - data_4020[key[j]^(a1[j % 8])] & 0xFF
return a1
result = decode(data_1) + decode(data_2) + decode(data_3)
flag = [chr(i%256) for i in result]
print("".join(flag))