이미 소장하고 있다면 판매해 보세요.
|
제1장 소프트웨어 - 문제의 근원
간단하게 보는 소프트웨어의 역사 소프트웨어와 정보 스파이 디지털 비밀 행위 나쁜 소프트웨어는 어디에나 있다 NASA 화성 착륙기 덴버 공항 수화물 핸들러 MV-22 오스프리 US 비세네스 Microsoft와 Love 버그 문제 발생의 필수품 복잡도 더 많은 코드 수, 더 많은 버그 확장성 연결성 결국 소프트웨어의 미래 가까운 미래 : 2004 조금 더 먼 미래 : 2005-2007 먼 미래 : 2008-2010 드러나고 있는 열 가지 사실 소프트웨어 보안이란 무엇인가? 결론 제2장 공격 유형 분류법 버그 결함 취약점 설계 취약점 개방 시스템 살펴보기 위협 잠재적 손실 노출과 잠재력 실질적 위협 소프트웨어를 깨는 방법들 공격자의 관점 왜 사용자를 믿으면 안 되는가? 자물쇠 따개같이 간단한 예제 공격 유형 : 재앙의 청사진 소프트웨어 깨기, 공격 그리고 공격자 공격 유형 주입 벡터 활성화 영역 출력 이벤트 피드백 이벤트 소프트웨어 깨기 예제 : Microsoft의 망가진 C++ 컴파일러 공격의 기술적 측면 StackGuard의 Microsoft 포트에 대해 알아보기 Microsoft가 추가한 보안 특성 통과하기 해결책 추억의 소프트웨어 깨기 공격 유형 적용하기 네트워크 스캐닝 OS 스택 식별 포트 스캔 Traceroute와 영역 전송 목표 구성요소 공격 유형 고르기 주어진 환경에서 결함 증폭시키기 간접적으로 접근하기 백도어 심기 공격 유형 상자들 공격 유형 : OS 자원을 사용할 수 있는 프로그램을 선택하라 결론 제3장 리버스 엔지니어링과 프로그램 이해하기 논리의 집으로 들어가기 리버스 엔지니어링 왜 리버스 엔지니어링이 필요한가? 리버스 엔지니어링은 불법인가? 리버스 엔지니어링 도구와 개념 디버거 결함 주입 도구 역어셈블러 역컴파일러 리버스 엔지니어링 접근 방법 화이트박스 분석 블랙박스 분석 그레이박스 분석 그레이박스 방식으로 Microsoft SQL 서버의 결함 찾기 변환기의 방법 입력 추적하기 버전간의 차이 훔쳐보기 코드 영향 범위 이용하기 커널에 접근하기 공유 버퍼에서 데이터 빼돌리기 접근 요구 조건의 실수 감사하기 내가 만든 API 사용하기 대화형 역어셈블러(IDA) 플러그인 사용하기 소프트웨어 역컴파일과 역어셈블리하기 실제로 역컴파일 해보기 : helpctr.exe 역변환하기 버그 보고 디버그 로그 대량의 취약점을 자동으로 감사하기 IDA-pro를 사용하여 자동으로 분석하기 자신만의 크랙 도구 만들기 x86 도구 중단점에서 메모리에 읽고 쓰기 다중쓰레드 프로그램 디버깅 쓰레드나 프로세스 열거 한 단계씩 실행 패치하기 결함 주입 프로세스 순간 포착 기계어 역어셈블리 기본 코드 영향 범위 측정 툴 만들기 boron 태그 조사하기 결론 제4장 서버 소프트웨어 깨기 신뢰하고 있는 입력 문제 공격 유형 : 클라이언트 숨기기 권한 상승 문제 프로세스-퍼미션은 신뢰와 같다 관리자 권한을 요구하지 않으면 모조리 깨진다! 공격 유형 : OS 자원을 사용할 수 있는 프로그램을 선택하라 신뢰할 수 없는 곳에서 데이터를 읽는 권한이 상승되는 프로세스 공격 유형 : 상승된 권한으로 명령을 수행하기 위해 사용자가 제공하는 구성 파일을 사용하라 권한 상승된 구성요소를 사용하는 프로세스 주입 지점 찾기 입력 파일 지켜보기 공격 유형 : 구성 파일 탐색 위치 사용하기 입력 경로 추적하기 솔라리스 SPARC 바이너리에서 GDB와 IDA-pro 같이 사용하기 중단점과 표현식 설정하기 IDA에서 실시간 메모리 주소 매핑하기 실행중인 프로세스에 붙이기 솔라리스에서 Truss 사용하여 목표 프로그램을 모델 구성 파일 사용하여 신뢰관계 깨기 공격 유형 : 실행 파일에 바로 접근하기 직접 실행할 수 있는 파일 감사하기 현재 실행 디렉토리 알아보기(CWD) 웹 서버가 cgi 프로그램을 실행하지 않는다면? 공격 유형 : 스크립트에 포함된 스크립트 실행할 수 없는 파일들은 사용할 수 없을까? 공격 유형 : 실행할 수 없는 파일에서 실행 가능 코드 부추기기 정책 가지고 놀기 서버 소프트웨어를 위한 특별한 기술과 공격들 기술 : 쉘 명령어 주입 공격 유형 : 인자 주입 공격 유형 : 명령어 구분문자 공격 유형 : 다중 파서와 이중 이스케이프 문자 기술 : 파이프 배관, 포트 그리고 퍼미션 기술 : 파일 시스템 탐색하기 공격 유형 : 파일 시스템 호출에 사용자가 입력한 변수 전달 공격 유형 : 후위 NULL 종결자 공격 유형 : 후위, NULL 종결 그리고 백슬래시 공격 유형 : 상대 경로로 탐색하기 기술 : 환경 변수 조작 공격 유형 : 클라이언트가 조작할 수 있는 환경 변수 기술 : 외부 변수 활용하기 공격 유형 : 사용자가 입력하는 전역 변수(DEBUG=1, PHP 전역 변수, 그 외 다수) 기술 : 조악한 세션 승인의 결함 증폭시키기 공격 유형 : 세션 ID, 자원 ID 그리고 눈 먼 신뢰 기술 : 세션 ID에게 폭력 휘두르기 기술 : 승인을 얻는 여러 가지 경로 기술 : 오류 검사 코드 무력화하기 결론 제5장 클라이언트 소프트웨어 깨기 공격 대상으로서의 클라이언트 소프트웨어 서버가 클라이언트를 조정한다 소프트웨어 꿀단지 대역내 신호 오래된(그러나 아직도 영향력 있는) 역사 공격 유형 : 아날로그 대역내 스위칭 신호 대역내 신호의 기본 사용 대역내 신호로 프린터 가지고 놀기 리눅스에 대역내 터미널 문자 주입하기 공격 유형 일부 : 터미널 기기 조작하기 반사 문제 크로스 사이트 스크립팅(XSS) 신뢰받고 있는 사이트에서 반사 사용하기 공격 유형 : 간단한 스크립트 주입 공격 유형 : 스크립트 요소가 아닌 곳에 스크립트 끼워 넣기 공격 유형 : HTTP 헤더로 하는 XSS 공격 유형 : HTTP 질의 문자열 공격 유형 : 사용자 조종 파일 이름 클라이언트 스크립트와 악의적 코드 취약한 로컬 호출 감사하기 웹 브라우저와 ActiveX 공격 유형 : URL을 기다리는 함수에 로컬 파일 이름 넘겨주기 이메일 주입 공격 유형 : 이메일 헤더 속 메타 문자 컨텐츠 기반 공격 공격 유형 : 컨텐츠를 기반으로 파일 시스템 함수 주입 역류 공격 : 클라이언트측 버퍼 오버플로우 공격 유형 : 클라이언트측 주입, 버퍼 오버플로우 결론 제6장 교활한(악의적) 입력 방어자의 딜레마 필터 통신 시스템 침입 감지(?) 서명 기반 대 변형 기반 IDS 리액티브 가입 서비스로써의 IDS IDS에서 인코딩 방식을 바꿈으로써 오는 효과 분할 분석 윈도우를 위한 APISPY 다시 보기 빨간 칠하기(Red Pointing) 코드 추적 취약한 곳에서 역추적 막다른 골목 실시간 추적 빠른 중단점 버퍼 추적 Leapfrogging 메모리 페이지 중단점 boron 태그 역파서 코드 문자 변환 바이트 연산 포인터 연산 NULL 종결자 예제 : I-Planet 서버 6.0 입구부터 시작해서 역변환해보자 잘못된 분류 공격 유형 : 웹 서버 잘못 분류하도록 만들기 "동일한" 요구 만들기 API 계층 매핑하기 유령 문자 공격 유형 : 유령 문자 만들도록 인코딩하기 동일한 메타 문자 공격 유형 : 슬래시 넣어서 다르게 인코딩하기 메타 문자 이스케이프 시키기 공격 유형 : 이스케이프된 슬래시 넣어서 다르게 인코딩하기 문자 변환 공격 유형 : 유니코드 인코딩 공격 유형 : UTF-8 인코딩 공격 유형 : URL 인코딩 공격 유형 : IP 주소 다르게 쓰기 혼합해서 공격하기 공격 유형 : 슬래시와 URL 인코딩 섞어쓰기 감사 프로그램 망가뜨리기 공격 유형 : 웹 로그 결론 제7장 버퍼 오버플로우 버퍼 오버플로우 101 스택 후려치기(그냥 재미로, 혹은 무언가를 위해) 손상된 상태 주입 벡터 : 또다시 입력 어디서 주입 벡터가 끝나고 페이로드가 시작되는가? 정확한 코드 주소 고르기 높은 위치와 낮은 위치 주소 빅 엔디언과 리틀 엔디언 레지스터 사용하기 메모리에 있던 코드나 데이터 블록 사용하기 버퍼 오버플로우와 내장형 시스템 군사용과 상업용 내장형 시스템 데이터베이스 버퍼 오버플로우 저장 프로시저 명령어라인 응용 데이터베이스의 클라이언트 버퍼 오버플로우와 자바?! 자바와 C/C++ 같이 쓰기 저장 프로시저와 DLL 컨텐츠 기반 버퍼 오버플로우 공격 유형 : 바이너리 파일 오버플로우 공격 유형 : 변수와 태그 오버플로우 공격 유형 : 심볼릭 링크 오버플로우 공격 유형 : MIME 변환 공격 유형 : HTTP 쿠키 버퍼 오버플로우로 감사 파일 잘라내기와 필터 무력화 공격 유형 : 버퍼 오버플로우로 필터 무력화 환경 변수로 오버플로우 일으키기 공격 유형 : 환경 변수로 버퍼 오버플로우 공격 유형 : API 호출에서 버퍼 오버플로우 공격 유형 : 로컬 명령어라인 유틸리티에서 버퍼 오버플로우 다중 연산 문제 공격 유형 : 파라미터 확장 버퍼 오버플로우 날만한 곳 찾기 예외 처리는 오류를 숨기고 있다 역어셈블러 사용하기 스택 오버플로우 고정 크기 버퍼 알아서 NULL로 종결시키지 않는 함수 단일 바이트 초과 문제를 일으키는 함수 예외 처리기 프레임 덮어쓰기 메모리 관리할 때 계산 오류 내기 음수는 큰 수와 같다 부호있는/부호없는 수 불일치 부호있는 수와 메모리 관리 포맷 문자열 취약점 메모리에 있는 아무 데이터나 출력하기 코드 문제점 검출하기 공격 유형 : syslog()의 문자열 포맷 오버플로우 힙 오버플로우 Malloc과 힙 버퍼 오버플로우와 C++ Vtable 페이로드 자신만의 베어링 갖기 페이로드 크기 하드 코드 함수 호출 사용하기 동적 점프 테이블 사용하기 데이터 영역 위치시키기 XOR 보호 체크섬/해시 읽어오기 RISC 구조에서 페이로드 “분기 지연”인가 “지연 슬롯”인가 MIPS 기반 페이로드 만들기 MIPS 명령어 베어링 만들기 MIPS 코드에서 NULL 바이트 없애기 MIPS에서 syscall SPARC 페이로드 만들기 SPARC 레지스터 윈도우 SPARC 스택 살펴보기 SPARC의 함수 호출 내포 관계 PA-RISC 페이로드 만들기 PA-RISC 스택 살펴보기 HPUX PA-RISC에서 스택 오버플로우 PA-RISC에서 공간 분기(inter-space branching) 공간 트램펄린 베어링 만들기 HPUX에서 스스로 해독되는 페이로드 AIX/PowerPC 페이로드 만들기 베어링 만들기 PowerPC 쉘 코드를 위한 공격용 장갑 NULL 문자 없애기 다중 플랫폼 페이로드 다중 플랫폼 nop 썰매 함수를 보호하기 위한 프롤로그/에필로그 코드 (StackGuard로 알려진) 카나리아 값 무력화시키기 실행할 수 없는 스택 무력화시키기 결론 제8장 루트킷 파괴 프로그램 루트킷이란? 커널 루트킷이란? 커널 루트킷과 신뢰하는 연산 간단한 Windows XP 커널 루트킷 루트킷 만들기 검사용 빌드 환경 루트킷 소스의 파일 빌드하기 커널 드라이버 드라이버의 기본 구조 프로그램이 언제 드라이버를 사용하는가? 삭제할 수 있는 드라이버 만들기 드라이버 등록하기 SystemLoadAndCallImage 사용하기 콜 후킹 프로세스 숨기기 시스템 호출 가로채기 기본적인 콜 후킹 구조 프로세스 기록 없애기 프로세스 대신 주입하기 트로이 목마 실행 가능 파일로 리다이렉션 리다이렉션과 Tripwire 문제 리다이렉션 드라이버 파일과 디렉토리 숨기기 바이너리 코드 패치 국소 패치 모든 보안을 해제하는 NT 커널 패치 하드웨어 바이러스 하드웨어 메모리에서 읽고 쓰기 예제 : 키보드 하드웨어에서 읽고 쓰기 EEPROM에서 읽고 쓰기 CIH EEPROM과 시간 맞추기 이더넷 EEPROM 직렬 EEPROM vs 병렬 EEPROM 하드웨어 굽기 제조사 CFI로 칩 검출 예제 : 플래쉬 RAM 칩 검출 ID 모드나 JEDEC ID로 칩 검출 하위 레벨 디스크 접근 MBR에 쓰고 읽기 CD-ROM 이미지 감염시키기 드라이버에 네트워크 지원 덧붙이기 NDIS 라이브러리 사용하기 무차별 모드로 인터페이스 놓기 적절한 네트워크 카드 찾기 보안을 위해 boron 태그 사용하기 대화형 쉘 붙이기 인터럽트 IRQ 구조 IDT 가로채기 PIC의 신비 키 로깅 리눅스 키 로거 Windows NT/2000/XP 키 로거 키보드 제어 칩 고급 루트킷 토픽 루트킷 디버거처럼 쓰기 Windows 시스템 파일 보호 무력화시키기 물리 메모리에 직접 쓰기 커널 버퍼 오버플로우 커널 이미지 감염시키기 실행 파일 리다이렉션 루트킷 찾아내기 결론 |