야금야금

Reversing #4_Lena's Reversing for Newbies 본문

SWING/Reversing

Reversing #4_Lena's Reversing for Newbies

hyk0425 2021. 3. 28. 12:57

[ Lena's Reversing for Newbies ]

프로그램 설명 : 본 프로그램의 정답 Regcode값 외의 값을 입력하면 오류창이 출력되고 해당 값을 입력하면 성공 창이 출력되는 프로그램. 프로그램을 시작했을 때와 해당 버튼을 눌렀을 때 Nag창이 추가로 출력된다.

목표 : 모든 Nag창을 제거한다 정답 Regcode값을 찾는다

 

 

우선 파일을 실행시켜보자

 

└ 파일 실행 시 출력되는 메시지 박스

위와 같은 문구(모든 Nags를 없애고 registration code를 찾아라)와 함께 메시지 박스가 출력된다.

확인 버튼을 누르면 아래와 같은 메인 창이 나타난다. (취소를 누를 경우 프로그램 종료)

 

└ 메인 창
└ 오류 메시지 박스

해당 창에서 틀린 Regcode값을 입력하면 오류 메시지 박스가 출력되고 Nag? 버튼을 누를 경우 처음 파일을 실행했을 때와 같은 창이 출력된다.

본 프로그램은 crackme #2와 같은 전형적인 serial키를 찾는 serial crackme프로그램이다. 화면의 파란 글씨를 보면 registration을 위해 SmartCheck을 사용하라는 문구가 나와있다.

 

우선 모든 Nags를 없애라고 지시하였으므로 해당 메시지박스가 출력(호출)되는 부분을 찾아 패치를 진행해보도록 하자.

 

 

목표 1) Nags 메시지박스 제거

해당 창은 여러 가지 방법으로 제거할 수 있다. 우선 그동안 많이 사용했던 문자열 검색을 통해 해당 부분을 찾아보도록 하자

└ 문자열 검색을 통해 찾은 오류 문자열

 

위와 같이 문자열 검색을 통해 손쉽게 해당 메시지가 출력되는 부분을 찾을 수 있다. 하지만 실제 프로그램들에서는 본 프로그램과 같이 친절한 주석이 존재하지 않으므로 문자열 검색을 사용할 수 없는 경우가 많다. 따라서 코드 분석을 통해 해당 부분을 찾아보도록 하자

프로그램의 EP코드를 살펴보면 crackme #2에서도 확인했던 Visual Basic코드임을 확인할 수 있다. Visual Basic에서 메세지 박스 출력 함수는 MSVBVM50.rtcMsgBox이다. 따라서 프로그램에서 사용되는 API호출 목록에서 해당 부분을 확인해보자

 

└ Serch for > All intermodular calls창

 

└ rtcMsgBox 호출 코드에 BP설치

모든 rtcMsgBox부분에 BP를 걸어보니 총 4군데에서 rtcMsgBox함수가 호출되는 것을 볼 수 있다.

프로그램 실행으로 알아본 것으로 해당 부분들이 오류 창, Nags, 성공 창이라고 예측해보자

위의 상태로 프로그램을 실행시키면 BP가 설치된 곳에서 실행이 멈춘다.

 

프로그램 실행이 멈춘 곳의 윗부분을 살펴보면 우리가 찾고 있던 첫 메시지 박스의 문구가 확인되므로 해당 부분이 Nags메세지 박스를 호출하는 부분임을 알 수 있다. 주석이 없을 경우를 대비하여 프로그램을 진행하며 확인해보면 시작 시와 Nag?버튼을 누를 때마다 해당 부분(402CFE)에서 BP가 걸리는 것을 보아 본 부분이 Nags메시지박스 부분임을 완전히 확신할 수 있다.

 

└ 402CFE 주소에서 실행이 멈춤

이제 해당 부분을 패치하여 Nags를 없애보도록 하자 여러 가지 방법이 있지만 스택 프레임을 확인하여 패치를 진행하도록 하자.

 

