컴퓨터 바이러스란 의미가 요즘은 악성코드 혹은 시스템을 파괴하는 형태로 쓰여지고 있다. 근데 왜 바이러스라고 부를까...

초창기 바이러스 프로그램은 실제 의학에서 쓰는 바이러스 용어처럼 숙주가 없인 살수 없고 숙주 프로그램에 묻어서 실행되는 코드를 의미한다. 즉, 원래의 실행 파일에 바이러스 코드가 삽입되서 실행된 후, 원래의 코드로 다시 점프해서 바이러스 자신을 숨길 수 있다. 이런 바이러스 코드들은 어셈블러와 OS 로더 구조를 조금만 이해하면 금방 짤 수 있다.

이번 시간에는, 실제 바이러스코드가 아닌 원래의 프로그램에 원하는 코드를 넣어 실행한 후 오리지널 프로그램으로 점프하는 방법을 소개한다.

테스트는 Windows 7 SP1 에서 테스트 되었으며, 프로그램은 비주얼 스튜디오 2008 SP1 에서 컴파일 되었다.

1. 간단한 메세지 박스 출력 프로그램
MessageBox 함수를 이용하여 Hello, World를 출력하는 간단한 프로그램을 만들어 보자.

#pragma comment(linker,"/ENTRY:main /FILEALIGN:0x200 /MERGE:.data=.text /MERGE:.rdata=.text /SECTION:.text,EWR /IGNORE:4078")
#include 
int main(int argc, char *argv[])
{
    MessageBox(NULL, "Hello, World", "waintman.tistory.com", MB_OK);
    ExitProcess(0);
}

링커 옵션은 분석을 쉽게 하기위해 텍스트 영역과 데이터 영역을 통합하기위해 사용되었다.
프로그램을 실행하면 "Hello, World" 를 출력하는 메세지 박스가 뜬다.

코드를 분석하기 위해 올리디버거를 이용한다.

올리디비거로 위에서 만든 프로그램을 열어보면, 아래 그림과 같다.


윈도우7 비주얼 스튜디오 2008에서 컴파일시 기본적으로 ASLR(Address Space Layout Randomization)을 지원한다. 즉 실행될 때마다 ImageBase 값이 바뀌게 된다. 그렇기 때문에 비주얼 스튜디오에서 이 옵션을 해제한다.
(참고 사이트: http://www.reversecore.com/69)


올리디버거로 분석한 코드를 살펴보면,
MessageBox 함수는 4개의 파라미터를 입력받으므로 4개의 파라메터들을 스택에 push 한다. 스트링의 경우 0x00401018,
0x00401030에 있는 값들을 넣게 된다. 그리고 MessageBox 함수는 0x00401080에 적혀있는 주소값이 된다.

PE 헤더의 Import Address Table 을 분석하면 0x00401080에 MessageBox 함수의 주소를 적는다는 것을 알 수 있다.

이제, "virus" 라는 메세지 창을 띄우는 코드를 삽입하면 된다. 일단 메세지 박스 함수의 주소는 0x00401080이란 것을 알아내었으니, "virus" 란 글자를 데이터 영역에 쓰기만 하면 된다. 문자열은 텍스트 영역중에서 0x00401060부터 쓰고 그 뒤에 MessageBox를 실행하는 코드도 같이 적어준다. 메모리 영역 0x00401060의 주소는 파일 오프셋 0x00000260dp 에 위치한다. 파일 오프셋을 얻는 방법은 PEview 나 직접 PE 포맷을 분석하면 얻을 수 있다.

삽입된 코드는 다음과 같다.



원래의 OEP로 가기 위해 mov eax, 0x00401040; jmp eax 를 사용하였다. 그리고 PE 헤더의 AddressOfEntry 값을 0x00401066으로 고친뒤, 실행하면 virus 메세지 박스가 먼저 실행되고, Hello, World가 나오는 것을 확인할 수 있다.

이런과정을, 프로그램을 통해서 직접 수정하게 되면 기본 바이러스 프로그램을 만들 수 있을 것이다.

+ Recent posts