수안이의 컴퓨터 연구실

  • Mainpage
  • About Me
  • Tags
  • Metapage
  • Notice
  • Location
  • Keywords
  • Guestbook
  • Admin
  • Write an Article
  • Total | 1695029
  • Today | 774
  • Yesterday | 606

Security/Overflow2005/09/01 01:36

윈도우 버퍼 오버플로우 익스플로잇 개발 - 3

오정욱 (mat@panicsecurity.org)

윈도우 버퍼 오버플로우의 특징
유닉스와 같은 시스템에서 버퍼 오버플로우는 리턴 주소를 대부분 추측에 의해 계산하는 경우가 많고, 여러 번 시도할 수 있을 경우 무차별 공격(brute forcing)을 하기도 한다. 반면 윈도우 시스템은 유닉스와는 조금 다른 양상을 보인다.

리턴 주소 문제
윈도우 시스템의 경우 스택을 오버플로우시켰을 경우 해당 함수에서 리턴하는 시점에 ebx, esp 등과 같은 레지스터에 셸 코드가 들어 있는 버퍼의 주소가 들어 있는 경우가 많다. 따라서 대부분의 경우 리턴 코드는 ‘jmp esp’나 ‘jmp ebx’와 같은 바이트 문자열이 존재하는 위치로 정해진다. 이러한 코드가 존재하는 곳으로 일단 제어권을 넘길 수만 있다면 esp나 ebx가 공격자가 보낸 셸 코드의 위치를 저장하고 있으므로 성공 확률이 높아지게 된다.

윈도우 셸 코드의 특징
윈도우 셸 코드는 일반적인 유닉스 셸 코드와는 다른 특수한 형태를 띤다. 유닉스 셸 코드가 특정 대상에 대해 항상 호환성을 가지는 반면 윈도우 셸 코드는 그러한 호환성이 없다. 이러한 특징은 윈도우의 아키텍처와 관련이 있다. 유닉스에서는 시스템 콜을 통해 커널의 서비스를 받기 위해 인터럽트를 사용하는 데 반해 윈도우에서는 DLL을 통해 커널의 서비스를 받는다. 사용자 공간에서 인터럽트를 통해 시스템 콜 서비스를 받는 것은 거의 불가능하다. 시스템 서비스를 제공하는 DLL로는 kernel32.dll이 있다. 이 DLL을 통해 시스템과 관련된 대부분의 서비스를 받을 수 있다. <그림 1>은 PE 파일의 포맷이다.
다음은 IMAGE_DATA_DIRECTORY의 구조다. 데이터 디렉토리의 구조는 <그림 2>와 같다.


<그림 1> PE 파일 포맷



<그림 2> 데이터 디렉토리 구조


