관리 메뉴

JIE0025

[악성코드분석] CodeEngn 코드엔진 Basic RCE L05 본문

기타 학습/보안

[악성코드분석] CodeEngn 코드엔진 Basic RCE L05

Kangjieun11 2020. 4. 19. 20:23
728x90

############## 작성자가 진행한 실습 그대로의 과정을 담았습니다. ##############

######## 공부 목적으로 실습한 것이라서 혼자 삽질한 내용이 담겨 있습니다. ########

 

https://codeengn.com/challenges/

실습 파일은 코드엔진 challenges 에서 다운 받을 수 있다.

 

오늘의 실습은 코드엔진의 basic RCE L05번이다. 프로그램의 등록키를 찾는 것이 최종 목표!

먼저 올리디비지로 실행해보았다. 파일 오픈 후 f9 클릭하니 이런창이 떴다.

 unregistered... > name

754-GFX-IER-954 > serial num

 

Serial Num 를 찾으면 그것이 정답이 될 것같다.

 

 

어차피 등록키를 모르는거 Register now! 버튼을 클릭해보았다.

문자열이 나왔다. 문자열을 찾아서 들어가보자.

와우 문자열이 너무 많아서 그냥 눈으로 보고 찾는데 꽤나 오래걸렸다.

더블클릭해서 들어간 다음, 그 함수의 처음 시작부분인 00440F93을 f2 키를 눌러 breakpoint 설정하였다.

차근 차근 문자열을 읽어보니,

1) No Name enterd : 문자열을 넣지 않고 Register now! 버튼을 클릭했을 떄

2) No Serial Entered : 시리얼 넘버를 넣지 않고 Register now! 클릭했을 때

그리고 수상한 두개의 문자열...

3) Registered User

4) GFX-754-IER-954

 

얘를 name과 serial num에 넣어보니까 맙소사 정답이다.. 너무 허무하다.

 

-----------------------------------------------------------------------------

정답은 찾았지만 좀더 자세한 분석을 해보고자 했다.

 

1) name이 일치하지 않을 때

name에 aaaa를 넣고 비교분석을 해보았다.

입력한 값이 EAX에 존재하고, EDX에 Register User라는 string이 들어가는 것을 확인했다. 그리고  두 값을 비교하는 함수는  004402F인 CALL 00401014를 타고 들어가 보면 된다.

 

들어가서 보니까 두 값 비교를 위하여 esi 와 edi를 push 하였고, 각각 eax edx를 설정하는 것을 확인했다.

그리고 eax와 edx를 비교하는데 당연히 다르기 때문에 JE 에서 분기하지 않는다.

 

esi와 edi에 값이 잘 들어갔는지 확인해보고자, 022B61B4와 00441014의 hex dump를 확인했다.

 

입력한 aaaa는 잘 들어갔고,

Register user 역시 잘 들어갔다.

그 다음, TEST ESI ESI , JZ는 ESI가 입력값의 주소이므로 입력값이 0인지 확인 하는 듯 하였다. TEST에서는 and 연산을 해서 0이 나오면 zf = 1로 설정하기 때문이다.  JZ는 jump if zero 라는 명령어로 입력값이 0이면  No Name enterd 을 띄워야 하니까 그것과 관련 되어 있을 것이다. 

 

아래 두줄인 TEST EDI EDI 와 JZ 역시 내용은 같다. 

 

##############여기를 이해 못해서 질문하고 다시 정리할것이다.#############

###############################################################

 

그 다음줄은 SUB EAX EDX인데, 위의 MOV명령어를 통해 세팅된 값으로 양수값, 혹은 음수값이 나올것이다. 

EAX = 00000004(10진수), EDX= 00000015(10진수) = 0000000F(16진수)이므로,

4-15 = - 11(10) = FFFFFFF5(16진수)가 나왔다. 당연히 jump 안하겠지.

그 상태로 ADD EDX EAX 를 하면 , 0000000F + FFFFFFF5 = 00000004이다. 그 값을 스택에 push 해놓는다.

##이것도 잘 모르겠는데 edx를 shift right 2 했는데 나는 00000000이 나올걸 예상했는데 00000001이 나와서 왜 그런지 이유를 모르겠다 알고나서 재정리 하겠다.

zero 가 아니므로 분기하지 않고,

ECX, EDX에 ESI,EDI에 위치한 값 자체를 MOV해준 후 (아래사진에서 값 확인)

ECX 와 EDX를 비교하였다. 

당연히 같지 않으니 JNE를 타고 분기할 것이다. 

 

분기한 곳에 POP EBX 가 있다. 스택에서 00000004라는 값을 pop하면서 ebx에 넣어지는 것을 볼 수 있다. 

비교 함수를 보느라 고생했다. 

결과 값이 같지 않으니 당연히 wrong Serial Try again 쪽으로 분기한다.

-----------------------------------------------------------------------------------------------------

2) name은 일치하지만 serial number가 일치하지 않을 때

두번째로는 name은 일치하게 하되, serial num를 defualt 값으로 넣으면 어떻게 되는지를 간단하게 보았다.

name은 일치 했으므로 위에서 분기하지 않아, 시리얼 넘버를 비교한다.

시리얼 넘버까지 일치할 경우에 congrats 쪽으로 분기하는 것이다.

 

아래 CALL 0040382C에서 입력한 값과 정답인 serial code를 비교하고, equal 하지 않으므로 wrong 쪽으로 분기한다.

 

-----------------------------------------------------------------------------------------------------

 

정답확인