중성자 별의 충돌 에너지

2009/08/07 16:02 : 공부/0x01 C / C++

크리에이티브 커먼즈 라이선스
Creative Commons License
방학프로젝트 Shadower _4 Process 감추기

이번에는 사용자가 Shadower를 종료시기지 못하게 아에 프로세스를 감추기를 시도할 것이다.
하지만 이 프로세스 감추기가 그리 녹녹치 않은게 rootkit 을 해야하기 때문이다.

벌써부터 쫄린다.

그래서 이번에는 처음에 구글링해서 찾았던 문서를 따라해보기로 했다.링크

http://blog.nextcube.pe.kr/entry/%EB%B0%A9%ED%95%99%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-Shadower

hideprocess.pdf

1. Soft-ICE
soft-ice는 커널 디버거 이다. 위의 문서에서는 Soft-ICE 를 사용하여 기술하였기때문에 우선 Soft-ICE 를 찾을수밖게 없었다.

해서 구글링.
그러던중 디비거가 잘 정리된 사이트가 있어 추천한다.

http://reversengineering.wordpress.com/debuggers/



그러나 처음부터 그리 쉽지많은 않았다.
우선 Soft-ICE 는 설치했으나 사용법을 모른다는것.
아무리 뒤져봐도 못하겠어서

windbg 로 바꾸었다.

windbg 다운로드

위의 문서에는 Soft-ICE 를 사용해 명령어 사용에 어려움이 많았지만
help(F1) 가 잘되어 있어 매우 큰 도움이 되었다.

windbg 의 실행 모습이다


File 메뉴에서 Kernel Debug 를 실행시키자


그럼 다음과 같은 창이 뜨는데 여기서 Local 탭을 선택 후 확인


그럼 다음과 같이 windbg 가 Kernel Debug 로 실행된다


그리고 테스트를 위해
계산지, 메모장, 작업관리자 순으로 프로그램을 띄웠다



여기서 부터가 문제이다

우선 프로세스 목록을 보기위해
!process 명령어를 사용한다
lkd>!process 0 0

명령어를 실행하면 calc.exe, notepad.exe, taskmgr.exe 가 순서대로 실행되어있음을 볼수 있다.

그리고 dt 명령으로 프로세스 구조체의 구조를 보자
lkd>dt _EPROCESS

0x88 offset 에 ActivceProcessLinks 라는 _LIST_ENTRY 구조체로 되어있는 것이 있다. 이것이 바로 프로세스들 간에 연관관계를 갇는 Linked List 구조체이다
다시 dt 명령어를 통해 _LIST_ENTRY 구조체의 구조를 알아보자
lkd>dt _LIST_ENTRY

보이는 그대로 Flink 는 자신의 앞의 프로세스, Blink 는 자신의 뒤의 프로세스를 연결하는 구조로 되어 있던 것이다.

이제 프로세스의 구조와 Linked List 의 구조를 알아냈으니 추적을 해보자
아까 프로세스 리스트에서
... 중략 ...

PROCESS 8957fda0  SessionId: 0  Cid: 0954    Peb: 7ffd6000  ParentCid: 07b8
    DirBase: 0ac00500  ObjectTable: e2ba7318  HandleCount:  77.
    Image: calc.exe

PROCESS 8967e560  SessionId: 0  Cid: 0980    Peb: 7ffd3000  ParentCid: 07b8
    DirBase: 0ac003c0  ObjectTable: e29114f8  HandleCount:  77.
    Image: notepad.exe

PROCESS 89577278  SessionId: 0  Cid: 097c    Peb: 7ffd4000  ParentCid: 0390
    DirBase: 0ac00460  ObjectTable: e3a9ec08  HandleCount: 108.
    Image: taskmgr.exe

... 생략 ...

굵은 글씨된 주소가 해당 프로세스 구조체의 시작 주소이다.
그럼 그 해당 주소로 접근해서 해당 프로세스의 구조에 대해서 알아보자(calc.exe)
lkd>dt _EPROCESS 8957fda0
출력된 내용중 0x174 offset 을보면 ImageFileName 있는데

계산기 프로세스의 정보임을 알수 있다.
하지만 중요한건 0x88의 ActiveProcessLinks 의 정보이다.

