Reverse Engineering/Reversing 이론 설명

[리버스_0x07] [번외] Kris의 Reverse Engineering 강의 되짚어 보기_2

mulmajung 2011. 1. 18. 01:13
작성자: Dear. Tom
편집자: 엔시스
출   처: 보안인닷컴 팀 블로그[http://boanin.tistory.com]



kris의 RE강의도 지난 화요일부로 모두 끝이 났습니다. 그러고보니 시간이 꽤나 흘렀네요...^^;
처음에는 하루하루 강의를 모두 정리하려고 했으나, 역시나..제 내공의 부족으로 후다닥(;) 끝내려고 합니다. T_T
 
아래 내용은 2일에서 4일차까지 진행된 내용입니다.  
 
 

1. 개요
 
- System: Windows 2003
- Used Tool: Far, Hiew, Ollydbg, IDA, Soft-Ice, PETools, etc...
- 교재: 4days_sec.pdf (교재파일은 첨부해 놓았으니 필요하신분은 다운로드 받아주시기 바랍니다.) 
 
 
 
 
2. 강의 내용
 
 
1) 프로그램 숨기기
 
실행중인 프로그램의 위치 이동을 통해, 악성프로그램이 숨겨지는 원리(?)에 대해 설명해주려고 했던 것 같습니다.
간략히 프로그램이 동작하는 원리를 살펴보겠습니다.
 
먼저, go-away.exe 파일을 실행해 보겠습니다.
 
프로세스 리스트를 봐도 현재 이 프로그램이 실행중인것을 쉽게 확인 할 수 있습니다.
 



그리고 이 프로세스의 상세 내용을 보면, 이 프로그램의 위치를 손쉽게 파악할 수 있습니다.
(사용자가 만일 자신의 컴퓨터에 이와같이 이상한(?) 프로그램이 실행중이라면, 궁금증을 불러일으킬 것이고, 그 프로그램의 위치를 찾아서 삭제하려고 시도할 것입니다.)
 
 
 
 
그래서 저도 이 프로세스의 위치에 찾아가 보았습니다. 그리고 실행을 시켜봤습니다.
그런데, 아주아주 정상적인 프로그램인 notepad.exe가 실행되는것을 지켜볼 수 있습니다.
어떻게 된 것일까요?
 

 
이 프로그램을 실행시키기 전, 말씀드리지 않고 제가 한 행동이 하나 더 있습니다.
그것은 바로 notepad.exe를 해당 폴더로 복사해오고, 이름을 go-away.exe로 바꾸어 놓은 것입니다.
(이렇게 하지 않으면, 해당 폴더에는 go-away라는 프로그램은 존재 하지 않습니다. 즉, 어디론가 사라져 버린거죠.)
그러니깐 당연히 이 프로그램을 실행하면 노트패드가 실행되는 것입니다.
 

 
그렇다면 기존에 go-away.exe는 어디로 갔을까요??
 
소스를 한번 살펴보겠습니다.
 
                                                                  go-away.c

 #include <windows.h>
#include <stdio.h>

main()
{
char buf[1024];

GetModuleFileName(0,buf, 1024);
printf("%s\n",buf);
MoveFile(buf,"L:\\111222");
gets(buf);

}


 
 
네, L://폴더에 11112222라는 이름으로 이동이 되었네요! (여기서 L://은 c://root 폴더를 뜻합니다.)
그렇다면, 해당 폴더에 가서 다시한번 확인해 보겠습니다.
 
정말로, 새로 생성되어 있습니다.

 
 
 
이 예제를 통해 실행중인 프로세스의 몸체도 이동이 가능하다는 것을 알 수 있었고, 악성코드가 이런 방식으로 자신을 숨길 수 있다는 것을 간략한 예제를 통해 알 수 있었습니다. 
 
 
 
 
2) 정상적인 프로그램에 Shell code 삽입하기
 
먼저, 아주 간단한 프로그램(hello.exe)을 만듭니다.
 
                                                         hello.c
 main()
{
 printf("hello!");
}


 
이 프로그램을 실행해보면, "hello!" 라는 문구를 보여줌을 알 수 있습니다.
이러한 정상적인 프로그램에 악의적인 shell 코드를 삽입해 보겠습니다.
 
