2009년 12월 18일 금요일

웹페이지 주소가 일정시간마다 토글되어 나타내기

두 개의 웹페이지를 반복해서 보여주는 자바스크립트(JavaScript) 입니다. IFRAME 을 사용했구요, 별건 아닌데 회사 친구가 물어봐서 간단하게 POC 만들어 봤습니다. 남을 도와준다는 것은 언제나 즐거운 일입니다. ^^;

<HTML>
<HEAD>
<TITLE> Iframe toggle </TITLE>
<script type="text/javascript">
var toggle = 0;
function reload()
{
var refresh = document.getElementById('frame1');
timer = setTimeout('reload()', 5000);
if (toggle) {
refresh.src = 'http://google.co.kr';
toggle = 0;
}
else {
refresh.src = 'http://naver.com';
toggle = 1;
}

if ( timer == 5 ) {
clearTimeout( timer );
refresh.src = 'about:blank';
}
}
</script>
</head>

<body onload="reload();">
<iframe id="frame1" src="about:blank"  width="100%" height="98%" scrolling="no" marginwidth="0" marginheight="0" frameborder="0" vspace=0" hspace="0"></iframe>
</body>

</html>

2009년 12월 9일 수요일

WinDbg 커널모드에서 유저모드 엿보기

윈도우는 멀티 태스킹(Multi-Tasking)을 지원하는 운영체제로 Context Switching (문맥교환) 을 통해서 구현되고 있습니다. 아무리 운영체제가 동시에 여러 개의 작업을 한다고 하더라도 CPU 는 한번에 하나씩 동작할 수 밖에 없기 때문에 프로세스, 레지스터, 또는 세션 등의 작업들이 사용하는 레지스트리나 메모리에 관련된 자신들만의 정보들을 가지고 가지게 됩니다. 이 것이 Context 라고 불려지는 것이고 운영체제는 Context 를 매번 바꿔가면서 작업을 하게 됩니다. 컨텍스트는 Session, Process, Register, Local Context 로 구분될 수 있습니다.

이 글에서 알아보고자 하는 것은 WinDbg 를 이용해 커널모드 디버깅을 할 때 사용자 모드에서 동작하는 응용프로그램들의 정보를 확인하고 싶을 때 어떻게 할 수 있는지 알아보려고 합니다. 서두에서 컨텍스 에 대해서 말씀 드린 이유는 WinDbg 에서 원하는 프로세스 혹은 스레드의 컨텍스로 변경해주면 되기 때문입니다.

테스트를 하기위해 가상머신(VMWare)에 윈도우 XP 를 구동시키고 가상 시리얼포트로 WinDbg 와 연결하였습니다. 윈도우 XP 에서 노트패드(notepad.exe) 를 실행하고 WinDbg 에서 브레이크 걸어 (Ctrl+Break) 테스트 하였습니다.

1) 일단 보고 싶은 프로세스 명으로 _EPROCESS 의 주소를 찾습니다.

kd> !process 0 0 notepad.exe
PROCESS 816021d0  SessionId: 0  Cid: 0450    Peb: 7ffdf000  ParentCid: 057c
    DirBase: 0e773000  ObjectTable: e1737ee0  HandleCount:  36.
    Image: notepad.exe


2) 프로세스의 내용을 조금 더 자세하게 보여달라카고~ 스래드 주소를 찾습니다.