typedef struct _IMAGE_DATA_DIRECTORY {
DWORD RVA;
DWORD Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;


WebDAV 익스플로잇
지금부터 최근에 필자가 만든 흥미로운 익스플로잇인 WebDAV 익스플로잇을 중심으로 윈도우 버퍼 오버플로우의 실체를 살펴보자. 이 익스플로잇에서는 유니코드 리턴 주소를 써야 하는 문제를 재미있게 해결했다.
WebDAV는 웹 컨텐츠 저작(authoring)을 위한 프로토콜로서 마이크로소프트에 의해 표준이 만들어졌고, 주로 IIS 서버의 컨텐츠 관리를 위해 사용한다. ntdll.dll의 버퍼 오버플로우 버그는 WebDAV를 통해 익스플로잇이 가능했다. WebDAV 메쏘드들에 아주 긴 문자열을 보냈을 경우 버퍼가 오버플로우되어 원하는 코드를 실행할 수 있는 버그가 있었다. 이 버그는 버그트랙(Bugtraq) 7116으로 ntdll.dll의 버그 CVE ID는 CAN-2003-0109이다.
ntdll.dll 버퍼 오버플로우는 ntdll.dll의 RtlDosPathNameToNt PathName 함수에서 발생하고 특정 길이의 문자열이 전달됐을 경우에만 버퍼 오버플로우가 발생했다. 또한 이 RtlDosPathName ToNtPathName 함수를 쓰는 프로그램이 많으므로 그러한 프로그램은 모두 같은 버그에 노출됐다고 볼 수 있다. 이 버그는 윈도우 2000 서비스 팩 3까지의 모든 윈도우 시스템에서 구동되는 IIS 5.0 서버 시스템에 영향을 미친다.


<화면 1> inetinfo가 크래시



<화면 2> esp(스팩) 덤프


사용 가능한 유니코드 찾기
이 익스플로잇의 결과 버퍼가 오버플로우된다. 오버플로우된 버퍼는 유니코드 형태다. 따라서 ‘AAA...’와 같은 문자열은 ‘A|00| A|00|A|00|...’와 같이 변형된다. 그런데 영문판 윈도우와는 달리 한글판 등 유니코드 언어권의 윈도우에서는 %u 문자열을 통해 해당 언어 팩에서 유효한 유니코드 문자열을 메모리에 입력할 수 있다. 다음은 익스플로잇 테스트 코드를 보냈을 경우의 예다. 일단 inetinfo.exe가 크래시된다(<화면 1>). 크래시된 상태에서 <화면 2>와 같이 esp(스택)을 덤프해 보면 ZZZZ...가 Z|00|Z|00|Z|00|...와 같이 널 문자가 추가된 형태로 변환됐음을 알 수 있다. <리스트 1>은 이렇게 유효한 유니코드의 집합을 찾는 프로그램이다.

<리스트 1> 유효한 유니코드 집합 찾기
// uniprint.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include
#include
#include

int main(int argc, char* argv[])
{
unsigned char i;
unsigned char j;

for(i=0;i<255;i++)
{
for(j=0;j<255;j++)
{
char string_to_copy[3];
WCHAR src[256]={0,};
char dest[256]={0,};

string_to_copy[0]=i;
string_to_copy[1]=j;
string_to_copy[2]=0;
memcpy(src,string_to_copy,strlen(string_to_copy));
BOOL lpUsedDefaultChar;

WideCharToMultiByte(CP_ACP,0,src,1,dest,256,NULL,&lpUsedDefaultChar);

if(!lpUsedDefaultChar)
{
printf("%.2x%.2x ",j,i);
}
}
}

return 0;
}
"Overflow" 카테고리의 다른 글
  • 버퍼 오버 플로우 (0)2006/11/24
  • 윈도우 버퍼 오버플로우 익스플로잇 개발 - 4 (0)2005/09/01
  • 윈도우 버퍼 오버플로우 익스플로잇 개발 - 3 (0)2005/09/01
  • 윈도우 버퍼 오버플로우 익스플로잇 개발 - 2 (0)2005/09/01
  • 윈도우 버퍼 오버플로우 익스플로잇 개발 - 1 (0)2005/09/01
2005/09/01 01:36 2005/09/01 01:36
Posted by webdizen
No Trackback No Comment

Trackback URL : http://www.webdizen.net/blog/trackback/1395

Leave your greetings.

[로그인][오픈아이디란?]

«Prev  1 ... 1751 1752 1753 1754 1755 1756 1757 1758 1759 ... 3009  Next»

RSS HanRSS
Blog Image
webdizen
이곳은 컴퓨터에 대해 연구하고, 공유하고, 소통하기 위한 연구실입니다. 개인적으로는 OLAP, Data Mining, Semantic Web, Data Modeling에 대해서 연구하고 있습니다.

Categories

전체 (3009)
Webdizen (141)
Life (6)
Diary (16)
Blog (9)
IDEA (2)
Travel (10)
Book (16)
Photo (7)
Movie (8)
Music (14)
Leisure Sports (10)
Funny (6)
Hardware (121)
Software (120)
Windows (5)
Unix & Linux (120)
Installation (5)
Kernel (10)
System (34)
Develop (22)
X-Window (0)
Applicaton (31)
Security (4)
Framework (2)
Hadoop (2)
Programming (804)
Algorithm & Data Structure (1)
Assembly (38)
UNIX/Linux C (95)
C++ (128)
STL (4)
Java (38)
Win32 API (92)
ATL/COM (44)
MFC (151)
.NET (26)
WCF/WPF (4)
C# (28)
Network Programming (17)
Database Programming (12)
OpenGL / DirectX (13)
Multimedia Programming (0)
Game Programming (21)
Parallel Distributed Progra... (0)
Reverse Engineering (0)
Debugging (9)
Python (1)
Ruby (1)
Ruby on Rails (1)
QT (4)
GTK (0)
JSP (0)
PHP (6)
ASP.NET (6)
ASP (2)
Development (28)
Useful Library (2)
Data Modeling (0)
Database (105)
Oracle (4)
MSSQL (41)
MySQL (2)
Data Warehouse (2)
Data Mining (4)
Network (66)
Web (79)
DHTML (4)
XHTML (1)
Javascript (1)
CSS (1)
AJAX (9)
XML (11)
Flex (1)
Silverlight (3)
Security (91)
DoS (1)
Kernel (10)
Scanning (3)
Sniffing (0)
Spoofing (4)
Overflow (28)
Web (11)
Shell (10)
Format String (14)
Window (2)
Embedded (70)
Multimedia (27)
Mobile (14)
Graphic (24)
Management (633)
Knowledge (581)
Hadoop (0)

Notice

  • 메타 블로그 사이트에 등록
  • 새해 맞이 블로그의 변화
  • 블로그 명칭 변경
  • 도메인(www.webdizen.net) 구...
  • TEXTCUBE 1.6.1로 업그레이드...

Tags

  • Framework
  • 객체 비지향
  • 형식화된 입출력
  • WinAPI
  • Preprocessor
  • stat
  • Internet
  • XP
  • FOR XML
  • 발성
  • 파이썬
  • Event
  • 웹디즌
  • 복원
  • 예측 작업
  • Flex
  • Addin
  • 리디렉션
  • 디스크 포멧
  • 실체화

Recent Articles

  • 트위터(Twitter)의 시작!.
  • 청년 리더의 조건.
  • 애플의 타블렛 PC - 아이패드....
  • 미래의 인터페이스 - 육감 기....
  • 기초발성법 동영상 강좌.

Recent Comments

  • 경청... 너무나 중요한데.......
    webdizen 14:59
  • 학교 과제물중 쓰레드에 대하....
    장진혁 03/17
  • 관리자만 볼 수 있는 댓글입....
    비밀방문자 03/12
  • 상대방의 이야기를 열심히 경....
    DoNuts 03/03
  • 좋은글 잘 보고 갑니다..
    Und_hacker 01/08

Recent Trackbacks

  • printf,scanf를 이용한 형식....
    yundream의 프로그래밍 이야기 03/10
  • 파일 열기/저장하기 CFileDialog.
    은마군의 나태블록 2009
  • World IT Show 2008.
    상우 :: Oranzie's BLOG 2008
  • cvs서버 설치하기.
    3인3색 2008
  • 속속 공개되는 Google Chart....
    PHP와 Web 2.0 2007

Archive

  • 2010/02 (1)
  • 2010/01 (6)
  • 2009/12 (5)
  • 2009/09 (3)
  • 2009/08 (1)

Calendar

«   2010/03   »
일 월 화 수 목 금 토
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

Bookmarks

    • Administration
      • IIS.NET
      • NTFAQ
      • OS의 모든 것
      • 리눅스포털
    • Database
      • SQL Server Central
      • SQL Team
    • Development
      • .NET Heaven
      • ASP Alliance
      • ASP.NET 2.0
      • Bullog.net
      • C# Corner
      • C++ (C PlusPlus.com)
      • C++ Reference
      • CodeGuru
      • CodePlex
      • DebugLab
      • Dev Articles
      • Devpia
      • DotNet Junkies
      • DotNet Zone
      • Driver Online
      • GOSU.NET
      • HOONS 닷넷
      • Joinc 팀블로그
      • KOSR
      • MSDN Home Page
      • OSR Online
      • Sky.ph - 개발자 커뮤니...
      • TAEYO.NET
      • The Code Project
      • WindowsClient.net
      • 김상욱의 개발자 Side
      • 조인시 위키
    • Human Networks
      • belief21c's e-space
      • I think I can
      • Invisible Rover's Blog :D
      • Polarux - Linuxing
      • Rodman®
      • 까만 나비
      • 나를 가꾸는 시간.
      • 단녕
      • 상우 :: Oranzie's BLOG
    • Information Technology
      • Microsoft TechNet
      • 지디넷코리아 - 글로벌...
    • Security
      • FoundStone
      • milw0rm
      • NewOrder
      • OpenRCE
      • Phrack.org
      • Reverse Engineering b1...
      • Reverse Engineering Team
      • RootKit
      • SecurityFocus
      • SecurityXploded by Nag...
      • Wow Hacker
      • Zone-H
Textcube
Louice Studio Inc.
Powered by Textcube. Original designed by Tistory.