Description

Category: Reversing

Source: TAMUctf 2019

Points: 494

Author: Jisoon Park(js00n.park)

Description:

nc rev.tamuctf.com 7223

Difficulty: medium

keygenme

Write-up

주어진 파일을 실행해보면 product key를 넣으라고 하는데, 대충 아무거나 넣어 봤지만 별다른 출력이 나오지 않았다.

디컴파일을 통해 어떻게 돌아가는지 살펴보자.

main 함수를 보면 입력 받은 fgets()로 입력받는 값을 verify_key() 함수를 통해 검사하고 있다. 이 함수만 통과하면 알아서 flag를 보여주는 구조다.

verify_key() 함수는 enc() 함수를 통해 입력받은 값을 인코딩 하고, 인코딩 결과가 **[OIonU2_<__nK<KsK**와 동일한지 확인하는 동작을 한다.

enc() 함수는 문자열을 한글자씩 변환하서 돌려주는 코드인데, 이 변환을 역으로 수행하면 입력해야 할 값을 찾을 수 있을 것이다.

간단하게 python을 이용해서 enc() 함수의 역함수를 작성해보자.

def dec(a1):
    v4 = len(a1)
    v2 = 72
    r = ""
    for i in range(v4):
        for j in range(32, 127):
            t = ((j + 12) * v2 + 17) % 70 + 48
            if t == ord(a1[i]):
                r += chr(j)
                break
        v2 = ord(a1[i])
    return r

fgets() 함수는 입력 받을 때 줄바꿈('') 문자 까지 입력 받으니, 마지막 한 글자를 제외하고 dec() 함수에 넣어주면 된다.
(이 부분을 놓쳐서 정상적으로 dec가 되어도 패스가 안되는 바람에 한참을 디버깅했다.)

target = "[OIonU2_<__nK<KsK"
d = dec(target[:-1])
print "dec : " + d
e = enc(d + "\n")
print "enc : " + e

if e == target:
    print "OK!"
else:
    print "Fail!"

코드를 실행시켜서 입력해야 할 값을 찾아보자.

문제에서 주어진 서버에 이 값을 보내면 flag를 얻을 수 있다.

Flag : **gigem{k3y63n_m3?_k3y63n_y0u!}**

'writeups > Reversing' 카테고리의 다른 글

Secrets  (0) 2019.11.25
Local News  (0) 2019.11.25
rock  (0) 2019.11.25
pyc decompile  (0) 2019.11.25
Easyhaskell  (0) 2019.11.25

+ Recent posts