책 이미지

책 정보
· 분류 : 국내도서 > 컴퓨터/모바일 > OS/Networking > 네트워크 보안/해킹
· ISBN : 9788960773882
· 쪽수 : 752쪽
· 출판일 : 2013-01-22
책 소개
목차
『버그 없는 안전한 소프트웨어를 위한 CERT® C 프로그래밍』
| 1장 | 표준 사용법
___시스템 품질
___자동 생성 코드
___표준 준수
| 2장 | 전처리기(PRE)
___PRE00-C. 함수형의 매크로보다는 인라인이나 정적 함수를 사용하라
___PRE01-C. 매크로에서는 매개변수에 괄호를 사용하라
___PRE02-C. 매크로로 치환될 영역은 반드시 괄호로 둘러싸야 한다
___PRE03-C. 타입 인코딩 시 매크로 정의 대신 타입 정의를 사용하라
___PRE04-C. 표준 헤더 파일 이름을 재사용하지 마라
___PRE05-C. 토큰들을 연결하거나 문자열 변환을 할 때 매크로 치환을 고려하라
___PRE06-C. 헤더 파일에 항상 인클루전 가드를 둬라
___PRE07-C. 연속되는 물음표를 사용하지 마라
___PRE08-C. 중복된 헤더 파일 이름이 없는지가 보장돼야 한다
___PRE09-C. 안전한 함수를 덜 안전한 함수로 바꾸지 마라
___PRE10-C. 복수 구문 매크로를 do-while 루프로 감싸라
___PRE30-C. 유니버설 문자열 이름을 여러 문자열을 붙여서 만들지 마라
___PRE31-C. 절대로 불안전한 매크로를 할당, 증가, 감소, 메모리 변수 접근, 함수 호출과 함께 사용하지 마라
| 3장 | 선언과 초기화(DCL)
___DCL00-C. 변하지 않는 객체는 const로 보장해둬라
___DCL01-C. 내부 스코프에서 변수 이름을 재사용하지 마라
___DCL02-C. 시각적으로 구별되는 식별자를 사용하라
___DCL03-C. 상수 수식의 값을 테스트할 때 정적 어썰션을 사용하라
___DCL04-C. 한 번에 여러 변수를 선언하지 마라
___DCL05-C. 코드의 가독성을 높이기 위해 타입 정의를 사용하라
___DCL06-C. 프로그램 로직상의 고정적인 값을 나타낼 때는 의미 있는 심볼릭 상수를 사용하라
___DCL07-C. 함수 선언 시 적절한 타입 정보를 포함시켜라
___DCL08-C. 상수 정의에서는 상수 간의 관계가 적절하게 나타나도록 정의하라
___DCL09-C. errno 에러 코드를 반환하는 함수의 반환 타입을 errno_t로 정의하라
___DCL10-C. 가변 인자를 가진 함수에서는 함수 작성자와 함수 사용자 간의 약속이 지켜져야 한다
___DCL11-C. 가변 인자 함수와 연관된 타입 문제를 파악하고 있어야 한다
___DCL12-C. 불투명한 타입을 사용해 추상 데이터 타입을 구현하라
___DCL13-C. 함수에 의해 바뀌지 않을 값에 대한 포인터를 함수의 매개변수로 사용할 때는 const로 정의하라
___DCL14-C. 여러 컴파일 단위를 거치는 전역 변수 초기화의 순서에 대해서는 어떤 가정도 하지 마라
___DCL15-C. 현재 범위를 넘어서까지 사용되지 않을 객체는 static으로 선언하라
___DCL30-C. 객체를 선언할 때 적절한 지속공간을 지정하라
___DCL31-C. 식별자를 사용하기 전에 먼저 선언하라
___DCL32-C. 서로에게 보이는 식별자가 유일한지를 보장하라
___DCL33-C. 함수 인자에서 restrict로 지정된 소스 포인터와 목적 포인터가 동일한 객체를 참조하지 않게 하라
___DCL34-C. 캐시될 수 없는 데이터에는 volatile을 사용하라
___DCL35-C. 함수 정의와 맞지 않는 타입으로 함수를 변환하지 마라
___DCL36-C. 링크 분류에서 충돌되는 식별자를 선언하지 마라
| 4장 | 표현식(EXP)
___EXP00-C. 연산자 우선순위를 나타내는 데 괄호를 사용하라
___EXP01-C. 포인터로 가리키는 타입의 크기를 결정하기 위해 포인터의 크기를 사용하지 마라
___EXP02-C. 논리 연산자 AND와 OR의 단축 평가 방식을 알고 있어라
___EXP03-C. 구조체의 크기가 구조체 멤버들 크기의 합이라고 가정하지 마라
___EXP04-C. 구조체끼리 바이트 단위로 비교하지 마라
___EXP05-C. const를 캐스트로 없애지 마라
___EXP06-C. sizeof의 피연산자가 다른 부수 효과를 가지면 안 된다
___EXP07-C. 표현식의 상수에 특정 값을 가정함으로써 상수를 사용해 얻는 이득을 없애지 마라
___EXP08-C. 포인터 연산이 정확하게 수행되고 있는지 보장하라
___EXP09-C. 타입이나 변수의 크기를 결정할 때는 sizeof를 사용하라
___EXP10-C. 하위 표현식의 평가 순서나 부수 효과가 발생할 수 있는 영역의 순서에 의존하지 마라
___EXP11-C. 호환되지 않는 타입들에는 연산자를 적용하지 마라
___EXP12-C. 함수에 의해 반환되는 값을 무시하지 마라
___EXP30-C. 시퀀스 포인트들 간의 평가 순서에 의존하지 마라
___EXP31-C. 어썰션의 부수 효과를 피하라
___EXP32-C. volatile 지정자를 캐스팅하여 없애지 마라
___EXP33-C. 초기화되지 않은 메모리를 참조하지 마라
___EXP34-C. 널포인터가 역참조되지 않음을 보장하라
___EXP35-C. 함수의 반환 값을 인접한 다음 시퀀스 포인트에서 접근하거나 수정하지 마라
___EXP36-C. 포인터를 더 엄격하게 할당된 포인터 타입으로 변환하지 마라
___EXP37-C. API에 의해 의도된 인자들로 함수를 호출하라
___EXP38-C. 유효하지 않은 타입이나 비트 필드 멤버들에 대해 offsetof(`)를 호출하지 마라
| 5장 | 정수(INT)
___INT00-C. 구현 시 사용되는 데이터 모델을 이해하고 있어라
___INT01-C. 객체의 크기를 나타내는 정수 값은 rsize_t나 size_t를 사용하라
___INT02-C. 정수 변환 규칙을 이해하라
___INT03-C. 안전한 정수 라이브러리를 사용하라
___INT04-C. 불분명한 소스에서 얻어지는 정수 값은 제한을 강제하라
___INT05-C. 모든 가능한 입력을 처리할 수 없다면 문자 데이터 변환을 위해 입력 함수를 사용하지 마라
___INT06-C. 문자열 토큰을 정수로 변환할 때는 strtol(`)이나 관련 함수를 사용하라
___INT07-C. 숫자 값에는 명시적으로 signed나 unsigned 값을 사용하라
___INT08-C. 모든 정수가 지정한 범위 내에 있음을 확인하라
___INT09-C. 열거형 상수가 유일한 값으로 매핑되도록 보장하라
___INT10-C. % 연산자를 쓸 때 나머지가 양수라고 가정하지 마라
___INT11-C. 정수를 포인터로 혹은 그 반대로 변환할 때 주의하라
___INT12-C. 표현식에서 signed, unsigned 표시가 없는 int 비트 필드의 타입을 가정하지 마라
___INT13-C. 비트 연산자는 unsigned 피연산자에만 사용하라
___INT14-C. 동일한 데이터에 비트 연산자와 산술 연산자를 수행하지 마라
___INT15-C. 프로그래머 정의 정수 타입의 포맷 지정 I/O에 대해 intmax_t나 uintmax_t를 사용하라
___INT30-C. unsigned 정수 연산이 래핑되지 않도록 주의하라
___INT31-C. 정수 변환으로 데이터가 손실되거나 잘못 처리되지 않도록 주의하라
___INT32-C. signed 정수의 연산이 오버플로되지 않도록 보장하라
___INT33-C. 나눗셈이나 모듈로 연산에서 0으로 나누는 에러가 발생하지 않게 하라
___INT34-C. 음수나 피연산자의 비트보다 더 많은 비트를 시프트하지 마라
___INT35-C. 정수 표현식으로 비교하거나 할당할 때 더 큰 타입으로 표현식을 평가하라
| 6장 | 부동소수점(FLP)
___FLP00-C. 부동소수점 수의 제한을 이해하라
___FLP01-C. 부동소수점 표현식을 재배치할 때 주의하라
___FLP02-C. 정확한 계산이 필요할 때는 부동소수점 수를 배제할 수 있는지 고려하라
___FLP03-C. 부동소수점 에러를 발견하고 처리하라
___FLP30-C. 부동소수점 변수를 루프 카운터로 사용하지 마라
___FLP31-C. 함수에 복소수를 사용하면서 실제 값을 얻을 거라 기대하지 마라
___FLP32-C. 수학 함수에서 도메인 에러나 영역 에러를 찾고 예방하라
___FLP33-C. 부동소수점 연산용 정수는 먼저 부동소수점으로 바꿔라
___FLP34-C. 부동소수점 변환이 새로운 타입의 범위 안에 들어가는지 확인하라
| 7장 | 배열(ARR)
___ARR00-C. 배열이 어떻게 동작하는지 이해하라
___ARR01-C. 배열의 크기를 얻을 때 포인터를 sizeof의 피연산자로 사용하지 마라
___ARR02-C. 암시적으로 초기화된 경우라도 배열의 경계를 명시적으로 지정하라
___ARR30-C. 배열의 인덱스가 유효한 범위 안에 있음을 보장하라
___ARR31-C. 모든 소스 파일에서 일관된 배열 표기를 사용하라
___ARR32-C. 가변 배열에서 크기를 나타내는 인자가 유효한 범위에 있음을 보장하라
___ARR33-C. 충분한 크기의 공간에서 복사가 진행됨을 보장하라
___ARR34-C. 표현식에서 배열 타입이 호환 가능함을 보장하라
___ARR35-C. 루프에서 반복자가 배열의 끝을 넘어 접근하지 않게 하라
___ARR36-C. 같은 배열을 참조하고 있지 않다면 두 개의 포인터를 빼거나 비교하지 마라
___ARR37-C. 배열이 아닌 객체에 대한 포인터에 정수를 더하거나 빼지 마라
___ARR38-C. 반환 값이 유효한 배열 원소를 참조하고 있지 않은 경우 포인터에 정수를 더하거나 빼지 마라
| 8장 | 문자와 문자열(STR)
___STR00-C. 적절한 타입으로 문자를 표현하라
___STR01-C. 문자열 관리를 위해 일관된 계획을 사용해 일관되게 구현하라
___STR02-C. 복잡한 하위 시스템으로 전달되는 데이터를 검열하라
___STR03-C. 널문자로 종료된 문자열이 부적절하게 잘리지 않게 하라
___STR04-C. 기본 문자 집합에서는 문자들을 위해 char를 사용하라
___STR05-C. 문자열 상수를 가리키는 포인터는 const로 선언하라
___STR06-C. strtok(`)에서 파싱되는 문자열이 보존된다고 가정하지 마라
___STR07-C. 문자열을 처리하는 코드를 수정할 때는 TR 24731을 사용하라
___STR08-C. 문자열을 처리하는 새로운 코드를 개발할 때 관리 문자열을 사용하라
___STR30-C. 문자열 리터럴을 수정하려고 하지 마라
___STR31-C. 문자열을 위한 공간이 문자 데이터와 널 종료문자를 담기에 충분함을 보장하라
___STR32-C. 요구되는 대로 문자열을 널문자로 종료하라
___STR33-C. 와이드 문자 스트링의 크기를 정확히 하라
___STR34-C. 문자들을 더 큰 타입인 정수로 변환하기 전에 unsigned 타입으로 캐스팅하라
___STR35-C. 경계가 불분명한 소스로부터 고정된 길이의 배열에 데이터를 복사하지 마라
___STR36-C. 문자열 리터럴로 초기화된 문자 배열의 경계를 지정하지 마라
___STR37-C. 문자를 처리하는 함수로 전달되는 인자는 반드시 unsigned char로 표현 가능해야 한다
| 9장 | 메모리 관리(MEM)
___MEM00-C. 동일한 추상화 레벨의 같은 모듈 안에서 메모리를 할당하고 해제하라
___MEM01-C. free(`) 후 즉시 포인터에 새로운 값을 저장하라
___MEM02-C. 메모리 할당 함수의 반환 값을 즉시 할당된 타입의 포인터로 변환시켜라
___MEM03-C. 재사용을 위해 반환된 재사용 가능한 리소스에 있는 중요한 정보를 클리어하라
___MEM04-C. 크기가 0인 할당을 수행하지 마라
___MEM05-C. 큰 스택 할당을 피하라
___MEM06-C. 중요한 데이터가 디스크에 기록되지 않도록 보장하라
___MEM07-C. calloc(`)의 인자가 곱해지는 경우 size_t로 표현될 수 있게 하라
___MEM08-C. 동적으로 할당된 배열을 리사이즈하는 경우에만 realloc(`)을 사용하라
___MEM09-C. 메모리 할당 루틴이 메모리를 초기화해줄 것이라 가정하지 마라
___MEM10-C. 포인터 검증 함수를 사용하라
___MEM30-C. 해제된 메모리에 접근하지 마라
___MEM31-C. 동적으로 할당된 메모리는 한 번만 해제하라
___MEM32-C. 메모리 할당 에러를 찾아 해결하라
___MEM33-C. 유연한 배열 원소에 정확한 문법을 사용하라
___MEM34-C. 동적으로 할당된 메모리만 해제하라
___MEM35-C. 객체에 충분한 메모리를 할당하라
| 10장 | 입력과 출력(FIO)
___FIO00-C. 포맷 문자열을 사용할 때 주의하라
___FIO01-C. 파일 이름이나 식별자를 사용하는 함수를 쓸 때 주의하라
___FIO02-C. 신뢰할 수 없는 소스로부터 얻은 경로 이름을 정형화해 사용하라
___FIO03-C. fopen(`)이나 파일 생성에 대해 특정 조건을 가정하지 마라
___FIO04-C. 입출력 에러를 찾아 해결하라
___FIO05-C. 여러 파일 속성을 통해 파일을 식별하라
___FIO06-C. 적절한 접근 권한으로 파일을 생성하라
___FIO07-C. rewind(`)보다 fseek(`)을 사용하라
___FIO08-C. 열린 파일에 대해 remove(`)를 호출할 때 주의하라
___FIO09-C. 시스템 간에 바이너리 데이터를 전송할 때는 주의하라
___FIO10-C. rename(`) 함수를 사용할 때는 주의하라
___FIO11-C fopen(`)의 모드 매개변수를 지정할 때 주의하라
___FIO12-C. setbuf(`)보다 setvbuf(`)를 사용하라
___FIO13-C. 방금 읽은 한 개의 문자 외의 것을 다시 넣지 마라
___FIO14-C. 파일 스트림에서 텍스트 모드와 바이너리 모드의 차이를 이해하라
___FIO15-C. 파일 연산이 안전한 디렉토리에서 수행되고 있음을 보장하라
___FIO16-C. jail을 만들어 파일 접근을 제한하라
___FIO30-C. 포맷 문자열에서 사용자 입력을 배제하라
___FIO31-C. 동시에 같은 파일을 여러 번 열지 마라
___FIO32-C. 파일에만 적용 가능한 연산을 장치에 대해 수행하지 마라
___FIO33-C. 정의되지 않은 동작을 초래하는 입출력 에러를 발견하고 처리하라
___FIO34-C. 문자 I/O 함수의 반환 값을 캡처할 때는 int를 사용하라
___FIO35-C. sizeof(int) == sizeof(char)일 때는 EOF나 파일 에러를 찾기 위해 feof(`)와 ferror(`)를 사용하라
___FIO36-C. fgets(`)를 사용할 때 개행문자가 읽힌다고 가정하지 마라
___FIO37-C. 문자 데이터를 읽었다고 가정하지 마라
___FIO38-C. 입출력 FILE 객체를 복사해 사용하지 마라
___FIO39-C. 플러시나 위치 조정 함수 호출 없이 스트림으로부터 입출력을 교대로 수행하지 마라
___FIO40-C. fgets(`) 실패 시 문자열을 리셋하라
___FIO41-C. 부수 효과가 있는 스트림 인자로 getc(`)나 putc(`)를 호출하지 마라
___FIO42-C. 더 이상 필요 없어진 파일이 적절히 닫혔는지 확인하라
___FIO43-C. 공유 디렉토리에 임시 파일을 생성하지 마라
___FIO44-C. fsetpos(`)에는 fgetpos(`)에서 반환된 값만 사용하라
| 11장 | 환경(ENV)
___ENV00-C. getenv(`)에서 반환한 문자열을 가리키는 포인터를 저장하지 마라
___ENV01-C. 환경변수의 크기를 함부로 가정하지 마라
___ENV02-C. 이름이 같은 여러 개의 환경변수가 존재할 수 있음을 알아두자
___ENV03-C. 외부 프로그램을 호출할 때는 환경변수를 정리하라
___ENV04-C. 커맨드 프로세서가 필요하지 않다면 system(`)을 호출하지 마라
___ENV30-C. getenv(`)가 반환한 문자열을 수정하지 마라
___ENV31-C. 환경변수의 값을 무효화할 수 있는 연산을 수행했다면 더 이상 그 값에 의존하지 마라
___ENV32-C. atexit 핸들러는 반환 외의 방법으로 종료돼선 안 된다
| 12장 | 시그널(SIG)
___SIG00-C. 인터럽트될 수 없는 시그널 핸들러로 처리되는 시그널을 마스크하라
___SIG01-C. 구현마다 다른 시그널 핸들러의 지속성에 대한 세부사항을 이해하라
___SIG02-C. 일반적인 기능을 구현하는 경우에는 시그널의 사용을 피하라
___SIG30-C. 시그널 핸들러에서는 비동기적으로 안전한 함수만 호출하라
___SIG31-C. 시그널 핸들러에서 공유 객체에 접근하거나 수정하지 마라
___SIG32-C. 시그널 핸들러 안에서 longjmp(`)를 호출하지 마라
___SIG33-C. raise(`) 함수를 재귀적으로 호출하지 마라
___SIG34-C. 인터럽트 가능한 시그널 핸들러 안에서 signal(`)을 호출하지 마라
| 13장 | 에러 처리(ERR)
___ERR00-C. 일관되고 이해할 수 있는 에러 처리 정책을 적용하고 구현하라
___ERR01-C. FILE 스트림 에러 체크 시 errno보다 ferror(`)를 사용하라
___ERR02-C. in-band 에러 표시자를 피하라
___ERR03-C. TR 24731-1에 정의된 함수를 호출할 때는 런타임 지정 핸들러를 사용하라
___ERR04-C. 적절한 종료 방법을 선택하라
___ERR05-C. 애플리케이션 독립적인 코드는 별도의 에러 처리 설명이 없는 에러 감지 코드를 제공해야 한다
___ERR06-C. assert(`)와 abort(`)의 종료 시 동작을 이해하라
___ERR30-C. errno를 사용하는 라이브러리 함수를 호출하기 전에 errno 값을 0으로 설정하고, 함수가 에러를 의미하는 값을 반환했을 때는 errno 값을 체크하라
___ERR31-C. errno를 재정의하지 마라
___ERR32-C. 애매한 errno 값에 의존하지 마라
| 14장 | 기타(MSC)
___MSC00-C. 컴파일 시 높은 경고 메시지 옵션을 줘라
___MSC01-C. 논리적으로 완전해지도록 노력하라
___MSC02-C. 실수로 누락하지 않도록 하라
___MSC03-C. 실수로 추가하지 않도록 하라
___MSC04-C. 주석은 일관되고 가독성 있게 사용하라
___MSC05-C. time_t 타입 값을 직접 조작하지 마라
___MSC06-C. 중요한 데이터를 다룰 때는 컴파일러 최적화를 고려하라
___MSC07-C. 죽은 코드를 찾아 제거하라
___MSC08-C. 라이브러리 함수는 자신의 매개변수를 검증해야 한다
___MSC09-C. 문자 인코딩: 안전을 위해 ASCII의 부분집합을 사용하라
___MSC10-C. 문자 인코딩: UTF-8 관련 이슈
___MSC11-C. 어썰션을 사용한 부적절한 진단 테스트
___MSC12-C. 아무 효과도 없는 코드를 찾아 제거하라
___MSC13-C. 사용되지 않는 값을 찾아 제거하라
___MSC14-C. 불필요하게 플랫폼 의존성을 끌어들이지 마라
___MSC15-C. 정의되지 않은 동작에 의존하지 마라
___MSC30-C. 의사난수를 만들기 위해 rand(`) 함수를 사용하지 마라
___MSC31-C. 반환 값이 적절한 타입으로 비교되는지 보장하라
| 부록 | POSIX(POS)
___POS00-C. 멀티스레드의 경쟁 상태를 피하라
___POS01-C. 링크의 유무를 확인하라
___POS02-C. 가장 적은 권한의 원리를 따르라
___POS30-C. readlink(`) 함수를 알맞게 사용하라
___POS31-C. 다른 스레드 뮤텍스를 잠금해제하거나 없애지 마라
___POS32-C. 멀티스레드 환경에서 비트 필드를 사용할 때는 뮤텍스를 도입하라
___POS33-C. vfork(`)를 사용하지 마라
___POS34-C. putenv(`)에 자동 변수에 대한 포인터를 인자로 전달하지 마라
___POS35-C. 심볼릭 링크를 체크할 때 교착 상태를 피하라
___POS36-C. 권한을 취소할 때 해제 순서가 올바른지 확인하라
___POS37-C. 권한 취소가 성공적으로 수행됐는지 보장하라
『보안 전문가와 아이폰 개발자를 위한 iOS 해킹과 방어』
1장 여러분이 제대로 알고 있는 사실은 아무것도 없다
___모노컬처의 신화
___iOS 보안 모델
______iOS 보안 모델의 구성요소
___자물쇠와 열쇠 함께 저장하기
___사용자 암호 = 취약한 보안
___데이터 포렌식으로 암호화 깨부수기
______외부 데이터 역시 위험한 건 마찬가지
___트래픽 하이재킹
______데이터 도난은 순식간
___아무것도 믿지 말자, 직접 작성한 애플리케이션조차도
___물리적 보안은 선택사항이다
___요약
1부 해킹
2장 iOS 해킹 기초
___탈옥 방법을 배워야 하는 이유
___탈옥의 모든 것
______개발자 툴
___최종 사용자용 탈옥
______아이폰 해킹
______DFU 모드
______테더드(Tethered) 대 언테더드(Untethered)
___장치 해킹과 코드 삽입
______커스텀 코드 제작
______바이너리 분석
______바이너리 시험해보기
______코드 데몬화
______타르 파일을 이용한 악성 코드 설치
______램 디스크를 이용한 악성 코드 설치
___연습문제
___요약
3장 파일시스템 훔치기
___디스크 전체 암호화
______솔리드 스테이트 낸드(Solid State Nand)
______디스크 암호화
______iOS 디스크 암호화의 실패 원인
___라이브 파일시스템 복사
______데이터 훔치기 페이로드
______커스텀 launchd 제작
______램 디스크 준비
______파일시스템 이미지 획득
___로우 파일시스템 복사
______로우 이미지 훔치기 페이로드
______커스텀 launchd 제작
______램 디스크 준비
______파일시스템 이미지 획득
___연습문제
___사회 공학 활용
______비활성화된 장치 이용
______초기화된 장치 이용
______맬웨어가 설치된 장치 이용
______암호 공학 애플리케이션 이용
___요약
4장 포렌식 흔적과 데이터 유출
___이미지의 위치 태그 추출
______통합 GPS 캐시
___SQLite 데이터베이스
______데이터베이스 연결
______SQLite 내장 명령어
______SQL 질의 수행
______중요한 데이터베이스 파일 목록
______주소록 연락처
______주소록 이미지
______구글 지도 데이터
______캘린더 이벤트
______통화 기록
______이메일 데이터베이스
______메모
______사진 메타데이타
______SMS 메시지
______사파리 북마크
______SMS 스포트라이트 캐시
______사파리 웹 캐시
______웹 애플리케이션 캐시
______웹킷 저장소
______음성 사서함
___데이터베이스 필드의 파편 리버스 엔지니어링
___SMS 임시 저장 메시지
___프로퍼티 리스트
______중요한 프로퍼티 리스트 파일
___그 밖의 중요한 파일
___요약
5장 암호화 깨부수기
___소게티의 데이터 보호 툴
______데이터 보호 툴 설치
______브루트포스 공격 툴 제작
______필수 파이썬 라이브러리 빌드
___암호화 키 추출
______키 추출 페이로드
______커스텀 launchd 제작
______램 디스크 준비
______커널 준비
______브루트포스 실행
___키체인 복호화
___로우 디스크 복호화
___아이튠스 백업 복호화
___스파이웨어를 이용한 암호화 깨부수기
______스파이웨어 페이로드
______spyd 데몬화
______커스텀 launchd 제작
______램 디스크 준비
______페이로드 실행
___연습문제
___요약
6장 삭제된 파일 복구
___HFS 저널 수집
___빈 공간 카빙
___복구 가능한 주요 데이터
______애플리케이션 스크린샷
______삭제된 프로퍼티 리스트
______삭제된 음성 사서함 메시지와 음성 메모
______삭제된 키보드 캐시
______사진과 기타 개인 정보
___요약
7장 런타임 조작
___바이너리 분석
______마크오 형식
______class-dump-z 사용
______심볼 테이블
___암호화된 바이너리
______오프셋 계산
______메모리 덤프
______복호화된 코드를 파일로 다시 복사
______cryptid 재설정
___쓰크립트로 런타임 조작
______쓰크립트 설치
______쓰크립트 사용
______간단한 잠금 기능 무력화
______메소드 바꿔치기
______데이터 자세히 살펴보기
______데이터 기록
______훨씬 심각한 사례
___연습문제
______스프링보드 애니메이션
______일종의 전화 도청
______스크린샷 생성
___요약
8장 런타임 라이브러리를 사용한 공격
___오브젝티브C 완전 해부
______인스턴스 변수
______메소드
______메소드 캐시
___디스어셈블링과 디버깅
______메시지 엿듣기
______기본적인 오브젝티브C 프레임워크
______오브젝티브C와 인터페이스로 연결
___악성 코드 삽입
______코드삽입 페이로드
______디버거로 코드 삽입
___동적 링커를 사용한 삽입
______영구적인 장치 감염
___요약
9장 트래픽 하이재킹하기
___APN 하이재킹
______페이로드 설치
______제거
___간단한 프록시 설정
___SSL 공격
______SSLStrip
______파로스 프록시
______브라우저 경고
___애플리케이션 수준의 SSL 검증 공격
______SSL 공격 페이로드
___파운데이션 HTTP 클래스 하이재킹
______포스트 공격 페이로드
___데이터 분석
___드리프트넷
______빌드
______실행
___연습문제
___요약
2부 방어
10장 암호화 구현
___암호 강도
______무작위 암호 생성기를 조심하자
___커먼 크립토 라이브러리
______무상태형 연산
______상태유지형 암호화
___마스터 키 암호화
___위치 기반 암호화
______암호를 결합한 위치 기반 암호화
___별도의 서버 측 키
___메모리 보호
______메모리 완전 삭제
___공개 키 암호화
___연습문제
11장 포렌식 대비책
___보안 완전 삭제
______DOD 5220.22-M 완전 삭제
______오브젝티브C
___SQLite 레코드 완전 삭제
___키보드 캐시
___숫자 입력 패드 무작위화
___애플리케이션 스크린샷
12장 런타임 보호
___변조 대응
______사용자 데이터 완전 삭제
______네트워크 접속 비활성화
______서버 보고
______로깅 활성화
______미끼와 킬 스위치
___프로세스 추적 검사
___디버거 차단
___런타임 클래스 무결성 검사
______주소 공간 검증
___인라인 함수
___디스어셈블링 복잡도 높이기
______최적화 플래그
______스트립
______뺑뺑이를 돌리자! -funroll-loops
___연습문제
13장 탈옥 탐지
___샌드박스 무결성 검사
___파일시스템 검사
______탈옥 파일 존재 여부
______/etc/fstab의 크기
______심볼릭 링크 검사
___페이지 실행 검사
14장 다음 단계
___공격자의 입장에서 생각해보자
___책에서 다루지 않은 리버스 엔지니어링 툴
___보안 vs 코드 관리
___보안을 대하는 유연한 자세
___그 밖의 훌륭한 책
『Ajax 보안』
1장 Ajax 보안 소개
___Ajax 첫걸음
______Ajax란 무엇인가?
______비동기 방식
______자바스크립트
______XML
______DHTML(다이내믹 HTML)
___Ajax 아키텍처로의 패러다임 전환
______무거운 클라이언트 아키텍처
______가벼운 클라이언트 아키텍처
______Ajax: 아키텍처계의 금발 미녀
______보안 관점에서 본 무거운 클라이언트 애플리케이션
______보안 관점에서 본 가벼운 클라이언트 애플리케이션
______보안 관점에서 본 Ajax 애플리케이션
___보안 취약점의 재앙
______복잡도, 투명성 그리고 규모의 확장
______사회학적인 이슈
______Ajax 애플리케이션: 매력적인 전략 목표
___결론
2장 보이지 않는 도둑
___이브
___HighTechVacations.net 해킹
______쿠폰 시스템 해킹
______클라이언트단 데이터 바인딩 공격
______Ajax API 공격
___보이지 않는 도둑
3장 웹 공격
___공격의 종류
______리소스 열거
______파라미터 조작
___그 밖의 공격 방법
______크로스 사이트 요청 변조
______피싱
______서비스 거부 공격
___리소스 열거와 파라미터 조작으로부터 보호하라
______보안 소켓 계층
___결론
4장 Ajax 공격 영역
___공격 영역의 이해
___전통적인 웹 애플리케이션 공격 영역
______폼 입력
______쿠키
______헤더
______숨겨진 폼 입력
______쿼리 파라미터
______업로드 파일
___전통적인 웹 애플리케이션 공격: 성적표
___웹 서비스 공격 영역
______웹 서비스 메소드
______웹 서비스 정의
___Ajax 애플리케이션 공격 영역
______Ajax 애플리케이션 공격 영역의 근원
______해커에게 최고의 먹잇감
___적절한 입력 확인
______블랙리스트와 특별 조치의 문제
______병 대신 병의 징후 다루기
______화이트리스트 입력 검증
______정규 표현
______입력 검증에 대한 숙고
___리치 사용자 입력 검증
______마크업 언어 검증
______이진 파일 검증
______자바스크립트 소스코드 검증
______시리얼라이즈 데이터 검증
___사용자 지원 콘텐츠의 신화
___결론
5장 Ajax 코드 복잡도
___다양한 언어와 구조
______배열 인덱싱
______스트링 연산
______코드 주석
______다른 사람의 문제
___자바스크립트와 관련하여
______인터프리트, 컴파일이 아니야
______약한 타입 체크
___비동기
______경쟁 상태
______데드락과 철학자의 식사 문제
______클라이언트단 동기화
___누구의 조언을 듣느냐가 중요하다
___결론
6장 Ajax 애플리케이션의 투명성
___블랙박스와 화이트박스
______예: MyLocalWeatherForecast.com
______예: MyLocalWeatherForecast.com을 'Ajax'로
______비교
___API로서의 웹 애플리케이션
______데이터 타입과 메소드 시그너처
___보안과 관련한 특정 오판
______부당한 인증
______기능이 나뉜 서버 API
______자바스크립트에서의 세션 상태 저장
______민감한 정보가 사용자에게 노출될 때
______클라이언트단 코드에 있는 주석과 문서화
______클라이언트단에서 수행하는 데이터 변환
___모호함을 통한 보안
______난독화
___결론
7장 Ajax 애플리케이션 하이재킹
___Ajax 프레임워크의 하이재킹
______실수로 인한 함수 덮어쓰기
______함수 덮어쓰기의 예
___주문형 Ajax의 하이재킹
___JSON API의 하이재킹
______객체 리터럴의 하이재킹
______JSON 하이재킹이 가능한 이유
______JSON 하이재킹을 막자
___결론
8장 클라이언트단 스토리지 공격
___클라이언트단 스토리지 시스템 개관
______일반적인 클라이언트단 스토리지 보안
___HTTP 쿠키
______쿠키 접근 제어 규칙
______HTTP 쿠키의 저장용량
______쿠키의 생존시간
______쿠키 스토리지에 대한 추가 기억사항
______쿠키 스토리지 요약
___플래시 로컬 공유 객체
______플래시 로컬 공유 객체 요약
___DOM 스토리지
______세션 스토리지
______글로벌 스토리지
______DOM 스토리지의 구멍
______DOM 스토리지 보안
______DOM 스토리지 요약
___인터넷 익스플로러 userData
______보안 요약
___일반적인 클라이언트단 스토리지 공격법과 대처법
______크로스 도메인 공격
______크로스 디렉토리 공격
______크로스 포트 공격
___결론
9장 오프라인 Ajax 애플리케이션
___오프라인 Ajax 애플리케이션
___구글 기어
______자체 보안 기능과 구글 기어의 단점
______작업풀의 이용
______LocalServer 데이터의 노출과 감염
______구글 기어 데이터베이스로의 직접 접근
______SQL 인젝션과 구글 기어
______클라이언트단 SQL 인젝션도 위험한가?
___Dojo.Offline
______키를 안전하게 보호하자
______데이터를 안전하게 보호하자
______패스워드의 선택이 멋진 키를 좌우한다
___클라이언트단 입력을 검증하자
___오프라인 애플리케이션에 대한 그 밖의 접근법
___결론
10장 요청 출처 이슈
___로봇, 스파이더, 브라우저, 크롤러
______안녕, 내 이름은 파이어폭스야. 청크화된 인코딩, PDF도
______좋아하고 해변에서 오랫동안 산책하는 것도 좋아해
___요청 출처 불확정성과 자바스크립트
______웹 서버 관점에서 본 Ajax 요청
______당신일까, 당신을 가장한 누구일까
______자바스크립트로 HTTP 요청 보내기
______pre-Ajax 세계에서의 자바스크립트 HTTP 공격
______XMLHttpRequest로 콘텐츠 사냥하기
______XSS/XHR 조합 공격
___방어
___결론
11장 웹 매시업과 애그리게이터
___머신에서 활용하는 인터넷 데이터
______90년대 초기: 웹의 시대가 오다
______90년대 중반: 머신 웹의 탄생
______2000년대: 머신 웹의 성숙기
______공개적으로 사용 가능한 웹 서비스
___매시업: 웹의 프랑켄슈타인
______ChicagoCrime.org
______HousingMaps.com
______그 밖의 매시업
___매시업 생성3
______매시업과 Ajax
___브리지, 프록시, 게이트웨이 - 이런!
______Ajax 프록시 대안
___Ajax 프록시 공격
______HousingMaps.com?
___매시업의 입력 검증
___애그리게이트 사이트
___보안과 신뢰가 떨어지는 상황
___결론
12장 프리젠테이션 계층에 대한 공격
___프리젠테이션의 콘텐츠 괴롭히기
___프리젠테이션 계층에 대한 공격
___CSS에서 정보 가져오기
___해킹의 룩앤필
______발전된 형태의 해킹 룩앤필
___삽입된 프로그램 로직
___CSS 요소
______브라우저 캐시 수정
___프리젠테이션 계층 공격 방지
___결론
13장 자바스크립트 웜
___자바스크립트 웜 개요
______기존의 컴퓨터 바이러스
______자바스크립트 웜
___자바스크립트 웜의 구성
______자바스크립트의 한계
______자바스크립트 웜의 복제
______자바스크립트 웜 실행부
______중간 정리
___사례 연구: 새미 웜
______어떻게 동작하는가
______바이러스 실행부
______새미 웜에 대한 결론
___사례 연구: 야매너 웜(JS/Yamanner-A)
______어떻게 동작하는가
______바이러스 실행부
______야매너 웜에 대한 결론
___실제 자바스크립트 웜에서 배우는 교훈
___결론
14장 Ajax 애플리케이션 테스트
___블랙 매직
___모든 사람이 웹 브라우저를 이용해 웹 서핑을 하는 것은 아니다.
______Catch-22
___보안 테스트 도구 - 생각만큼 멋지지는 않군요
______사이트 목록 생성
______취약점 탐지
______분석 도구: Sprajax
______분석 도구: Paros Proxy
______분석 도구: LAPSE
______분석 도구: WebInspect™
___보안 테스트에 대한 숙고
15장 Ajax 프레임워크 분석
___ASP.NET
______ASP.NET AJAX(이전에 ATLAS)
______ScriptService
______보안성 비교: UpdatePanel과 ScriptService
______ASP.NET AJAX와 WSDL
______ValidateRequest
______ViewStateUserKey
______ASP.NET 환경설정과 디버깅
___PHP
______Sajax
______Sajax와 크로스 사이트 요청 변조
___Java EE
______DWR
___자바스크립트 프레임워크
______클라이언트단 코드에서 주의할 사항
______Prototype
___결론
부록 A 새미 웜 소스코드
부록 B 야매너 웜 소스코드
『웹 애플리케이션 해킹 대작전』
1장 웹이 특별한 이유
___1장에서 다루는 내용
___개요
___월드와이드웹
___웹 유토피아의 가치
___웹과 클라이언트/서버
___웹 애플리케이션을 위한 결함 모델
______웹 서버
______웹 클라이언트
______네트워크
______결론
2장 목표물에 대한 정보 수집
___2장에서 다루는 내용
___개요
______공격 사금 채취
______공격 파일과 디렉토리 추정
______공격 예제 애플리케이션의 보안 취약점
3장 클라이언트 공격
___3장에서 다루는 내용
___개요
______공격 입력 선택 제한 회피
______공격 클라이언트에서의 검증 회피
4장 상태 기반 공격
___4장에서 다루는 내용
___개요
______공격 숨은 필드
______공격 CGI 인자
______공격 쿠키 조작
______공격 URL 건너뛰기
______공격 세션 가로채기
5장 사용자 입력 데이터 공격
___5장에서 다루는 내용
___개요
______공격 크로스 사이트 스크립팅
______공격 SQL 삽입
______공격 디렉토리 노출
6장 언어 기반 공격
___6장에서 다루는 내용
___개요
______공격 버퍼 오버플로우
______공격 정규화
______공격 널 문자열 공격
7장 서버 공격
___7장에서 다루는 내용
___개요
______공격 SQL 삽입 II - 저장 프로시저
______공격 명령 삽입
______공격 핑거프린팅 공격
______공격 서비스 거부
8장 인증
___8장에서 다루는 내용
___개요
______공격 암호 해독
______공격 인증 파괴
______공격 크로스 사이트 트레이싱
______공격 암호 기법 약화시키기
9장 프라이버시
___9장에서 다루는 내용
___개요
___사용자 에이전트
___리퍼러
___쿠키
___웹 버그
___클립보드 접근
___페이지 캐싱
___액티브X 컨트롤
___브라우저 헬퍼 오브젝트
10장 웹 서비스
___10장에서 다루는 내용
___개요
___웹 서비스란?
______XML
______SOAP
______WSDL
______UDDI
___위협
______WSDL 스캔 공격
______인자 조작
______XPATH 삽입 공격
______재귀 페이로드 공격
______대형 페이로드 공격
______외부 객체 공격
부록 A 소프트웨어 년: 소프트웨어 품질을 위한 핵심 요소
___1950~1959: 기원
___1960~1969: 대이동
___1970~1979: 혼돈의 시대
___1980~1989: 회복기
______CASE 툴
______정형 기법
___1990~1999: 프로세스
___2000~2009: 엔지니어링
부록 B Flowershop 버그
부록 C 툴
___TextPad
___Nikto
___Wikto
___Stunnel
___BlackWidow
___Wget
___cURL
___Paros
___SPIKE Proxy
___SSLDigger
___인간의 두뇌