-榮-

[CodeEngn] Advance RCE L09 본문

CodeEngn/Advance

[CodeEngn] Advance RCE L09

xii.xxv 2021. 4. 5. 11:11

● CodeEngn Advance RCE L09 문제

 

CodeEngn Advance RCE L09

 

◎ 파일 실행 화면

 

[그림 1] 파일 실행 화면

 

[그림 2] 실패 화면

 

◎ 패킹 및 난독화 여부 확인

 

[그림 3] exeinfo PE

 


 

● CodeEngn Advance RCE L09 풀이

 

[그림 4] 디버거 - OllyDbg / 디버기 - 09.exe (Advance RCE L09 실행파일)

 

[그림 2]를 보면 실패 시 "Sorry, but the username and/or password is incorrect!" 문자열이 출력되는 것을 볼 수 있습니다. [Search for > All referenced text strings]를 보면 성공 문자열과 실패 문자열을 확인할 수 있습니다.

성공 문자열이 더 낮은 주소에 있으므로 성공과 실패를 나누는 분기점은 성공 문자열 주변 주소에 있을 것으로 생각됩니다. 성공 문자열 주소로 이동하겠습니다.

[그림 5] Search for > All referenced text strings

 

성공 문자열 주소로 이동하면 005E12AD가 분기점이라는 것을 알 수 있습니다.

[그림 6] 분기점 확인

 

분기 조건으로 이동하는 주소를 확인하면 00341097인 것을 확인할 수 있습니다. 

[그림 7] 분기 조건 (Jump from 00341097)

 

00341097로 이동하면 0034105F의 "DonaldDuck" 문자열과 [0034440C]의 문자열을 비교하는 반복문이 나옵니다.

즉, 이곳까지 실행하였을 때 [0034440C]에 입력받은 Username("ABCD")이 있다면 Username은 "DonaldDuck"입니다.

[그림 8] "DonaldDuck"과 문자 비교하는 반복문

 

[그림 8]이 있는 함수의 시작 부분에 [그림 8]과 같은 반복문이 있습니다. 이 반복문에선 [003431F8]과 [0034440C]의 문자를 비교하고 있습니다. 어떤 문자열을 비교하는지 확인하기 위하여 BP[F2]를 걸고 실행[F9]해 보겠습니다.

[그림 9] 함수 시작 BP

 

함수의 시작(00341000)까지 진행하면 [0034440C]에 입력받은 Username("ABCD")이 있는 것을 확인할 수 있습니다.

[그림 10] 함수의 시작(00341000)까지 진행

 

따라서 [그림 8]에서 추측한 대로 Username은 "DonaldDuck"입니다.

[그림 11] "DonaldDuck"과 문자 비교하는 반복문 진행

 

[그림 10]과 [그림 11]의 사이에 [그림 12]의 코드가 있습니다.

00341043에서 [34442C]의 "4D2"h를 EAX로 옮기고 0034104B에서 "4D2"h의 값과 [ECX]의 값을 비교합니다. "4D2"h 값은 입력받은 Password("1234"d)의 16진수 값이므로 0034104B에서 진행하는 비교가 입력받은 Password("1234"d)의 16진수와 Password 16진수([ECX])인 것을 알 수 있습니다.

[그림 12] [0034442C] = 000004D2

 

입력받은 Password("1234"d)의 16진수와 Password 16진수([ECX])를 비교하는 0034104B로 이동하면 Password 16진수([ECX])가 "0088228F"h인 것을 알 수 있습니다. 입력받은 Password("1234"d)가 16진수로 변환되어 비교되는 것으로 볼 때, "0088228F"h의 10진수가 "DonaldDuck"의 Password인 것을 알 수 있습니다.

[그림 13] "DonaldDuck"의 Password

 

"0088228F"h를 10진수로 변환하면 8,921,743d입니다.

[그림 14] "0088228F"h 10진수로 변환

 

찾은 Username과 Password를 입력하면 "I can't believe you felt for that! xD"와 "Sorry, but the username and/or password is incorrect!" 문자열이 나타납니다. 이 문자열 중 "I can't believe you felt for that! xD"은 트레이싱해보면 알겠지만 Username을 "DoanldDuck"으로 작성하면 나오는 문자열입니다.

[그림 15] 찾은 Username과 Password

 

"Sorry, but the username and/or password is incorrect!"는 Password와 관련이 있는 문자열입니다. Advance RCE L09의 분기 조건은 003412AB TEST BL, BL이고, 분기점은 003412AD JE 003412DF입니다. 이 분기점이 같은 코드를 바로 밑에서 확인할 수 있습니다.

[그림 16] 분기 조건

 

Password가 맞게 입력되는 틀리게 입력되든 003412AB에서의 EBX는 00000000입니다. 하지만 아래 있는 분기 조건에서는 Password가 맞게 입력되면 01이 입력되어 있고, Password가 틀리게 입력되면 00이 입력되어 있는 것을 확인할 수 있습니다. 따라서 분기점을 003412B4로 변경하기 위한 패치를 해줍니다.

[그림 17] 분기점 변경을 위한 패치

 

패치 후 실행[F9] 하여 분기 조건을 확인해 봅시다.

[그림 18] 변경된 분기 조건

 


 

● CodeEngn Advance RCE L09 확인

 

[그림 19] Welcome, TheRightName. You've gained access!

 


 

◎ 패치 후 Password만 맞을 경우

[그림 20] 패치 후 Password만 맞을 경우

 

◎ 패치 후 Username만 맞을 경우

[그림 21] 패치 후 Username만 맞을 경우

 

'CodeEngn > Advance' 카테고리의 다른 글

[CodeEngn] Advance RCE L11  (2) 2021.04.08
[CodeEngn] Advance RCE L10  (0) 2021.04.07
[CodeEngn] Advance RCE L08  (0) 2021.04.05
[CodeEngn] Advance RCE L07  (0) 2021.04.04
[CodeEngn] Advance RCE L06  (0) 2021.04.02