124번 째 줄의 get_buffer() 함수는 입력 버퍼를 할당 받은 header 힙에 저장합니다. 만약 current_track에 0x8000000보다 큰 값을 넣고 부호 있는 정수형으로 반환한다면 current_track 값은 음수가 될 것입니다. 그리고 if문은 false를 반환할 것 입니다. 그리고 178번째 부터 181까지의 쓰기 작업으로 총 4번의 NULL 포인터 역참조가 발생합니다. 정상적인 흐름 1. fourxm -> tracks 가 null로 초기화됩니다. 2. 만약 strk 청크를 포함하고 있다면(160번째 줄) 헤더로부터 정수를 추출해서 current track에 넣습니다. 3. track_count보다 current_track+1 이 크면 fourxm->tracks를 가리키는 메모..
static 한 방식으로 취약점을 찾는 전략은 strcpy, strcat 같은 안전하지 않는 c/c++ 라이브럴 함수들 근처에 있는 코드를 찾는 방법이다. 또는 부호와 관련된 취약점을 찾기 위해 movsx 명령어를 디스어셈블리에서 검색할 수 있다. 추약한 코드 위치를 찾았담ㄴ 그 코드로부터 역추적하면서 app의 엔트리 포인트에서 접근 가능한 취약점을 노출하고 있는지 살펴본다. 퍼징이라는 방법도 있다. 자신만의 퍼징 프레임 네트워크를 개발해서 대부분의 버그를 퍼징 툴로 찾아내는 사냥꾼들도 있다. 복잡한 프로그램이 주어졌을 때 데이터가 전달되는 시작점을 찾기란 쉽지 않겠지만 복잡한 소프트웨어는 망가진 입력 데이터를 처리할 때 충돌이 일어난ㄷ. 웹브라우저, 오피스 제품군이 그렇다. 즉 파싱하는 소프트웨러들이다..
Fuzzing 이란? 자동화된 소프트웨어 테스트 기법으로 컴퓨터에 예상치 않은 무작위 데이터를 입력하는 것이다. 그래서 프로그램의 충돌이나 잠재적 메모리 누수 발생 감시를 한다. 어떤 입력에 대해서도 퍼즈 가능하다. 퍼징에는 변이 기반 생성 기반 두 종류가 있다. 퍼저가 새로운 데이터를 정의하는 방식이다 취약점을 발견하는 방식 화이트 박스 테스트 소스가 공개되어 있는 경우 소스코드를 통한 분석을 한다. Code review MWR labs- Chrome type confusionPinkie Pie- 2012 Pwnium- 2013 Mobile Pwn2Own 블랙박스 테스트 소스코드가 공개되어 있지 않은 경우 퍼징을 통해 취약점을 찾고 분석한다. 이 것을 블랙 박스 테스트라고 한다. Fuzzing 두 가지..
1.6 디버깅 툴 드라이버의 경우에도 디버깅이 가능하다. 단 커널 레벨에서 동작하기 때문에 간단하지 않다. 드라이버 디버깅에 사용하는 두 가지 툴이 DebugView 와 WinDBG 이다. 1.6.1 DEBUGVIEW 실시간으로 디버깅할 수 있는 것이 아니라 디버그 출력 관련 API를 출력한다. 주로 런타임 디버깅이 불가능한 경우 사용한다. 블루스크린이 발생할 때 함께 전달되는 버그 체크 코드와 문제 발생 시점을 보고 의심되는 코드 위치에 특정 변수의 값을 디버그 메시지로 출력하거나 특정 루틴이 호출되었는지 확인하는 용도로 사용한다.Capture Kernel 옵션을 체크해야지 커널에서 발생한 로그를 볼 수 있다. 드라이버가 출력하려고 하는 디버그 로그를 보는 방법은 DebugView 프로그램을 이용하거나..
드라이버 INF 구조 드라이버를 작성하면 같이 작성해야하는 것이 바로 INF 파일이다. 사용자의 컴퓨터에 장치가 연결되면 운영체제는 INF를 보고 어떤 드라이버를 연결할지 판단한다. INF는 섹션으로 구분해서 드라이버 정보를 기술한다. 섹션은 [ ] 로 감싸서 구분한다. [ Version ] 섹션 어떤 포멧의 내용을 서술하게 되는지 설명한다. Signature $WINDOWS NT : NT 계열의 운영체제만 지원한다. 즉 요즘 운영체제를 지원한다는 의미이다. $WINDOWS 95 : 9X와 ME 계열 지원 $Chicago : 모든 계열의 운영체제를 지원한다. Class=class-name 드라이버가 어떤 클래스를 지원하는 드라이버인지 나타낸다. 여기서 클래스는 장치 유형을 말한다. USB, 마우스 키보드..
2 개발툴 설치 1.2.1 WDK DDK : XP WDK 6000 : XP, 비스타 WDK 7600 : XP, 비스타, 윈도우7WDK 8.0 : 비스타, 윈도우7 윈도우8 윈도우 8.1WDK 8.1 : 비스타, 윈도우7 윈도우8, 윈도우 8.1 1.2.2 WDM, KMDF 그리고 UMDF 윈도우에서 사용되는 디바이스 드라이버들은 유형에 따라서 코딩 방식이 서로 다르다. 보편적으로 많은 드라이버들이 사용하는 것이 WDM 그리고 WDF에 대해서 간단히 소개할 예정이다. WDM과 WDF는 사실상 같은 드라이버로 봐도 무방하다. WDM 형식은 C WDF 는 C++, MFC 정도로 비유하면 딱 맞다. 그래서 WDM 형식으로 개발해본 경험자들은 WDF형식의 드라이버를 개발한 개발자보다 OS 지식이 훨씬 풍부하다고도..
1. 디바이스 드라이버 1.1.1 기본 설명 유형에 따라서 드라이버 개발 방법이 서로 다르기 때문에 한 가지 유형의 드라이버를 개발해본 개발자라도 다른 지식의 도움 없이 다른 유형의 드라이버를 작성하는 것은 어렵다. 요컨데 오디오 디바이스 드라이버를 개발해봤어도 블루투스 드라이버를 개발하는 것은 힘들다는 것이다. 디바이스 드라이버는 오디오 배터리 블루투스 디스플레이 파일시스템 네트워크 등등등 아주 다양하다. 1.1.2 레거시 드라이버 개발자들에게 레거시 드라이버(legacy driver)는 여러가지 의미로 사용되는데 PNP Driver(Plug and Play) 의 한 종류로 실제 하드웨어가 존재하지 않는 상황에서 가상의 하드웨어를 하나 만든 뒤 이를 위한 드라이버를 만들게 되는데 이 것을 레거시 드라이..
이 문제는 RTL ( Return inTo Libc) 을 사용해야합니다. 그 이유는 bf 자체를 차단해버렸기 때문입니다. 이 의미는 스택 사용한 직접적인 BOF의 차단을 의미한다고 할 수 있겠습니다. RTL 기법은 리턴주소를 직접 쉘코드로 지정하는 것이 아니라 시스템 함수를 간접호출해서 쉘을 실행시키는 방식입니다. 여기서는 system함수를 이용해 /bin/sh를 실행해 간접적으로 쉘을 실행하겠습니다. CALL 의 이해입니다. CALL 어셈블리는 일반적으로 다음과 같은 순서로 진행됩니다. 1. 매개 변수에 해당하는 인자 값들을 PUSH 합니다. 2. 해당 함수로 이동하기 전에 리턴할 주소를 PUSH 합니다. 3. 해당 주소로 점프합니다. 따라서 익스플로잇 코드의 구성은 다음과 같습니다. 44 바이트의 버..
- Total
- Today
- Yesterday
- gdb intel
- module
- LKM
- 리눅스 모듈
- 레거시 드라이버
- vmware 오류
- IRP
- DriverEntry
- 백도어
- 디바이스
- breakpoint
- gdb intel 변환
- Intel
- VMware
- 루트킷
- 모듈
- gdb 명령어
- rootkit
- backdoor
- 변환
- PNP 드라이버
- BP
- 드라이버
- vmware cannot connect to the virtual machine
- GDB
- gdb명령어
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |