본문 바로가기

잡다

fetal error virus

http://blog.naver.com/forc1?Redirect=Log&logNo=40013780060
CIH 체르노빌 바이러스 KILLCIH
deaktop.ini - textmege / viking
system32hal.dll
npkcmsvc.exe.npz -> c:\ windows\temp
1. CIH 바이러스의 원리 (9x)
1998년 5월 31일 변형된 1.4버젼의 소스를 기준으로 바이러스의 구조에 대한 간단한 설명입니다. CIH의 코드는 1/4이 Ring3에서,
나머지 3/4이 Ring0에서 실행되도록 설계되었습니다. Ring3의 코드는 Ring0의 코드를 실행하기 위해서 인터럽트 0x03번을 자신의
Ring0코드가 있는 주소로 바꾼후 int 03을 실행하여 ring0로 진입합니다. 이후 VxD의 파일시스템 드라이버를 후킹하여 파일이
액세스 될때마다 바이러스를 감염시키고 CMOS와 디스크의 섹터를 파괴 시키죠. (CIH는 자기 자신을 스스로 로드하는 VxD드라이버
라고 보는게 좋습니다. ^^)

2. XP 시스템에서는 어떻게 동작해야 할까?
일단 CIH 바이러스는 9x에서밖에 동작안하며 대부분 코드 또한 VxD 기준이므로 많은 부분이 변형되어야 합니다.
첫번째로, Ring0 모드로 진입하는 부분은 2월 18일 뉴스그룹을 통해 포스트된것과 같이 ZwSystemDebugControl()이라는 특별한 API
함수를 사용해야 합니다. (idt 테이블은 0x80000000위에 존재하기 때문에 바로 액세스 할 수 없습니다.) 문제는 이 함수를 어떻게
호출할수 있나 하는 것이죠. 두가지 방법이 있는데, 하나는 import table에 위의 함수를 추가하는 것이고, 다른 하나는 kernel32.dll
이 항상 같은 주소로 로드되기 때문에 import table을 직접 파싱하여 주소를 알아내는 것이죠. 개인적으로 전자의 방법이 더 좋다고
생각 합니다.
두번째로, 어떻게 ntoskrnl.exe의 인스턴스 주소를 알아내는가 하는 것이죠. 일단 바이러스에 감염된 코드는 어플리케이션이기 때문에
0x80000000 아래에 위치하게 됩니다. 이는 언제라도 스와핑 될수 있으므로 파일시스템 후킹 핸들러로 사용하기에는 문제가 있죠.
따라서 핸들러 루틴을 커널메모리로 복사해야 하는데, 이걸 위해서는 메모리 할당 루틴을 사용해야 합니다. VxD에서는 int 20h와
dword값의 id를 이용하지만 NT시스템에서는 어플리케이션의 경우와 마찬가지로 PE 파일에서 익스포트된 함수를 호출하는 방식입니다. 따라서
ExAllocatePool이라는 메모리 할당함수를 호출하기 위해선 이를 서비스해주는 ntoskrnl.exe의 주소를 알아내야 한다는 결론이 나오죠.
찾는 방법은 0x80000000번지 부터 0xFFFFFFFF 번지까지 메모리 검색을 하여 'MZ'이라는 signature를 찾고 이후 'PE' signature를 찾고
여기에서 'ExAllocatePool'이라는 함수가 익스포트되어 있는지를 찾아내야 합니다. "어떻게 이런 무식한 방법을" 이라고 말하실수도
있겠지만 실제로 ntoskrnl.exe가 로드되는 주소는 0x80x00000이므로 눈 깜빡할 사이에 찾아 냅니다. ^^  이렇게 찾아낸 후에 이들을
call 명령어로 호출하면 되는 것이죠.
세번째로, 파일 시스템을 어떻게 후킹할 것인가 하는 것이죠. VxD와는 달리 XP(NT) 시스템에서는 파일 시스템을 후킹하기 위해선
필터 드라이버 형식으로 프로그래밍 해야 합니다. 하지만 이건 코드가 복잡해지고 힘들기만 하죠. 여러분이 간단하게 사용하실수 있는
방법은 아래의 예제에 있는 FuckingSymantec과 같이 시스템 서비스 테이블을 수정하여 사용하는 것입니다. (실제로 FuckingSymantec에
FileRead대신 FileWrite 함수를 사용하면 바이러스를 감염시키는 드라이버가 되죠.) 시스템 서비스중 ZwQueryDirectoryFile 루틴을
후킹하여 사용하시면 CIH와 동일한 효과를 누리실수 있습니다. ^^

