본문 바로가기

2. Reversing (리버싱)/1) Write UP

[2020.11.07]CodeEngn Challenges Basic RCE L13 ~ L16 라이트업

L13. 정답은 무엇인가

 

프로그램을 실행시키니 다음과 같은 화면이 출력되었다.

내용을 살펴보니 패스워드를 입력하라는 문자열만 출력되었다. 무작위의 문자열을 입력하니 다시 시도하라며 다시 입력을 기다리고 있었다. 프로그램 분석을 위해 Ollydbg에서 해당 프로그램을 실행해보았다.

위와 같은 오류창이 출력되면서 Ollydbg에서 프로그램을 실행할 수 없었다. PEiD로 해당 프로그램이 어떤 구조로 이루어져 있는지 분석해보았다.

분석한 내용을 확인하니 해당 프로그램은 NET을 이용하는 마이크로소프트 Visual C#으로 작성된 코드인 것을 확인할 수 있었다. Visual C#으로 컴파일 된 파일은 기계어로 되어 있기 때문에 인간이 사용하는 고급언어로 변환하는 과정이 필요하다. 이와 같이 기계어를 고급언어로 변환하는 것을 디컴파일이라고 한다. 디컴파일 프로그램 종류는 많지만, 여기서는 dotPeek을 사용했다.

디컴파일러에서 파일을 열고 Main() 함수를 찾은 결과이다. 여기서 while 문 내의 if 문을 통해 입력된 값과 비교하는 값이 다르면 실패 문자열이 출력된다는 것을 알 수 있다. 성공 문자열을 출력하려면 입력되는 값과 비교되는 값 str이 어떤 값인지 알아야 한다. while 문을 실행하기 전, str 값을 출력하는 코드(Line 29)를 추가하고 프로그램을 실행하였다.

처음 안내문 이전에 “Leteminman”이라는 문자열이 출력된 것을 확인할 수 있었다. 해당 문자열이 정답이 맞는지 password로 입력해보았다.

성공 문자열이 출력되었다. 해당 문자열을 정답 창에 입력하니 성공 팝업창이 출력되었다.

 

L14. Name이 CodeEngn 일때 Serial을 구하시오
(이 문제는 정답이 여러개 나올 수 있는 문제이며 5개의 숫자로 되어있는 정답을 찾아야함, bruteforce 필요)
Ex) 11111

 serial 을 구하는 문제.      

                 

  upx로 패킹 된 것을 확인.

upx -d  명령어로 언패킹을 했다.

14.exe 파일을 올리 디버거로 분석을 진행. 문자열을 확인한 결과 앞서 실행했을 때 실패 메세지로 나온 "You Have Enter A Wrong Serial, Please Try Again" 가 있는 것을 확인. 그 위치로 이동.

  

EAX와 ESI와 비교하는 부분에 bp를 걸고 실행. EAX에 0x000004D2가 들어가는 것을 보았고 10진수로 변환결과 임의로 입력한 1234가 들어가는 것을 알 수 있다. ESI 0x000129A1과 비교해서 다르면 오류 메세지가 있는 곳으로 점프. 0x000129A1을 10진수로 변환해 보면 76193 이며 키 값을 이 값으로 바꿔서 입력해 보았다.

성공 메시지 출력

 

L15. Name이 CodeEngn일때 Serial을 구하시오

 

                  serial 키 값 구하는 문제                                                   패킹 되어 있지 않음을 확인

EAX에 0x000004D2 값이 들어가 있는데 이것을 10진수로 변환해 보면 임의로 입력한 1234 값이 들어가 있는 것을 볼 수 있다. 이 값과 0x00006160과 비교하는 것을 볼 수 있고 두 값이 다르면 Try Again! 메시지가 발생하는 위치로 점프하게 된다. 따라서 0x00006160 값을 10진수로 바꾸면 24928 이다. 이 값을 serial 키 입력하는 곳에 입력.

 

성공.




L16. Name이 CodeEngn일때 Serial을 구하시오

 16.exe에 Name으로 CodeEngn을 입력하고, Password로 123을 입력하자 실패 문자열이 출력된다.

16.exe는 패킹되어 있지 않다.

 

 올리디버거를 통해 참조되는 문자열 중 실패 문자열의 위치로 이동한다.

실패 문자열 위에 성공 문자열이 있고 그 위에 EAX 값과 EBP-3C 주소에 있는 4bytes 값을 비교문을 통해 비교하고 일치하면 성공 문자열, 다르면 실패 문자열을 출력 명령으로 점프하는 jnz 명령어가 있다.

 비교문에 BP를 설정하고 Name은 CodeEngn, Password에는 임의의 값인 123을 입력한다.

 

 BP까지 실행했을 때, EAX 값은 0x7B이다. 0x7B를 10진수로 변환하면 123이다. 그러므로 EAX에 입력 값이 저장된다는 것을 알 수 있다. 그리고 EBP-0x3C의 4bytes의 값에 올바른 Password가 있을 것이다. EBP-0x3C의 위치는 0x70FEEC이다.

 EBP-0x3C의 위치로 이동해보니 E4C60D97이 저장되어 있다. 해당 값들을 10진수로 바꾼다. 10진수로 변환하면 3838184855이 된다.

그래서 구한 값을 입력하면 성공 문자열이 출력된다.