SystemHack

윈도우 퍼징 1일차 - 02.13

"Fandu-버그 헌팅 튜토리얼" 문서 보면서 따라가보기

colean -window exploit guide

bff 퍼저 설치

퍼징

  • 손퍼징과 퍼저를 이용하는 방식의 두 가지가 존재함.
  • 시드 파일 : 프로그램 크래시 발생시키는 원인 입력파일. 파일 형식별로 만들어져 있기도함.
  • BFF 퍼저
  • 뮤테이션 : 시드파일을 무작위로 바꿔가면서 진행
  • 제네레이션 : 프로토콜과 프로그램 형식에 맞게 시드파일을 생성

프로그램 취약점을 찾기 위해선

  1. 프로그램의 구조에 대한 이해가 우선
  2. 시드로 사용될 파일 구조에 대한 이해도 필요
  3. 익스플로잇은 그 다음

BFF Fuzzer

다운로드 링크

기본적으로 환경이 세팅된 vmx를 제공함. 윈도우 버전도 있는거 같은데, 두가지를 다 시도해보자.

일단 윈도우 버전 - Windows Installer로 된거 다운받음. 환경 세팅에 필요한 구성요소들이 같이 설치된다. 수동으로 진행해야할게 꽤 되는 모양

BFF는 파이썬2.7 기반으로 동작된다. 3버전 이상인 경우는 실행시에 문법 오류가 발생하므로, 이런 경우는 파이썬 다운그레이드를 진행하거나 멀티버전 세팅을 해줘야함.


kmp 4.1.5.8 .dib 포맷 힙 오버플로우 취약점

  • 구버전 kmp 4.1.5.8 에서 발생하는 취약점
  • dib 포맷 24비트 사용

seed.dib 파일 생성 후 010 에디터로 까봄. 역시 좋은 도구를 써야되는가

dib 포맷은 전체적인 구조가 bmp 파일과 유사하기때문에 bmp의 템플릿을 그대로 가져옴.

첫 14바이트는 BITMAPFILEHEADER 구조체

//BITMAPFILEHEADER struct
typedef structtagBITMAPFILEHEADER
{
    WORD bfType;
    DWORD bfSize;
    WORD bfReserved1;
    WORD bfReserved2;
    DWORD bfOffbits;
}BITMAPFILEHEADER;
  • bfType : 매직넘버. 2byte , 0x42 0x4d
  • bfSize : 파일의 크기 : 4byte , 2239542→222c36
  • bfReserved1 : 값이 예약되어있음. 0으로 설정됨. 2byte
  • bfReserved2 : 값이 예약되어있음. 0으로 설정됨. 2byte
  • bfOffbits : 비트맵 정보가 시작되는 오프셋. 4byte ,54→0x36

그 다음 40바이트는 BITMAPINFOHEADER 구조체. 파일의 실실적인 정보들을 담고 있음.

typedef struct tagBITMAPINFOHEADER
{
    DWORD biSize;
    LONG biWidth;
    LONG biHeight;
    WORD biPlanes;
    WORD biBitCount;
    DWORD biCompression;
    DWORD biSizeImage;
    LONG biXPelsPerMeter;
    LONG biYPelsPerMeter;
    DWORD biClrUsed;
    DWORD biClrImportant;
} BITMAPINFOHEADER;
  • biSize : 이 구조체의 크기를 담고있음. 현재 구조체 크기가 40인건 이 값을 그대로 따라가기 떄문 . 4byte, 40 → 0x28
  • biWidth : 비트맵의 가로 픽셀수 , 4byte, 1152 → 0x0480
  • biHeight : 비트맵의 새로 픽셀수 , 이 값이 음수인지 양수인지에 따라 아래-위 구성과 위-아래 구성이 바뀜. 아래-위 구성의 경우는 원점이 아래 왼쪽이 되고, 위-아래 구성은 원점이 위 왼쪽이다. 현재는 대부분이 양수로써 아래-위 구성을 사용함.
  • biPlanes :플레인 개수를 나타냄. 1로 고정, 2bytes.
  • biBitCount : 한 픽셀당 비트의갯수. 이 경우는 24이므로 한 픽셀이 2^24비트로이뤄진다. 2bytes.
  • biCompression : 압축 방식 지정. 아래-위 구성일 때만 압축 가능함. 4bytes
    • BI_RGB : 압축X, 0
    • BI_RLE4 : 4bit 압축, 1
    • BI_RLE8 : 8bit 압축, 2
  • biSizeImage : 이미지의 크기를 바이트 단위로 나타냄. 압축하지 않는 BI_RGB 비트맵에서는 0 . 4bytes. 이 파일에서는 0이 아님. 2239488→0x222c00

이후 값들은 존재는 하나 실제로는 안쓰이는듯.

어느정도 분석이 되었으니, 비트맵 정보가 들어있는 부분을 변경하여 시드파일로 활용하여 퍼저를 돌린다.