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

이번 Lena의 8장 강의에서는 W32Dasm과 LoadPE 툴을 사용하며 아래 주소에서 무료료 받아볼 수 있다.

W32Dasm : http://www.cracklab.ru/download.php?action=get&n=MzA=
LoadPE : http://www.cracklab.ru/download.php?action=get&n=MjA=

W32Dasm의 경우 디스어셈블러 툴로 프로그램의 내용을 디스어셈블하여 어셈블리 명령어 형태로 사용자에게 제공한다. LoadPE의 경우 PE 파일의 구조를 볼 수 있으며 Hex Edit의 기능을 제공한다.

Lena의 강의에서는 W32Dasm을 이용하여 디버깅을 진행했지만 현재 PC의 환경이 윈도우 7이라서 그런지 W32Dasm이 작동을 하지 않는다 -_- 따라서 Ollydbg를 이용하여 동일한 방법으로 진행을 해보겠다. 일단 프로그램을 Olly로 로딩하여 nag를 찾아보자.

최초 실행시 등록되지 않는 버젼이라는 경고창이 나타난 뒤 사라지는 것을 볼 수 있다. 상단 메뉴의 물음표를 클릭하여 "Register"를 클릭하여 임의의 값을 입력한 뒤 "OK" 버튼을 클릭하면 위와 같이 "Invalid Key!" 경고문과 등록이 되지 않는 것을 볼 수 있다. 경고문으루 출력된 내용을 text string을 찾아보자.

마우스 우클릭 -> Serach for -> All referenced text strings -> 마우스 우클릭 -> Search for text 기능을 이용하여 해당 문자열을 쉽게 찾을 수 있다. 해당 문자열을 더블클릭!!

구조를 보면 다음과 같다. 일단 ④번 부분에서 MessageBox 함수를 이용하여 잘못된 키코드라는 메시지가 출력되는 것을 알 수 있으며, ③번 부분에서 Thank You for Registering! 이라는 문구를 보니 정상적인 키코드일 경우 등록되는 부분인 것을 유추할 수 있다. 그렇다면 두 부분을 나누는 조건 분기문은 어디에 있을까?
④번 부분으로 분기해서 오는 부분을 보면 ②번에서 오는 것을 알 수 있다. 해당 JE 구문을 JNE나 NOP 처리해주면 정상적으로 등록되는 부분으로 프로그램이 흐르는 것을 볼 수 있다. 하지만 항상 그런식으로만 공부를 하다 보면 실력이 늘지 않겠지 :)
좀 더 살펴보자. TEST EAX, EAX에서 EAX 레지스터가 0으로 설정될 경우 분기가 일어나는 것을 알 수 있으며, ①번에서 함수가 호출된 뒤에 EAX 레지스터의 값이 0으로 설정되는 것을 알 수 있다. ①번에 BP를 설정하고 Step-in!!!

Step-in하여 프로그램을 진행하다 보면 ①번 부분에서 XOR EAX, EAX 명령어로 인하여 EAX 레지스터의 값이 항상 0으로 설정되는 것을 확인할 수 있다.(같은 값을 XOR하면 그 결과는 항상 0이다!!) 따라서 이 부분을 NOP 처리해주면 EAX값이 0으로 설정되는 것을 막을 수 있다.
Olly에서 바로 해당 명령어를 수정할 수도 있지만 이번에는 LoadPE 툴을 이용해 보기로 한다. 일단 LoadPE를 실행한 뒤, PE Editor를 클릭하여 프로그램을 로딩한다.

위와 같이 PE 파일의 구조에 대해서 간략한 정보를 사용자에게 제공해 준다. "Sections"을 클릭하면 Section table에 대한 정보를 제공해 준다. 우측 메뉴의 FLC를 클릭하여 우리가 변경해줘야 하는 명령어가 있는 곳의 VA(Virtual Address) 값을 입력해 보자.

우리가 변경하고자 하는 명령(XOR EAX, EAX)의 VA값을 입력하면 자동으로 RVA 값과 Offset값을 생성해 주는 것을 볼 수 있다. 위의 예에서는 RVA의 값과 Offset의 값이 동일하지만 항상 그렇지만은 않다. Bytes 부분을 보면 우리가 변경하고자 하는 명령어의 OP Code 값을 확인할 수 있다. 우리는 OP Code 33 C0를 90 90(NOP NOP)로 변경해야 한다. 우측 하단의 Hex Edit 버튼을 클릭하자.

위와 같이 OP Code 값을 90 90 으로 변경 후 저장하자.
※LoadPE에서는 다른 이름으로 저장하기 기능이 없다. 따라서 기존의 프로그램을 백업 받은 후 저장을 하는 것이 좋다.

저장을 한 뒤 프로그램을 실행하여 아무 값이 Key-Code에 입력한 뒤 Register를 하면 등록이 되는 것을 볼 수 있다.

이번 Lena의 강의에서는 Olly 뿐만이 아닌 다른 툴을 이용하여 리버싱을 하는 것을 보여주고 있다. Olly를 이용하는 것과 개념은 비슷하다. 다른 툴을 사용해 보면 역시 Olly가 얼마나 편하고 훌륭한 툴인지 알 수 있다 :)

                                                                +---------------------------------+
                                                                | Infinite Flow..                              |
                                                                | mail : geekspark@gmail.com         |
                                                                | Blog : http://sinun.tistory.com       |
                                                                | CISSP                                        |
                                                                +----------------------------------+
신고
Posted by By. PHR34K