<리버싱 핵심 원리>로 공부하였다.
11 Lena's Reversing for Nebies
https://forum.tuts4you.com/files/file/1307-lenas-reversing-for-newbies/
이 링크에서 40개의 crackme를 다운 받을 수 있다. 강의도 있다고 했는데 플래시였어서 그런지 나한테는 보이지 않았다.
책 속에서 한 실습은 10번째 파일 속 Tut.ReverseMe1 파일이었다.
11.1. 실행
처음에 실행이 안됐는데 MSVBVM50.DLL 파일을 다운 받아 실습할 파일과 같은 폴더에 위치시켜주니까 해결되었다.
일단 처음에 실행하면 위 화면처럼 나온다. 모든 Nag를 없애고 registration code를 찾으라고 한다.
OK를 누르면 다음 화면이 뜬다.
registration을 위해 smartcheck를 쓰라고 한다. Register me!를 누르면 아래 창이, Nag?를 누르면 Nag Screen이 뜬다.
11.2. 분석
11.2.1. 목표(1) - 메시지 박스(Nag Screen) 제거!
방법 1 : 메시지 박스 함수를 호출하는 부분을 제거(call msgbox 이런 부분)
방법 2 : 메시지 박스 함수를 호출하는 상위 함수가 호출되지 못하게 하거나 바로 리턴하게 한다.
Nag Screen이 뜨는 경우 : 프로그램이 시작 될 때/Part10Tut.ReverseMe창에서 Nag?버튼을 눌렀을 때
이제 디버거에서 실행해보자.
Visual Basic에서 사용하는 메시지 박스 API : MsgBox
메시지 박스 호출되는 부분을 찾자! :
① Nag Screen 문자열 검색으로
② 메시지 박스 함수 자체 검색 : MSVBVM50.rtcMsgBox() 함수
우클릭 - Search for - All intermodular calls - Dest name 정렬
위와 같이 rtcMsgBox 함수가 총 4개 있는 것을 확인할 수 있다.
우클릭 - Breakpoint on all calls to rtcMsgBox()를 눌러 모든 rtcMsgBox 함수에 BP를 걸어준다.(이 중에 정확히 어떤게 Nag Screen 메시지 박스를 뜨게 하는 건지 모르니까!)
이제 f9으로 실행시켜 본다.
처음 f9을 누르면 402CFE 직전까지 실행이 된다. 해당 줄의 윗부분을 보면 Nag Screen 창 관련 문자열이 있는 것 확인.
402CFE 줄 실행 시 Nag Screen이 뜬다. (시작할 때 Nag Screen 뜨도록 하는 함수를 호출하는 주소 찾은 것)
Nag? 눌렀을 때도 똑같이 402CFE에서 멈춘다. = Nag Screen을 띄우는 두 경우의 함수 호출 주소 같음.
==>찾았던 4개의 rtcMsgBox 중 Nag Screen을 띄우는 건 저거 하나임!(이것만 수정하면 된다)
해당 줄 우클릭 - Edit - Binary Edit - 83 C4 14 90 90로 변경
83 C4 14 : ADD ESP, 14 (함수 호출 이후 스택 정리의 용도)
90 : NOP
하지만 이렇게 수정하고 실행하면 문제가 발생한다. (실행이 안되고 위 상태로 멈춤)
이유는 바로 MsgBox가 리턴값이 존재하는 함수인데 그 부분에 대해 처리를 해주지 않았기 때문이다.
리턴값이 EAX에 들어가게 되고 그 값에 따라 무언가 행동할거라 예상할 수 있다. 이를 해결하려면 명령어를 또 수정해야하는데 기존 바이트 수를 넘기도 하고 EAX 값으로 정확히 어떤걸 판단하는지 모르니까 다른 방법을 사용하는 것이 좋다.
두 번째 방법 : 메시지 박스 함수의 상위 함수 호출 부분 수정
메시지 박스 호출 함수 앞 부분에서 스택 프레임 생성 부분을 찾는다.
총 3바이트로 되어있는 스택 프레임 생성 부분(402C17~402C18)을 찾았다. 이 부분을 C2 0400(RETN 4)으로 수정한다.
함수에 전달된 파라미터만큼 스택을 보정해 리턴 한 것이다.
4바이트의 스택을 정리해야 하는 것을 어떻게 알았을까?
<402C17 함수의 파라미터 개수를 확인하는 방법>
402C17에 BP를 걸고 해당 직전에 멈췄을 때 스택을 보면
리턴 주소를 확인할 수 있는데 이 리턴 주소로 가보자.
그럼 이렇게 되어있는걸 볼 수 있고 740DE5A9 바로 위에 CALL이 있다. 740DE5A7에 BP를 걸고 재실행해보자.
740DE5A7 BP에 걸렸을 때 EAX는 402649이다. 이 쪽으로 가보자.
해당 부분으로 가면 바로 아래 결국 402C17로 점프하는 것을 볼 수 있다.
즉 740DE5A7 주소의 CALL EAX 명령으로 402C17 함수가 호출된 것이다.
그럼 740DE5A7 주소의 CALL EAX 명령 호출 전/후의 스택 주소를 확인하면 402C17 함수 파라미터의 개수를 알 수 있다.
18F440 - 18F43C = 4이므로 4바이트인 것을 알 수 있다.
근데 사실 얘도 방법 1과 동일한 문제가 발생할 수도있지만 이 프로그램에서는 다행히 정상작동한다.
목표(2) - Registration Code 찾기
아무거나 입력하면 잘못됐다고 뜬다.
저 문자열을 찾아가보자.
해당 402A69 주소로 가면, 다음과 같은 코드를 볼 수 있다.
보니까 좀 위쪽에 vbaStrCmp, 비교하는 함수가 있는 것을 확인할 수 있다. 즉 바로 위에 있던 I'mlena151과 입력된 문자열을 비교하는 것이다. 입력란에 해당 문자열을 입력해보자.
이렇게 해결하였다~