2020. 3. 12. 22:01ㆍ보안/리버싱
내용 : https://www.tuts4you.com/ 에 있는 crackme 문제 중 1번을 풀이한다.
가. 프로그램 살피기
1. Nag Screen
Nag를 없애고, registration코드를 찾아라! 라는 화면이 나오고, 이 창의 이름은 Nag Screen이다.
즉 현재창이 나오는 것을 지우라는 뜻인것 같다.
1-1. 확인
2. 로 이동한다.
1-2. 취소
[프로그램 종료] 로 이동한다.
2. Regcode 입력창
Use SmartCheck to reg!를 보니 SmartCheck라는것을 사용하라는 힌트로 보인다.
SmartCheck는 Numega 사이트에서 만든 유틸리티이며 크래커들이 애용하는 툴 중 하나라고 한다.
2-1. Program
Exit이 쓰인 선택창이 나오고 이를 누르면 [프로그램 종료] 로 이동한다.
2-2. From
위 그림과 같은 창을 출력한다.
확인을 누르면, 위 그림의 창을 닫는다.
2-3. Register me!
위 그림과 같이 Register를 판별하는 부분인듯하다. RegCode를 입력하지 않은 채로 인증을하여 실패 문구가 나온다.
확인을 누르면 창이 닫힌다.
2-4. Nag?
[1]의 NagScreen이 띄워진다.
같은 주소에 있는 창을 띄우는지, 2개인지 아직 알지 못한다.
나. OllyDbg 디버거로 분석하기
1. Nag Screen 제거하는 패치하기
위 창에서 모든 MessageBox를 호출하는 부분에 BreakPoint를 잡아주었다.
총 4개의 MessageBox가 잡히는데, 하나씩 호출하며 각 MsgBox를 구분하기 쉽도록 Comment에 기록해버렸다.
우선 Nag Screen은 1개라는것을 알게 되었고, 맨 처음 프로그램을 실행하면 Nag Screen 주소로 넘어간다.
NagScreen의 [확인]의 경우 EAX가 1, 아닐경우 0을 반환한다는 것을 알 수 있다.
00402CFE | CALL <JMP.&MSVBVM60, #595>
위 주소로 넘어가게 되면 위 MsgBox를 호출한 함수 초입, 스택프래임을 형성하는 부분을 찾을 수 있게 된다.
즉, Nag Screen이 튀어나오게 되는 과정을 보면
CALL 0402C18 [Nag 버튼 이벤트 시작지점]-> CALL <JMP.&MSVBVM60, #595>[MessageBox 호출]
인 것을 알 수 있다.
즉, Nag MessageBox 함수 호출 코드 역시 다른 함수 내부에 속해있는 코드인 것을 알수 있다.
따라서, 상위 함수 [Nag Event Handler]을 호출하지 못하게 하거나, 바로 리턴해버리면 된다.
1-1. 함수의 파라미터 개수 확인하기
함수에 전달된 파라미터만큼 스택을 보정해주어야 하므로, 파라미터의 개수를 확인할 필요가 있다.
위의 함수는 함수 호출 규약의 stdcall이므로, callee에서 정리된다.
즉 함수의 끝을 확인하여 리턴 값을 확인하면 될 것 같다.
함수 리턴 주소는 스택영역에 저장되어있으므로, 확인해 보았다.
코드 영역에서 [Ctrl + G] 를 눌러 해당 리턴 지점으로 가서, 리턴 값을 확인하기로 하였다.
75EE6377번 주소를 보면 4 라는 값을 리턴해주는것을 알 수 있다. 즉 파라미터는 4개이다.
(여기까지 알아내는데 오랜 시간이 걸렸다... 최후에는 책과, 아래 블로그 등을 참고하였습니다.)
[ Reversing ] 함수 파라미터 개수 확인
1. [ Reversing ] 함수 파라미터 개수 확인 함수에서 사용한 파라미터의 개수를 확인 할 수 있는 방법입니...
blog.naver.com
다시 Nag Screen 이벤트의 시작지점으로 올라가서 아래 Nag Screen이 뜨기전에 4라는 값을 리턴을 해버려서 실행을 건너뛰는 방식으로 패치를 해주었다.
이후부터는 Nag Screen이 튀어나오지 않는것을 알 수 있다.
혹시나 해서 executable file에 copy 한 후 실행시켜보았지만 제대로 패치된 것을 볼 수 있다.
패치된 exe 파일을 첨부하였다.
2. RegCode 찾기
다음으로 RegCode를 찾아보아야 하는데, 이전에 풀이했던 crackme2와같이 찾을수 있지 않을까 하여 실행을 하고 스택 영역을 확인해보았지만 별다른 소득은 없었다.
이전에는 이름에 따라 시리얼을 생성하는 방식이었으나, 이번에는 아예 저장된 문자열을 가지고 확인하는 방식일 것이라 추측하고 정답을 출력하는 MessageBox 출력창 주소로 넘어가 뒤져보았다.
위에 실행으로는 보지 못한 Unicode 문자열 "I'mlena151" 이 나온것을 보고 Register 해보았다
너무 때려맞춘 감이 있어, 책을 인용해보자면
정답이 나온 줄 아래에 __vbaStrCmp 라는 함수가 호출되는것을 볼 수 있는데,
이는 문자열을 비교하는 함수라고 한다. 즉 이를 통해 위가 정답 코드라는것을 알 수 있게 된다.
'보안 > 리버싱' 카테고리의 다른 글
[Reversing] 리버싱 핵심원리 [11]. abex' Crack Me 4 풀이 (0) | 2020.03.15 |
---|---|
[Reversing] 리버싱 핵심원리 [10]. abex' Crack Me 3 풀이 (0) | 2020.03.15 |
[Reversing] 리버싱 핵심원리 [8]. 함수 호출 규약 (0) | 2020.03.03 |
[Reversing] 리버싱 핵심원리 [7 - 2]. abex' 2nd crackme 풀이 - 시리얼코드 생성 함수 분석 (0) | 2020.03.02 |
[Reversing] 리버싱 핵심원리 [7 - 1]. abex' 2nd crackme 풀이 (0) | 2020.02.27 |