'OllyDbg'에 해당되는 글 5건

  1. 2010.04.07 [Reversing With Lena] lena's tutorial 12 풀이

1. 개 요
예제 문제 및 강의 내용 출처 : http://tuts4you.com lena로 검색

이번 Lena의 12장 강의에서는 11장 강의에 의해 좀 더 심도있는 프로그램의 patch 방법을 보여준다.

Ollydbg : http://www.ollydbg.de
PEiD : http://peid.has.it

2. 분 석
먼저 PEiD를 이용하여 바이너리 분석을 해보자.
위와 같이 Delphi 6.0 - 7.0으로 만들어졌으며, packing이 되지 않았다는 것을 알 수 있다.
본격적으로 Ollydbg를 이용하여 프로그램을 살펴보자.

프로그램 로딩 후 마우스 우클릭 -> Search for -> All referenced text strings 선택 후 Search for text 선택 후 주로 프로그램 인증과 관련된 키워드인 regist로 검색을 해보자.
위와 같이 쉽게 인증키 등록과 관련된 text를 찾을 수 있으며 표시된 문자열 위쪽에도 역시 관심갈 만한 문자열들을 볼 수 있다. "Registration Key accepted!" 부분을 더블클릭해서 해당 부분으로 이동해 보자.

①번 라인에서 우리가 원하는 문자열을 볼 수 있다. 그렇다면 ①번 라인은 어디에서 호출되어 지는 것일까? 코드의 구성 상 특이사항으로 ②번 라인에 RETN 코드가 있는 것을 볼 수 있으며, ③번 라인에서 004A5831 주소로 다시 jump하는 것을 알 수 있다. 여기서 약간의 트릭을 알 수 있다. 일반적으로 특정 주소로 분기할 경우 "jmp [register+something]"식으로 이루어지지만 PUSH 후에 RETN 구문이 오게되면 unconditional jump를 수행하게 된다.(자세한 내용은 다음 강의에서 다룬다.) 따라서 ④번 구문에서 PUSH 구문을 통해 특정 주소값을 스택에 저장한 뒤 뒤에오는 RETN 구문을 통해 004A5841 주소로 분기하게 된다.
 004A5841 주소를 선택한 뒤 Ctrl+R을 누르게 되면 해당 주소와 관련된 주소와 명령어를 볼 수 있다.
위 그림과 같이 일단 군데에 BP를 설정하도록 한다.

스크롤을 위로 올려 프로그램 구조를 더 살펴보자.
위와 같은 구문을 찾을 수 있다. 그림과 같이 BP를 설정한 뒤 F9를 눌러 프로그램을 실행해 보자.

위와 같이 프로그램 실행하고나면 프로그램의 타이틀에 <unregistered>라는 구문을 볼 수 있으며, Help -> About을 선택하면 프로그램 정보에도 <Unregistered Version>이라는 문구를 볼 수 있다. 우측 하단의 "Use Reg Key"를 클릭하여 세 가지 입력값에 아무 값이나 입력후 "Register"를 클릭해 보자.

위에서 설정한 BP에서 프로그램의 실행이 정지되는 것을 볼 수 있으며, F8을 눌러 프로그램을 진행하다 보면 ①번 부분에서 ntdll 모듈로 분기되는 것을 알 수 있다. 분기 후 다시 돌아오기 위해서는 "-" 버튼을 클릭하면 된다.  프로그램의 흐름을 계속적으로 살펴보기 위해 ①번 부분을 NOP 처리하고 계속 프로그램의 흐름을 살펴보자.

진행을 하다 보면 위와 같은 구문을 볼 수 있다. 1번 구문에서 분기가 이루어지지 않는 다면 "Error...."구문을 만나는 것을 볼 수 있다. 따라서 ZF를 1로 설정하여 계속 프로그램의 흐름을 보자. ①번과 ②번에 BP를 설정한 후 계속 프로그램의 흐름을 보도록 한다.

아래와 구문을 만난게 된다. ①번 분기 구문에서 분기하는 곳을 따라가 보면 우리가 출력되길 원하는 "Registration Key accepted"를 넘어가는 것을 알 수 있다. 따라서 일단 BP를 설정하고 ZF를 1로 설정하여 계속 프로그램의 흐름을 보도록 하자.

계속 진행하다 보면 위와 같이 성공적으로 키 값이 등록되는 것을 볼 수 있다.

프로그램의 영구적인 patch를 위해서 아래와 같이 구문을 변경해 준다.
004A567E 주소의 JNZ 구문을 NOP 처리해 준다.
004A55ED 및 004A5611의 조건 분기구문을 JMP로 변경한다.

                                                                +---------------------------------+
                                                                | Infinite Flow..                              |
                                                                | mail : geekspark@gmail.com         |
                                                                | Blog : http://sinun.tistory.com       |
                                                                | CISSP                                        |
                                                                +----------------------------------+

저작자 표시 비영리 변경 금지
신고
Posted by By. PHR34K