Description
Category: Reversing
Source: TAMUctf 2019
Points: 494
Author: Jisoon Park(js00n.park)
Description:
nc rev.tamuctf.com 7223
Difficulty: medium
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 |