Write-up/Reversing

[Dreamhack] rev-basic-9

mameul 2024. 5. 18. 13:33
728x90

풀이

main 함수이다. sub_140001000 함수를 살펴봐야할 것 같다.

함수를 살펴보면 일단 문자열 a1의 길이는 8의 배수여야 한다. 그리고 이 문자열을 8바이트 단위로 sub_1400010A0 함수에 넘겨준다. 이제 sub_1400010A0 함수를 확인해보자.

byte_140004020[(unsigned __int8)v5[j] ^ v2]는 v5[j]와 v2를 XOR 연산하고, 그 결과를 인덱스로 사용하여 byte_140004020에서 값을 가져온다. 그 가져온 값을 b라고 할 때 a1[(j+1)%8]과 더한 다음 그 값을 5만큼 right rotate 해준다. 그 값을 다시 a1[(j+1)%8]에 넣어준다

ubk_140004000와 byte_140004020 값을 얻어오자.

 

#ubk_140004000
a = "7E 7D 9A 8B 25 2D D5 3D 03 2B 38 98 27 9F 4F BC 2A 79 00 7D C4 2A 4F 58"
a = a.split()
a = [int(x, 16) for x in a]

#byte_140004020 
b = "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"
b = b.split()
b = [int(x, 16) for x in b]

v5 = "I_am_KEY".encode()

def rol5(a):
    return ((a << 5) | (a >> 3))&0xFF

for k in range(0,len(a),8):
    a1 = a[k:k+8]
    for i in range(16):
        for j in range(7,-1,-1):
            v2 =a1[(j+1)&7]
            tmp = (v5[j] ^ a1[j&7])
            a1[(j+1)&7] = (rol5(v2) - b[tmp]) & 0xff
    for c in a1:
        print(chr(c), end="")

역연산을 하는 파이썬 코드를 작성하면 위와 같다. 

 

파이썬 코드를 실행시켜보면 이와 같은 결과가 나온다.

 

파일을 실행해 확인해보면 맞는 값인 것을 확인할 수 있다.