지난 뉴스스터디에서 EBP에 대해 살펴보았다. EBP란 베이스 포인터 레지스터로 PUSH EBP는 함수가 시작할 때 나타나는 스택 프레임을 구성하는 전형적인 코드이다. 위의 CALL문의 윗부분을 살펴보면 해당 함수의 시작을 나타내는 스택 프레임을 확인할 수 있다.

└ 함수 시작 부분

402CFE의 rtcMsgBox 함수 호출 코드 역시 다른 함수 내부에 속해있는 코드이다. 따라서 상위 함수를 호출하지 못하게 하거나 바로 리턴한다면 rtcMsgBox함수는 호출되지 않을 것이다.따라서 402C17 명령어를 다음과 같이 수정한다.

└ 수정한 코드

수정 후 Nag? 버튼을 눌러도 해당 메시지 박스가 출력되지 않는 것을 확인할 수 있다.

 

 

 

목표 2) Registration Code 찾기

이제 정답 시리얼 코드(Registration Code)를 찾아보자. 주석이 친절하게 달린 프로그램이기 때문에 문자열 검색을 통해 쉽게 정답 코드를 찾을 수 있다. 하지만 위와 마찬가지로 주석이 없다는 전제 하에 패치를 진행해보도록 하자.

 

Nags메시지 박스를 찾는 과정에서 메시지 박스를 출력하는 4군데를 확인하였다. 해당 부분들에 BP를 걸고 실행하며 오류 메시지 박스가 출력되는 부분을 찾는다.

└ 오류 메시지 박스 호출 함수와 그 윗부분 코드

BP를 걸어놓은 윗부분을 살펴보도록 하자. 사용자의 입력에 따라 선택적인 결과가 출력되므로 지난 뉴스스터디에서와 마찬가지로 분기 명령어가 사용될 것이다. 402A5A 주소를 보면 분기명령어가 사용되는 것을 확인할 수 있다. crackme #2에서는 vbaVarTstEq함수를 사용하여 EDXEAX에 저장되어있는 문자열을 비교하였다. 402A2F 주소를 보면 vbaStrCmp함수 호출 코드가 존재한다. 이 함수도 문자열을 비교하는 함수이므로 위의 문자열을 확인하여 보자 (주석으로 확인할 수 있지만 주석이 없다는 가정 하에 직접 확인하도록 하자)

 

crackme #2에서의 기억을 떠올려 보면 문자열 비교 함수가 호출되기 전 비교할 문자열이 PUSH 되었다.따라서 이번에도 문자열 비교 함수가 호출되기 전 PUSH 된 값이 정답과 사용자 입력값이라고 예측하고 디버깅을 진행해보자 우선 402A27주소에 BP를 건 후, 프로그램을 실행해보자.

 

└ Regcode값 입력

Regcode값을 입력하고 Registerme! 버튼을 누르면 BP에 걸리게 된다. 입력한 값과 정답값을 PUSH 하는 문장을 실행하고 값이 덤프 창에서 저장된 메모리를 확인해보자

 

└ Dump window에서 EBP-58주소에 저장된 값
└ Dump window에서 00401DDC주소에 저장된 값

PUSH DWORD PTR SS:[EBP-58] 코드를 실행하자 입력한 값이 메모리에 저장되었다. 이를 통해 해당 명령문은 입력한 값을 불러오는 명령문이라는 것을 확인할 수 있다. 동시에 스택 창을 확인해보면 입력한 값이 들어가 있는 것을 확인할 수 있다. PUSH Wut_Reve.00401DDC명령어를 실행하여 정답값을 스택에 추가해 보자

 

└ Stack window

 

스택은 FILO(First In Last Out) 구조라서구조라서 역순으로 값이 들어간다. 정답값과 입력값이 스택에 추가되어 해당 데이터로 문자열 비교 함수가 실행되게 된다.

 

확인한 정답값을 입력하면 성공 메시지 박스가 뜨는 것을 확인할 수 있다.

 

└ 정답 Regcode값 입력
└ 성공 메시지 박스
[뉴스스터디] 리버싱_v.01.03.pdf
0.70MB

'SWING > Reversing' 카테고리의 다른 글

Reversing #3_Crackme2  (0) 2021.03.28
Reversing #2_Crackme1  (0) 2021.03.28
Reversing #1_Hello World  (0) 2021.03.28