'inline patch'에 해당되는 글 1건

  1. 2010.09.24 [Reversing With Lena] lena's tutorial 15 풀이

1. 개 요
예제 문제 및 강의 내용 출처 : http://www.tuts4you.com/

이번 Lena의 15장 강의에서는 14장에 이어 inline patch 기법을 이용한 크랙 방법을 설명한다.

2. 사용도구
Ollydbg :
http://www.ollydbg.de (+ BOOKMARK / NonaWrite1.1 Plugins)

3. 내 용
먼저 OllyDbg를 이용하여 프로그램을 로딩한 뒤 동작을 살펴보자.
프로그램을 실행하면 Nag 1 화면이 나타나는 것을 볼 수 있으며, 이어서 ReverseMe 라는 프로그램이 실행된 두 Nag 2 화면이 나타나는 것을 알 수 있다. 이번 강의의 목적은 Nag 1과 Nag 2를 제거하는 것이다.

이번에는 Call Stack을 이용하여 Nag 1 실행을 호출하는 부분을 찾아보도록 한다. 먼저 프로그램 실행 후(F9) Nag 1 화면이 나오면 프로그램을 중지(F12)시킨 후, Call Stack(Alt+K)을 살펴보자.
위의 그림과 같은 Call Stack을 볼 수 있으며, ①번에서 Nag 1을 생성하는 함수를 호출함을 알 수 있다. ①번을 더블클릭하여 이동해 본다.

위 그림의 ①번 부분에서 Nag 1을 생성하는 함수를 호출하는 것을 볼 수 있으며, 해당 함수를 호출하는지 여부를 결정하는 조건 분기문은 ②번 부분의 JE 구문에 의해서 결정됨을 알 수 있다. ②번에 BP(Break Point)를 걸고 F9를 눌러 계속해서 프로그램을 실행해 본다.

위 그림과 같이 ReverseMe 메인 프로그램을 호출하는 부분도 Nag 1을 호출하는 부분과 동일함을 알 수 있다.(Nag 2 또한 동일한 위치에서 호출되어 진다.) 따라서 JE 구문에서 단순히 Nag 1이 호출되지 않도록 JE를 JMP 또는 JNE로 변경하는 등의 방법은 사용할 수 없음을 알 수 있다. 일단 JE 구문에 Bookmark를 설정해 두자.(우클릭 -> Bookmark -> insert bookmark 0)

14강에서 진행한것 처럼 inline patch를 이용하여 Nag 윈도우들을 제거해 보도록 한다. 일단 JE 구문에서 BP가 걸려있는 상태에서 code injection을 위하여 사용하지 않는 빈 메모리 공간이 있는지 스크롤바를 내려보자.
위 그림과 같이 00437D62에 사용되지 않는 메모리 공간이 있음을 확인할 수 있으며, 해당 부분에 code injection을 하기로 한다.(Lena는 이부분을 code cave로 지칭한다.) 00437D62에 Bookmark를 설정해 둔다.(우클릭 -> Bookmark -> insert bookmark 1)

또한 변수 사용을 위한 공간을 찾아야 한다. 변수의 경우 .data 섹션에 위치하므로 Alt + M을 눌러 메모리 맵에서 .data 섹션을 선택한다. 밑으로 스크롤을 조금 내려보면 아래 그림과 같이 00396330 주소의 공간이 사용가능한 것을 알 수 있다.


이후 다시 실제 JE 구문이 있는 곳으로 돌아간다. 일종의 팁으로 쉽게 JE 구문으로 돌아가기 위해 위 그림에서와 같이 EIP를 더블클릭한다.

이제 JE 구문을 code cave가 저장될 주소(00437D62)로 분기하도록 구문을 변경해야 한다. 하지만 JE 구문은 OP code에서 보면 알 수 있듯이 2 Bytes만 사용하는 것을 볼 수 있다. 하지만 long jump 구문의 경우 총 5 Bytes가 사용된다. 따라서 JE 구문을 JMP 구문으로 변경시 뒤에 있는 LEA ECX, DWORD PTR SS:[ESP+4C] 구문도 덮어 씌워 지는 것으로 예상할 수 있다. 따라서 LEA ECX, DWORD PTR SS:[ESP+4C] 구문은 따로 기록했다가 code cave의 마지막 부분에서 실행하도록 한다.

아래와 같이 JE 구문(0x420379)을 더블클릭하여 JMP 구문으로 code cave로 이동하도록 변경한다. 위에서 설명한것처럼 "LEA ECX, DWORD PTR SS:[ESP+4C]" 구문도 덮어씌워 지는 것을 알 수 있다.

code cave에 기록될 문구들은 NonaWrite(Plugins -> NonaWrite -> NonaWrite)를 이용하여 기록하기로 한다.
각각의 의미는 다음과 같다.
0x437d62:                                // code injection을 수행할 메모리 주소를 입력한다.(끝에는 ":"을 입력)
inc byte ptr [396330]             // .data section에서 사용하기로 한 변수의 주소
cmp byte ptr [396330], 2       // 변수 값을 2와 비교
jnz 4203ba                             // 변수 값이 2일 경우 Nag 및 main 화면을 생성하는 CALL 함수 다음 부분을 수행
lea ecx, dword ptr ss:[esp+4c]  // JE구문을 JMP로 변경 후 덮어씌워진 부분 추가
jmp 42037f                               // 실행 횟수가 2 미만일 경우 42307f 수행
변수의 값이 2일 경우 즉, main program을 생성하는 부분에서만 0x42039A의 CALL 명령어 수행되게 되므로 Nag 1과 Nag 2는 시행되지 않게 된다.

실제로 code cave가 생성이 되었는지 확인한다.

이제 patched 된 파일을 저장한 뒤 정상적으로 작동하는지 확인한다. 저장한 파일을 OllyDbg를 이용하여 다시 로딩한 뒤 0x420379 주소에 BP를 건다.

첫번째 code cave 실행시에는 아래와 같이 0x396330 주소의 변수 값이 1이므로 JNZ 구문에 의해서 0x4203BA 주소로 분기하게 되므로 Nag 1이 실행되지 않는다.

두번째 code cave 실행시에는 0x396330 주소의 변수 값이 2이므로 JNZ 구문이 실행되지 않고 JMP 구문이 실행되는 것을 볼 수 있다.

4. 결 론
pointer를 이용한 code injection 기법을 이용한 크랙 방법을 살펴봤다. code injection은 실제 크랙이나 악성코드에서도 자주 사용되는 기법이므로 앞으로 좀 더 심도있는 공부가 필요할 듯 하다.

                                                                                                    +---------------------------------+
                                                                                                    | Infinite Flow..                              |
                                                                                                    | mail : geekspark@gmail.com         |
                                                                                                    | Blog : http://sinun.tistory.com       |
                                                                                                    | twitter : @unpacker                      |
                                                                                                    | CISSP                                        |
                                                                                                    +----------------------------------+
저작자 표시 비영리 변경 금지
신고
Posted by By. PHR34K