kd> !process 816021d0  7
PROCESS 816021d0  SessionId: 0  Cid: 0450    Peb: 7ffdf000  ParentCid: 057c
    DirBase: 0e773000  ObjectTable: e1737ee0  HandleCount:  36.
    Image: notepad.exe
    VadRoot 816dd7c8 Vads 58 Clone 0 Private 160. Modified 17. Locked 0.
    DeviceMap e1afacd8
    Token                             e1db4960
    ElapsedTime                       00:00:26.500
    UserTime                          00:00:00.015
    KernelTime                        00:00:00.093
    QuotaPoolUsage[PagedPool]         30332
    QuotaPoolUsage[NonPagedPool]      2320
    Working Set Sizes (now,min,max)  (774, 50, 345) (3096KB, 200KB, 1380KB)
    PeakWorkingSetSize                774
    VirtualSize                       27 Mb
    PeakVirtualSize                   30 Mb
    PageFaultCount                    837
    MemoryPriority                    BACKGROUND
    BasePriority                      8
    CommitCharge                      375

        THREAD 81603250  Cid 0450.0484  Teb: 7ffde000 Win32Thread: e1632628 WAIT: (WrUserRequest) UserMode Non-Alertable
            815b9490  SynchronizationEvent
        Not impersonating
        DeviceMap                 e1afacd8
        Owning Process            816021d0       Image:         notepad.exe
        Wait Start TickCount      10621          Ticks: 29 (0:00:00:00.453)
        Context Switch Count      355                 LargeStack
        UserTime                  00:00:00.000
        KernelTime                00:00:00.093
        Win32 Start Address notepad!WinMainCRTStartup (0x01006ae0)
... (이하 생략)

3) 그 스래드 주소를 이용해서 Context Swiching 하면 됩니다.

kd> .thread /p /r 81603250
Implicit thread is now 81603250
Implicit process is now 816021d0
.cache forcedecodeuser done
Loading User Symbols
.....................


4) 그러고 나서 스택을 보면 notepad 문자가 보이죠~

kd> kn
  *** Stack trace for last set context - .thread/.cxr resets it
 # ChildEBP RetAddr  
00 f7a48c38 804ec71c nt!KiSwapContext+0x2e
01 f7a48c44 804ec5a3 nt!KiSwapThread+0x44
02 f7a48c6c bf8762d6 nt!KeWaitForSingleObject+0x1c0
03 f7a48ca8 bf876646 win32k!xxxSleepThread+0x189
04 f7a48cec bf87667a win32k!xxxRealInternalGetMessage+0x40f
05 f7a48d4c 804d6e91 win32k!NtUserGetMessage+0x27
06 f7a48d4c 7ffe0304 nt!KiSystemService+0xc4
07 0006feb8 77cf3c8b SharedUserData!SystemCallStub+0x4
08 0006fed8 010028e4 USER32!NtUserGetMessage+0xc
09 0006ff1c 01006c54 notepad!WinMain+0xe3
0a 0006ffc0 77e3eb69 notepad!WinMainCRTStartup+0x174
0b 0006fff0 00000000 kernel32!BaseProcessStart+0x23


5) notepad 코드 위치한 곳으로 이동 시키고~

kd> .frame 9
09 0006ff1c 01006c54 notepad!WinMain+0xe3


6) 소스를 까보면 짜잔~~~

