bin

rev-basic-5

satorare 2022. 10. 25. 09:15

 

Ghidra로 디컴파일링한 main함수

rev-basic-4와 유사한 형태의 main함수를 볼 수 있습니다.

 

문자열 Wrong과 Correct의 출력을 결정짓는 부분은 라인 20의 조건문에 동반된 FUN_140001000 함수의 역할로 보입니다. 해당 함수를 살펴보겠습니다.

 

함수 FUN_140001000의 내부

FUN_140001000 함수의 내부에 반복문과 조건문이 존재합니다.

 

while문은 총 0x17번 만큼 반복하며, 반복문 안의 조건문에 따라 리턴값이 달라집니다.

 

조건식은 다음과 같습니다.

param_1[local_18] + param_1[local_18 + 1] != DAT_140003000[local_18]

 

 

>> param_1은 인수로 받아온 사용자 입력 문자열입니다. 

>> local_18은 함수 FUN_140001000 내부 지역변수로 반복문의 제어변수 역할을 합니다. 

>> DAT_140003000은 프로그램에 저장되어있는 배열입니다.

 

해당 조건식을 만족하면 0을 리턴하고, 만족하지 못하면 1을 리턴합니다. 즉, 저희는 

param_1[local_18] + param_1[local_18 + 1] == DAT_140003000[local_18]

를 만족하는 문자열 키값 배열 param_1을 역연산 과정을 통해서 알아내면 될 것 같습니다.

 

보다 간단히 이제부터 param_1을 P, DAT_140003000을 Q, local_18을 i라고 표현하겠습니다. 이를 토대로 정리하면

 

P[i] + P[i + 1] = Q[i]

 

직관적으로 보았을 때, 어떤 수 Q[i]는 P[i] - P[i-1]을 하면 알아낼 수 있습니다.

 

예시를 들어보기 위해서 배열 P를 다음과 같이 정의하겠습니다

P[] = {1, 2, 3, 4};

이 때 제어변수 i를 4라고 한다면 위의 반복문은 다음과 같이 실행될 것입니다.

 

P[0] + P[1] = 3 = Q[0]

P[1] + P[2] = 5 = Q[1]

P[2] + P[3] = 7 = Q[2]

P[3] + P[4] = 4 = Q[3] 

 

여기서 P[0], P[1], P[2] 들을 역산하고자 한다면 조금 힘들것입니다. Q[0]로 부터 P[0]를 역산하려했을때, Q[0] = 3이라는 결과만을 가지고서 그 합의 과정이 1+2 인지, 2+1 인지, 0+3 인지, 3+0 인지 알 수가 없기때문입니다.

 

하지만 P[3]은 역산이 가능합니다. 바로 P[4]가 문자열의 끝을 표시하는 NULL문자로써, 0x00의 값을 보장하기 때문입니다. 이 점을 이용하여 우리는 Q[3]의 값을 알고있다면, NULL문자 P[4]와 결합하여 P[3]의 값을 유추해낼 수 있습니다. 그리고 이런식으로 문자열의 맨 끝부터 역산해나간다면, 모든 문자열을 파악해낼 수 있습니다.

 

위의 Q 배열을 통한 P배열의 역산 과정을 정리하면 다음과 같을 것입니다.

 

Q[3] = P[3] + P[4] ... 4 = P[3] + 0 ... P[3] = 4

Q[2] = P[2] + P[3] ... 7 = P[2] + 4 ... P[2] = 3

Q[1] = P[1] + P[2] ... 5 = P[1] + 3 ... P[1] = 2

Q[0] = P[0] + P[1] ... 3 = P[0] + 2 ... P[0] = 1

 

∴ P[0..3] = {1, 2, 3, 4}

임을 알 수 있습니다.

 

이것을 토대로 역연산식을 만들어보면

param_1[local_18] = DAT_140003000[local_18] - param_1[local_18 + 1]

입니다.

 

이제 DAT_140003000 배열의 값들을 살펴보겠습니다.

배열 DAT_140003000

 

더많은 값이 있지만, 반복문은 0x17번까지만 반복하기 때문에 총 23바이트까지만 보았습니다.

 

이 값을 가지고 역산을 진행하여 키값을 구해보겠습니다.

 

Replit으로 위와 같이 코드를 짜보았습니다.

 

실행 결과, 다음과 같이 키값이 나오는걸 확인하였습니다.

정답은 직접 입력해서 보시길 바랍니다.