3. 완성된 방법
(1) sidt 명령을 사용하여 idt table의 주소를 얻어온다. (0x80000000 위에 있다.)
(2) ZwSystemDebugControl() 함수를 사용하여 우리가 게이트로 사용할 0x03번의 idt entry가 있는 메모리를 우리의 코드주소로 변경한다.
(3) int 03 을 실행하여 ring0로 진입한다.
(4) 진입후 ntoskrnl.exe가 로드된 메모리 주소를 구하기 위해 0x80000000 부터 'MZ', 'PE' 시그네쳐를 검색한후 ExAllocatePool이란
   함수를 익스포트한 모듈의 주소를 찾는다.
(5) 익스포트 테이블에서 앞으로 우리가 사용할 함수의 메모리 주소를 저장해 놓는다. (ExAllocatePool과 서비스 테이블)
(6) ExAllocatePool로 NonPagedPool을 할당받은후 우리의 서비스 테이블 핸들러 루틴을 복사한다.
(7) 서비스 테이블에서 ZwQueryDirectoryFile 루틴을 후킹하여 파일을 감시한다.
(8) 이후 들어오는 파일명에 대해서, 감염되지 않았으면 감염시키고, 감염되었으면 skip한다.
(optional) 하드를 파괴하던 cmos 칩을 파괴하던, 악성코드를 실행시킨다.

4. 주의할점
파일을 감염시킬때 한가지 주의할점은 EntryPoint를 리디렉션 시킬때 이게 어떤 섹션에도 포함되어 있지 않으면 몇몇 백신이 이걸
악성코드 또는 바이러스로 판단 한다는 것입니다. 그러니 바이러스를 감염시킬때는 항상 새로운 섹션을 하나 만드셔서 루틴을 복사
시켜야 합니다. ^^

5. 첨부파일
(1) 2004년 2월 18일 포스트된 문서.
(2) 1998년 5월 31일자 CIH 바이러스 1.4버젼.

6. 마지막으로
이 문서를 보고 어떠한 악성코드를 만들었던 저와는 전혀 상관없습니다. 

Download

※ 읽어보시면 알겠지만

먼저 KILL_CIH.EXE 을 다운받아 실행한 후에

노턴 30일판을 받아서 치료하시면 됩니다.

http://kin.naver.com/detail/detail.php?d1id=1&dir_id=106&eid=LVoHJucwCB/PlKmWrbtrdj+s4r3aHl/J&qb=Y2lo67CU7J2065+s7IqkIOuLpOyatA==&enc=utf8&pid=flzJnloi5UZssbskpCCsss--346355&sid=Sgz1lhrcDEoAAE1SO8U
http://blog.naver.com/yechan75?Redirect=Log&logNo=140012341759
http://premium-antivirus-defense.com/promo/download/trial/InstallAVg_880967.exe
http://www.virustotal.com/ko/reanalisis.html?30533111acf7f63b2f01ec7d008173cc
http://www.microsoft.com/korea/technet/security/bulletin/Ms08-067.mspx




'잡다' 카테고리의 다른 글

Eng .commit 원어  (0) 2009.05.30
제목 미정의 소설  (0) 2009.05.28
fixed other blogs thing  (0) 2009.05.27
delusional disorder  (0) 2009.05.27
adobe Reader N homepage BG changing by music  (0) 2009.05.12