kd> u notepad!WinMain
notepad!WinMain:
01002801 55              push    ebp
01002802 8bec            mov     ebp,esp
01002804 83ec20          sub     esp,20h
01002807 56              push    esi
01002808 57              push    edi
01002809 ff1528110001    call    dword ptr [notepad!_imp__GetCommandLineW (01001128)]
0100280f 68c8130001      push    offset notepad!`string' (010013c8)
01002814 6a29            push    29h

도움이 되셨으면 좋겠네요~

2009년 12월 3일 목요일

Google Public DNS

DNS(Domain Name Service) 는 여러분도 잘 알고 계시는 것 처럼 인터넷의 주소로 불리는 IP를 인간이 외우기 쉽도록 문자로 변경하여 사용할 수 있는 서비스 입니다.  일반적으로 DNS 서비스는 수익모델이 없기 때문인지 몰아도 DNS 서버를 제공하는 곳은 그렇게 많지 않습니다. 그런데 오늘 구글이 DNS 서비스까지 손대고 있다는 기사를 보았습니다.

 

     Google wants to unclog Net's DNS plumbing

구글이 어떤 사업모델을 가지고 DNS 서비를 하는지 궁금해 하지 않을 수 없을 것 같은데요. 아마도 구글은 좀더 빠른 DNS 응답으로 인터넷 속도가 빨라 지는 효과를 얻으려고 하는 것 같습니다. 특히 재미있는 사실은 인상적인 구글의 DNS 서버 주소입니다. 8.8.8.8, 8.8.4.4 정말 대박입니다.

 

     Using Google Public DNS
     What is Google Public DNS?

또한 구글의 DNS는 보안적인 측면에서 케쉬포이즈닝(DNS Cache Poisoning)을 막을 수 있어 보안적 이득을 얻을 수 있다고 합니다. (관련글: Security Benefits) 작년에 DNS Cache Poisoning 취약점이 발표되어 화제가 되기도 했었는데요, 그래서 한번 테스트 해보았습니다.

*** kornet DNS
> dig @168.126.63.1 +short porttest.dns-oarc.net TXT
porttest.y.x.w.v.u.t.s.r.q.p.o.n.m.l.k.j.i.h.g.f.e.d.c.b.a.pt.dns-oarc.net.
"220.73.29.3 is GREAT: 26 queries in 4.5 seconds from 26 ports with std dev 2009                 5"

 

*** Google DNS
> dig @8.8.8.8 +short porttest.dns-oarc.net TXT

 

구글 DNS 서버는 아무런 응답이 없었습니다. 뭔가 잘 되고 있는 것이겠죠? ㅎㅎ

 

2009년 11월 25일 수요일

SQLite을 이용한 개발 준비

프로그램을 만들다 보면 단순한 유틸은 제처두더라도 자체적으로 데이터베이스를 사용하기 마련이다. 말이 좀 거창할 수 있지만 백신(Anti-Virus) 프로그램에서도 시그니처를 담기위한 데이터베이스 파일이 존재한다. 최근에는 PC에 비해 성능이 낮거나 저장 용량이 작은 모바일에서도 자체적으로 데이터베이스를 만들기 보다는 SQLite 를 사용하는 경향이 있는데, 얼마전에 구글 크롬(Goole Chrome)이 사용하는 "Safe Browsing" 파일도 SQLite 를 사용한다는 것도 알게 되었습니다.

 

아무튼 저도 최근에 개발하고 있는 프로그램에서도 SQLite 를 이용하여 안정화되고 가볍고 빠르다는 장점을 취하기로 결정했습니다.

 

이 글에서는 Windows, Visual Studio 6 환경에서 SQLite 라이브러리를 사용하는 예제를 만들어 보도록 하겠습니다.

 

우선 SQLite 홈페이지에서 "Amalgamation Source Code" 와 "Precompiled Binaries For Windows" 를 다운로드 받습니다. Amalgamation 에는 sqlite3.c, sqlite3.h sqlite3ext.h 파일이 들어 있고 Precompiled Binaries For Windows 에는 sqlite3.dll, sqlite3.def 파일이 존재합니다. 이 파일들을 하나의 폴더(저는 프로젝트 하위에 lib 폴더를 만들어 넣었습니다.)에 모아놓은 후 Command 창에서 다음과 같은 명령어로 라이브러리 파일(sqlite3.lib)을 생성합니다.

 

C:\sql\lib> lib /DEF:sqlite3.def /MACHINE:x86

 

그 다음 VS 에서 Win32 Console Application 으로 빈 프로젝트를 생성한 다음 아래와 같은 소스코드를 이용하여 컴파일 합니다. 소스는 SQLite QuickStart 를 참고 했습니다.

 

소스보기..

컴파일 후 생성된 실행파일을 아래와 같은 명령어로 SQLite 데이터베이스를 생성/삽입/조회 등을 하실 수 있습니다.

 

C:\sql\Release> sql tm "create table tb1(id smallint, name varchar)"

C:\sql\Release> sql tm "insert into tb1 values(1, 'hojinpk')"

C:\sql\Release> sql tm "select * from tb1"
id = 1
name = hojinpk

 

그 결과 생성된 데이터베이스 파일인 tm (2,048 Byte) 파일 하나였습니다.

 

SQLite 데이터베이스 파일을 GUI 툴을 이용하여 보고 싶다면 SQLiteSpy 라는 툴을 이용하실 수 있습니다.

 

지금까지 설명드린 결과물을 첨부하였습니다. 첨부파일에는 소스 + 실행파일 + SQLiteSpy.exe 가 들어 있습니다.

 

 

Using the CloseHandle() Anti-Reversing

악성코드를 분석을 도와주는 많은 도구 중 역분석(Reverse Code Engineering) 을 도와주는 올리디버거 (OllyDbg, 이하 올리) 가 가장 많이 사용될 것이다. 악성코드 제작자들은 이러한 점을 노려 올리의 버그를 이용하여 Anti-Debugging 혹은 Anti-Reversing 기법으로 사용하곤 한다.

 

오늘은 CloseHandle() 함수에 잘못된 파라미터를 전달할 경우 올리가 비정상 종료되는 것을 확인해보고 이러한 기법을 우회하기 위해서는 어떤 방법이 있는지 알아보자.

 

BOOL WINAPI CloseHandle(
  __in  HANDLE hObject
);

 

우선 CloseHandle() 은 위와 같이 하나의 파라미터를 입력으로 받는다. hObject 는 열려진 유효한 값 이어야 한다.

 

 

일반적으로 안티 리버싱 기법들은 실행파일 처음에 동작하도록 되어있다. 그래서 특정 악성코드를 올리로 열면 위 그림과 같은 코드가 보이는 것이 있을 것이다. 처음보는 사람들은 의하해하지 않을 수 없다.

프로그램이 시작하자 마자 핸들을 닫아?

그것도 9번이나?

그리고 닫으려고 하는 핸들도 하드코딩되어 있잖아?

뭥미???

올리에서 F7 또는 F8 을 눌러 진행하다보면 얼마 가지 못해 올리가 죽어버린다. 올리의 버그를 노려 역분석을 방해하는 것임을 알게됬다면 자~! 이제 어떻게 이 부분을 넘어갈 수 있을까?

방법이야 여러 가지가 있을 것이다.

 

  • 정상적인 핸들값을 파라미터로 전달한다.

어셈 명령어를 변경하고 싶으면 변경하고 싶은 곳에 커서를 위치하고 더블클릭하거나 스페이스바를 누르면 어셈코드를 변경할 수 있는 창이 나타난다.

 

  • EIP 를 변경하여 해당 코드를 건너뛴다.

건너뛸 마지막을 선택하고 마우스 오른쪽 버튼을 눌러 "New origin here" 메뉴를 이용해 EIP를 변경한다.

 

  • 올리 옵션을 변경한다. (사실 변경해도 잘 안된다.)

INVALID_HANDLE 이 발생할 경우 오류를 무시하도록 옵션을 변경하는 것이다.

이론상 잘 되어야 하지만 사실 이렇게 변경해도 안되는건 마찮가지다. 이 것 또한 올리의 버그인 것이다.

 

  • 올리 플러그인을 활용한다.

플러그인을 이용한 방법은 잘 되기도 하지만 안되는 PC도 있는걸 보았다. 아마도 안되는 PC에 설치된 올리의 옵션이나 플러그인들과 충돌이 발생한 것은 아닐까? 의심해본다.

 

  • 다른 역분석 도구를 활용한다.

 

올리 2.0 이나 IDA Pro 같은 다른 역분석 도구를 활용하는 것도 한 방법이다. 지금까지 버그가 존재하는 올리 의 버전은 1.10 이었다. 현재 올리 홈페이지에서 다운로드 받을 수 있는 OllyDbg 2.0 Beta 는 이와 같은 오류가 수정되어 무리없이 CloseHandle() 의 잘못된 파라미터 값을 이용한 Anti-Reversing 기법을 건너 띌 수 있다. IDA Pro 도 버전은 현재 버전보다 낮지만 무료로 사용할 수 있도록 홈페이지에서 다운로드 받을 수 있다.

 

 

항상 알고나면 정말 별거 아니지만 몰랐을 땐 정말 죽을 맛이었다.

2009년 11월 24일 화요일

RkU - RootKit UnHooker

2007년 말쯤에 EP_X0FF 라는 필명의 러시아 사람과 Rootkit Unhooker 개발팀이 마이크로소프트에 들어갔었다. (참고) 그러면서 개인 블로그 등 사적인 활동을 거의 중단하고 회사에서 RkU 를 꾸준히 업데이트 하고있는 모양이다.

RkU는 antirootkit.com 에서 별 다섯개를 받을 만큼 그 성능은 다른 루트킷 탐지 툴보다 뛰어나고 지속적인 업데이트가 장점이라 할 수 있을 것이다.

 

 

 

 

최근에 몇 개의 버그를 수정하고 공개된 은폐 코드를 탐지모듈 성능향상이 있었다고 한다. (참고)

  • RkU 3.8.382.584 Download Here
  • Program Components
    • Main Engine v3.8 (2007)
    • ILHA (InLine Hook Analyzer) v2.0
    • XDF (eXtended Disassembling Functions) v1.8
    • MBR Verification Engine v1.1 (public)

업데이트는 거의 되는 것 같지 않지만 RkU Forum 도 있다.

http://www.antirootkit.com/forums/viewforum.php?f=35

2009년 11월 15일 일요일

Bing 이 도입한 Wolfram Alpha

 

요즘 MS가 자사의 검색엔진 Bing 으로 Google의 아성을 따라 잡기 위해 Visual Search 기능 추가, Facebook 및 Twitter 검색 내장, Bing Maps 기능 향상, MSN Video를 Bing Video로 리브랜딩 하는 등등 고군분투 하고 있다고 합니다. 이렇게 Bing 이 업그레이드 하고 있는 것 중 저의 눈길을 사로잡은 것은 자연어 검색엔진인 Wolfram Alpha(http://www.wolframalpha.com) 를 Bing 에서도 이용할 수 있다고 하는 것이었습니다.



Wolfram Alpha 는 Stephen Wolfram 이 만든 검색엔진으로 검색 키워드의 진짜 의미를 파악해서 검색을 하는 것으로 출력 결과 중 여러가지 도표를 이용하여 시각적으로 보여주는 유용한 기능도 함께 제공합니다.

Stephen Wolfram 은 17살에 옥스포드 대학에 들어가 20살에 Caltech 에서 박사학위를 받는 등 천재로 인정받고 있는 사람으로 매스매티카라는 프로그램을 제작한 것으로도 유명한 사람입니다. 그래서 Wolfram Alpha 에 매스매티가 기능도 포함되어 있습니다.

 

 

Wolfram Alpha 에서 아직 한글을 지원하지는 않지만 검색엔진의 멋진 기능을 보기 위해 아래와 같은 몇 가지 검색 키워드를 입력해 보면 금방 채험하실 수 있습니다.

  • weather in seoul
  • plot x^3 - 6x^2 + 4x + 12
  • $1 in KRW
  • neptune
  • BMI 88 kg 180 cm

아래 그림은 WolframAlpha 에서 검색어로 "integrate x^2 sin^3 x dx" 를 입력했을 때 결과 입니다.

[그림] Wolfram Alpha 검색 결과

 


하나의 검색 키워드를 여러 검색엔진에 넣어보고 검색 결과를 서로 비교한번 해보세요. 각각의 검색엔진의 장단점을 알고 있다면 웹검색 능력에 도움이 될 것 같군요.