다시 dd 명령어를 통해 ActiveProcessLinks 의 메모리 정보를 보도록 하겠다.
lkd>dd 8957fda0+88
여기서 왜 +88 을 하는 이유는 8957fda0 은 calc.exe 의 시작 주소이다 그리고 0x88 offset 에 ActiveProcessLinks 가 저장되므로 시작주소에서 offset 만큼 더해줘야 ActiveProcessLinks 의 주소가 된다는 것이다.

lkd> dd 8957fda0+88
8957fe28  8967e5e8 89573ad0 00000de8 00012b64
8957fe38  000003a5 00000f78 00012cf4 000003a9
8957fe48  000003a5 029ab000 0296b000 8967e614
8957fe58  89573afc 00000000 e1448758 e2ba7318
8957fe68  e3b73033 00000001 aa0e4c58 00000000
8957fe78  00040001 00000000 8957fe80 8957fe80
8957fe88  00000000 00046804 00000001 aa0e4c58
8957fe98  00000000 00040001 00000000 8957fea4

8957fda0 의 프로세스구조체 시작 주에소 88 더한 8957fe28 에는
8967e5e8
89573ad0 00000de8 00012b64 정보가 저장되어있다.

여기서 빨간색으로 된
8967e5e8 이것이 Flink 이고
89573ad0 이것이 Blink 이다

맞는지 확인해 보자
dt 명령으로 Flink 의 주소에 -88 을하여 프로세스 구조체 정보를 보도록 해보자

lkd>dt _EPROCESS 8967e5e8-88
여기서 왜 -88 을 하는 이유는 위에 이유와 같다.  ActiveProcessLinks 는 프로세스 구조체 시작 주소에서 +88 곳의 주소이다. 마찬가지로 Flink 의 주소도 자신의 앞의 프로세스의 의
ActiveProcessLinks 주소이므로 다시 -88 을 해줘야 앞의 프로세스 구조체의 시작 주소가 되는 것이다.

아까의 순서대로 calc.exe 앞에는 notepad.exe 가 있는 것이다
간단하게 해보겠다.

... 중략 ...

PROCESS 8957fda0  SessionId: 0  Cid: 0954    Peb: 7ffd6000  ParentCid: 07b8
    DirBase: 0ac00500  ObjectTable: e2ba7318  HandleCount:  77.
    Image: calc.exe

PROCESS 8967e560  SessionId: 0  Cid: 0980    Peb: 7ffd3000  ParentCid: 07b8
    DirBase: 0ac003c0  ObjectTable: e29114f8  HandleCount:  77.
    Image: notepad.exe

PROCESS 89577278  SessionId: 0  Cid: 097c    Peb: 7ffd4000  ParentCid: 0390
    DirBase: 0ac00460  ObjectTable: e3a9ec08  HandleCount: 108.
    Image: taskmgr.exe

... 생략 ...

여기에서
calc.exe 의 시작주소 8957fda0 +88 을하여 dd 명령으로 메모리 정보를 확인하여 Flink 주소에 다시 -88 을 하면 notepad.exe 의 시작주소인 8967e560 이 나올것이다.

calc.exe
Flink 8967e5e8
Blink 89573ad0

계산기로 계산을 해보자
8967e5e8-88 = 8967E560
정확히 notepad.exe 의 시작주소가 나온것을 볼수 있다.


정리하면 이렇게 되겠다
해서 calc.exe 의 Flink를 taskmgr.exe 를 가리키도록 8967e5e8 로 수정하고
taskmgr.exe 의 Blink를 calc.exe 를 가리키도록 89573ad0 로 수정하면..


이렇게!!!!


되야는데.. 어떤이유에서인지 windbg 의 Memory Window 에서 ActiveProcessLinks 의 주소로 접근해 수정하면 한글자씩 수정되면서 컴퓨터가 꺼져버리는게 아닌가!
복사해서 붙여 넣어도 계속 똑같은 현상.

우선은 위 문서를 거의 따라하고 이론적으로 남아 이해함에 만족하고 다음으로 미루기로 했다.


ps. 디버깅이 생각보다 잼있더라, 나중에 Ollydbg를 이용해 어플리케이션도 디버깅 해봐야겠다.
저작자 표시 비영리
Posted by Nextcube NextCube Trackback 0 Comment 0