CTF/리버싱

[CTFlearn] Time to Eat - 리버싱 / Python

SecurityMan 2023. 3. 31. 11:00

 

CTFlearn의 여든 세번째 문제

 

이번에는 Medium 난이도의 리버싱 문제이다.

 

반응형

 

 

문제파일로는 파일이 제공된다.

 

 

문제에서 제공되는 코드를 열어보면 이렇게 적혀있다.

 

eat, EaT, eaT, eAT 등 변수나 함수 이름을 상당히 헷갈리게 적어놔서

 

그냥 봐선 대체 무슨 말인지 알기가 어렵다.

 

 

일단 실행시켜봤다.

 

what's the answer 라는 문구가 나오며 사용자 입력을 받는다.

 

hello 라고 입력해 봤더니

 

bad length 라는 문구가 출력되었다.

 

 

사용자 입력값을 eat 에 저장하고

 

eat 가 9 와 같은지 비교하고 있는데

 

이 부분이 길이를 체크하는 부분이다.

 

입력값을 9자리여야 한다.

 

 

이번엔 aaaaaaaaa 라고 입력해봤다.

 

bad format 이라면서 입력값의 예시를 출력해준다.

 

입력값은 123abc456 형태여야 한다.

 

 

일단 주어진 포맷대로 입력해보니

 

알수없는 출력값을 내뱉는다.

 

 

소스코드를 보니 이 값이

 

E10a23t9090t9ae0140 일경우 플래그가 나오는듯 하다.

 

 

몇번 시도해보다 알았는데

 

가운데 세자리는 알파벳이 아니어도 상관없다.

 

그러니까 포맷은

 

1 ~ 3자리 : 0 ~ 9 까지 숫자

4 ~ 6자리 : 0 ~ 9 까지 숫자, a ~ z 까지 문자

7 ~ 9자리 : 0 ~ 9 까지 숫자 이다.

 

 

또 몇번 시도해보다 보니

 

맨 앞의 두자리가 결과값의 앞 세자리를 결정짓는다는 것을 알았다.

 

플래그가 나오는 E10 같은경우,

 

입력값의 맨 앞자리가 34, 35, 36 일때 나오게 된다.

 

 

또하나 알게된 것은

 

결과값 앞쪽에 있는 알파벳 E a t 를 제외한 나머지 알파벳은

 

입력값으로 부터 온다는 것을 알아냈다.

 

지금 찾아야하는 값이 E10a23t9090t9ae0140  이므로

 

가운데 오는 알파벳은 eat 인것을 알 수 있다.

 

여기까지 알아냈다면 

 

경우의 수가 엄청나게 줄어들어 brute force 공격을 할 수 있게 된다.

 

# I wrote and debugged this code with all the convoluted "EAT" variable names.
# Was it confusing? Yes. Was debugging hard? Yes.
# Did I spend more time than I should have on this problem? Yes

EAT = int
eAT = len
EaT = print
ATE = str
EATEATEATEATEATEAT = ATE.isdigit

def Eating(eat):
    return ATE(EAT(eat)*EATEATEAT)

def EAt(eat, eats):
    #print(eat, eats)
    eat1 = 0
    eat2 = 0
    eateat = 0
    eAt = ""
    while eat1 < eAT(eat) and eat2 < eAT(eats):
        if eateat%EATEATEAT == EATEATEATEATEAT//EATEATEATEAT:
            eAt += eats[eat2]
            eat2 += 1
        else:
            eAt += eat[eat1]
            eat1 += 1
        eateat += 1
    return eAt

def aten(eat):
    return eat[::EATEATEAT-EATEATEATEAT]

def eaT(eat):
    return Eating(eat[:EATEATEAT]) + aten(eat)

def aTE(eat):
    return eat#*eAT(eat)

def Ate(eat):
    return "Eat" + ATE(eAT(eat)) + eat[:EATEATEAT]

def Eat(eat):
    if eAT(eat) == 9:
        if EATEATEATEATEATEAT(eat[:EATEATEAT]) and\
            EATEATEATEATEATEAT(eat[eAT(eat)-EATEATEAT+1:]):
                eateat = EAt(eaT(eat), Ate(aTE(aten(eat))))
                if eateat == "E10a23t9090t9ae0140":
                    flag = "eaten_" + eat
                    EaT("absolutely EATEN!!! CTFlearn{",flag,"}")
                else:
                    EaT("",end="")
        else:
            EaT("", end="")
    else:
        EaT("", end="")

EaT("what's the answer")

number = '0123456789'

for c in range(len(number)):
	for g in range(len(number)):
		for h in range(len(number)):
			for i in range(len(number)):
				eat = '34'+number[c]+'eat'+number[g]+number[h]+number[i]           
				EATEATEAT = eAT(eat)//3
				EATEATEATEAT = EATEATEAT+1
				EATEATEATEATEAT = EATEATEAT-1
				Eat(eat)

 

문제 푸는 코드는 위와 같다.

 

E10 이 나오도록 34 를 맨 앞에 넣어주고

 

숫자 0 ~ 9 중 하나,

 

그다음 eat,

 

그다음 숫자 0 ~ 9 중 하나 * 3 형태로 입력값을 만들어 준다.

 

 

코드를 실행시키면 플래그가 출력된다.

반응형