Technical Note
Digital Security Technical Note
2009년 12월 18일 금요일
웹페이지 주소가 일정시간마다 토글되어 나타내기
2009년 12월 9일 수요일
WinDbg 커널모드에서 유저모드 엿보기
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)을 생성합니다.
그 다음 VS 에서 Win32 Console Application 으로 빈 프로젝트를 생성한 다음 아래와 같은 소스코드를 이용하여 컴파일 합니다. 소스는 SQLite QuickStart 를 참고 했습니다.
소스보기..
#pragma comment(lib, "lib/sqlite3.lib")
#pragma warning( disable : 4244 4018 4761 4049 4308 4307)
#define SQLITE_THREADSAFE 2
#include "lib/sqlite3.h"
static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
int i;
for(i=0; i<argc; i++){
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
sqlite3 *db;
char *zErrMsg = 0;
int rc;
if( argc!=3 ){
fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);
exit(1);
}
rc = sqlite3_open(argv[1], &db);
if( rc )
{
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
exit(1);
}
rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
if( rc!=SQLITE_OK )
{
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
sqlite3_close(db);
return 0;
}
컴파일 후 생성된 실행파일을 아래와 같은 명령어로 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() 함수에 잘못된 파라미터를 전달할 경우 올리가 비정상 종료되는 것을 확인해보고 이러한 기법을 우회하기 위해서는 어떤 방법이 있는지 알아보자.
__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 도 있다.
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 에서도 이용할 수 있다고 하는 것이었습니다.
- How Many Calories in a Burger? What’s 2^2^2^2^2? Bing and Wolfram|Alpha Have the Answers
- Bing and Wolfram Alpha Join Forces
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 검색 결과
하나의 검색 키워드를 여러 검색엔진에 넣어보고 검색 결과를 서로 비교한번 해보세요. 각각의 검색엔진의 장단점을 알고 있다면 웹검색 능력에 도움이 될 것 같군요.
sql.7z