상세 컨텐츠

본문 제목

[Write-up] CodeEngn Basic RCE 5

Reversing Write-Up/02.CodeEngn Basic

by RACC8N 2020. 1. 16. 20:42

본문

문제 : 이 프로그램의 등록키는 무엇인가

 

풀이 : 

프로그램을 실행시켰을때 모습이다.

 

디버거를 켜보자.

 

PUSHAD가 있음을 확인할 수 있다.

 

UPX 패커의 특징인 EP가 PUSHAD/POPAD 명령어로 둘러쌓여있는 것을 이용하여 OEP를 찾아보자.

 

POPAD를 찾았다. 그렇다면 이 다음에 있는 JMP문의 주소가 OEP임을 알 수 있다. 확인해보자.

 

OEP를 찾았다. 이제 우리가 원하는 함수의 위치를 찾아보자.

 

CALL 43CF10이 프로그램 실행했을 때 뜨는 창을 생성하는 함수임을 확인했다.

 

자 그럼 여기서 문자열 검색을 해보자.

 

이름을 입력안했을 때 뜨는 Enter a Name 문자열을 찾았다. 해당 위치로 가보자.

 

특정 함수 CALL 420E20 이후에 cmp을 한 후 분기문에 의해 No Name entered과 No Serial entered 문자열을 출력해주는 것으로 보아,

 

이 특정함수가 바로 Resister Now 버튼을 눌렀을 때 반응하는 함수 인 것 같다.

 

BP 걸고 프로그램을 실행해보자.

 

Name에 AAAAA를 Serial에 XXXXX를 넣고 실행한 결과 

 

원하는 위치에 제대로 BP가 걸렸다. 이제 Name과 Serial을 비교하는 부분을 분석하면 된다.

 

CALL 403B2C 함수에서 비교를 하여 ZF에따라 jne 440F8C로 점프하게 되는데 여기서 403B2C에 Name을 비교하는 로직이 있음을 예상할 수 있다.

 

Stepinto 해보자.

 

Name에 입력한 AAAAA와 Registered User 문자열을 비교하는걸 알 수 있다. 

 

프로그램이 원하는 Name은 Registered User임을 예상할 수 있다.

 

Name이 일치하지않아 ZF가 0이므로 실패하였다.

 

그럼 Name을 Registered User로 하여 다시 실행시켜보자.

 

ZF가 활성화되어 성공적으로 분기문을 통과하였다.

 

이제 Serial을 얻어보자.

 

Serial역시 Name과 똑같은 로직으로 비교하는 것을 확인할 수 있다.

 

Serial은 44102C에 있는 GFX-754-IER-954 임을 예상할 수있다. 그럼 확인해보자.

 

Register 성공했다.

'Reversing Write-Up > 02.CodeEngn Basic' 카테고리의 다른 글

[Write-up] CodeEngn Basic RCE 7  (0) 2020.01.17
[Write-up] CodeEngn Basic RCE 6  (0) 2020.01.16
[Write-up] CodeEngn Basic RCE 4  (0) 2020.01.16
[Write-up] CodeEngn Basic RCE 3  (0) 2020.01.15
[Write-up] CodeEngn Basic RCE 2  (0) 2020.01.15

관련글 더보기

댓글 영역