파일을 다운받은 후 ollydgb로 열어서 "all referenced text string"를 통해 문자열을 확인해보니까 Congratulation! 이라는 문자열을 볼 수 있었다. 

해당 문자열이 존재하는 위치로 이동하여 코드를 살펴보았다.

(사실 여기서 913465라는 문자열을 보고 바로 입력해봤는데 통과할 수 있었다ㅎㅎ)

첫 번째 함수를 call 하는 부분에 break point를 걸고 입력 폼에 "1111"을 입력 후 실행시켜보자.

한 줄 씩 실행시켜보면서 확인해보니까 우리의 입력 값이 사용되는 부분은 마지막 함수였다.

EAX와 EDX에 각각 입력값과 "913465"를 넣고 404608함수를 호출한다. 404608함수를 확인하면 다음과 같다.

ESI: input address, EDI: "913465" address

ESI-4와 EDI-4에 접근하는데 이 위치에는 해당 문자열의 길이가 저장되어 있는 듯 하다. 이전 함수에서 길이를 저장해놓은 것 같다.

그 후 EAX에서 EDX를 빼서 EAX에 넣는다. JA는 플래그 중 C와 ZR이 0일 때 점프한다. 즉, EAX가 EDX보다 클 때 점프하게 된다. 이 과정은 두 문자열 중 길이가 작은 문자열의 길이를 EDX에 넣는 과정으로 보인다.

그 다음 점프문은 JE인데 점프를 하기 위해서는 ZF가 1 즉, SHR EDX, 2의 결과가 0이 되어야 하기 때문에 길이가 4 미만일때만 점프를 하게 된다. 입력 문자열이 3 이하일 때를 먼저 확인해보자.

cmp cl, bl을 통해 첫번째 자리 문자가 같은지를 확인하고 같지 않다면 4046A6으로 점프해서 바로 리턴하므로 ZF가 0이기 때문에 Congraturation!을 통과할 수 없다.

끝 문자가 같다면 EDX(입력 값의 문자열 길이)에서 1을 빼고 je를 한다. 이 때 문자의 길이가 1이라면 je를 통해 리턴되는 부분으로 넘어가고 이와 같은 부분이 40466c 부분에도 있으므로 문자의 길이가 3이 되어야 이 부분을 통과할 수 있다.

그 후 cmp ch, bh로 두번째 자리 문자까지 같은지 확인해준다. 이번 경우에도 같아야 통과할 수 있다.

 

그 다음에도 and 연산을 통해 세 번째 자리 문자도 같은지 확인해주는데 결국 바로 return으로 점프하기 때문에 Congraturation!은 통과할 수 없게 된다..ㅎ 입력 값의 길이가 3보다 작을 때에도 문자를 비교하기는 하지만 결국은 통과할 수 없게 되는 것이다. 이제 길이가 4 이상일 때를 확인해보자.

 

앞에서부터 문자 네개를 가지고와서 같은지 확인한 뒤 다르면 404691로 점프한다.

404691에서도 한 글자씩 비교를 하다가 return을 하게 되는데 결국 여기도 4글자가 다 같아야지만 Congraturation을 통과하도록 해두었다. 즉, 일단 첫 네글자는 "9134"를 충족해야 한다.

첫 네 글자가 같다면 edx에서 1을 뺀 값이 0일 때 404651로 점프하게 된다. edx는 두 문자열 중 작은 값이 들어 있는 것에서 shr 2를 했으니 길이가 4, 5, 6일 때 넘어가게 된다(기존에 있는 문자열이 "913465"로 여섯글자 이므로 그 이상의 숫자가 edx에 들어갈 수 없다.)

esi와 edi가 가르키는 곳을 각 문자열의 다섯번째 문자로 변경한 뒤 and edx, 3이 0이면 40467f로 점프하게 된다. 즉 길이가 4일 경우에 점프하는데 40467f로 가면 이번에도 그냥 return하게 된다.

그 뒤로는 이전에 살펴봤던 것 처럼 한글자씩 비교한다. 이 때 한글자라도 다르다면 바로 return 부분으로 점프해버리니까 전부 같아야 하고 주어진 문자열에서 비교하는 부분이 "65"니까 우리가 넣은 문자열도 7글자면 안되고 6글자로 맞춰서 "65"를 가르키게 해야한다.

그 다음에는 add eax, eax를 한 뒤 return을 하는데 이 때에는 이전에 입력 문자열의 길이가 6이 아닐때와 다르게 eax가 0으로 세팅되어 있는 상태이기 때문에 ZF가 1인 상태로 넘어가게 되고 Congraturation!이 나오게 되는 것이다.

 

하나하나 해석하다 보면 꽤나 오래 걸리지만 역시 리버싱은 일단 떄려 맞추는게 제일 빠르게 풀 수 있는 것 같다ㅎㅎ 그래서 답은 "913465"가 된다!

'forensic > suninatas.com' 카테고리의 다른 글

[suninatas] Level 11  (0) 2021.10.04
[suninatas] Level 10  (0) 2021.10.04
[suninatas] Level 8  (0) 2021.09.06
[suninatas] Level 7  (0) 2021.09.06
[suninatas] Level 6  (0) 2021.09.06

+ Recent posts