hiew로 hello.exe를 읽어옵니다.
 
그리고 EP(Entry Point)를 찾습니다. (간단히 F8을 누르고, F5를 누르면 찾아갈 수 있습니다.)
EP에서 부터 끝까지 블록을 씌웁니다. (shift + 8 을 누르고 ctrl + END 를 누릅니다.)
그리고 다시 처음 EP의 위치로 가서 shell code를 불러옵니다. (이전에 Shift + 8을 다시 한번 눌러 블록 모드를 빠져나옵니다.)
 
 

 
미리 저장되어 있던 shell_1이라는 코드를 불러왔습니다.
그리고 저장 후 hiew를 빠져나가, 이 프로그램을 실행해 봅니다.
 

 
아까와는 다르게 "hello!"라는 문구가 보이지 않습니다! 어떻게 된 것일까요?
olly로 불러와 분석해 보겠습니다.
 
 
 
이 shell code는 socket을 생성하고, 원격에서의 연락을 기다립니다.
또한 정체불명의 "..exe"라는 프로그램을 생성하고, 이것을 실행시킵니다.
(하지만, 제 시스템은 네트워크 환경이 설정되어 있지 않아 보시는 바와 같이 "."프로그램의 크기가 0입니다.
그래서 정확하게 이 shell코드가 어떤 행동을 하는지 확인 해 볼 수는 없었지만, kris의 말에 따르면 원격에서 해당 시스템에 들어올 수 있도록 소켓을 만들어 대기하고,
공격자가 침입해서 어떤 행동을 할 수있게 도와준다고합니다. 더 자세하게는 파악하질 못했네요;;)
 
이 예제를 통해, 정상적으로 보이는 프로그램에 악의적인 shell 코드를 삽입하여 공격자가 원하는 행동을 하게 만들 수 있다는 것을 보았습니다.
 
 
 
3) IDA에서 patchDiff2 플러그인으로 코드 비교하기
 
* 이 플러그인을 이용한 비교과정을 자세히 설명드리고자 했으나...그냥 이런게 있다는 것 정도만 소개해 드리겠습니다.
 
 
patchDiff2 플러그인을 통해서 패치된 코드와 패치되지 않은 코드를 보기쉽게 비교할 수 있습니다.
이러한 비교를 통해 패치되지 않은 프로그램을 향한 공격코드가 생성되기도 한다고 합니다.
 
 

4) 명령어 정리

처음 접해본 Far 프로그램과 Hiew로 인해 처음엔 따라가기조차 힘들었습니다. 그래서 그동안 익힌 명령어들을 간단히 정리해 보고자 합니다. 혹시, 나중에라도 이프로그램을 사용하실 분들에게 조금이라도 도움이 되었으면 합니다. ^^

[ Far ]
 ctrl + Enter  현재 커서가 위치한 파일이름 커맨드창에 자동 입력
 ctrl + E  이전 명령어
 F9  설정창
 F11 -> process list  현재 작업중인 프로세스 리스트 보여줌
 shift + F4  새파일 생성

[ Hiew ]
 Enter  TEXT, HEX, Decode 모드로 전환가능
 shift + 8  블록 선택 모드/해제
 ctrl + End  끝까지 선택
 ctrl + F2  블록 가져오기
 F8 + F5  EP포인트 찾기

 
 
 
3. 후일담
 
이렇게해서 허접한 kris의 RE강의 되짚어보기를 모두 마치겠습니다.
우선, 4일동안 고생해준 kris에게 감사의 말을 전하고 싶습니다. 게다가, 무료강의에다 자료도 무료로 재배포해도 된다고 허락해 주었습니다~ 허락을 구하면서, blog.boanin.com을 소개해 주었는데, 모두 한국어라 매우 아쉬워했습니다. 자신이 읽을 수 있는 좋은 방법이 없냐고 물어보는데...할 말이 없었습니다; 제가 영어 실력이 좀 더 뛰어나다면 미남닷컴님처럼 영어로 포스팅을 시도해 볼 수 있었을텐데..아쉽네요. ^^;
혹시나 kris의 RE강의 자료가 필요하신분이 계시다면, 댓글로 메일주소를 남겨주세요~ 보내드리도록 하겠습니다. ^^