앵하니의 더 나은 보안

Bitmap file format 본문

보안 기술/ETC

Bitmap file format

앵한 2022. 7. 18. 22:50

신분증 진위 확인 보안성 심의 진행 중 체크리스트에 '메모리 내 신분증 이미지 정보 노출' 항목이 존재해서 알아보게 됐다.
ios 진단하면서 확인한 rbga8 데이터 포맷을 비트맵 이미지로 확인하려했다.

 

진단 하면서 rbga8 데이터의 주소값을 확인하고, 프로세스가 종료된 후 단말기의 메모리를 덤프해

해당 주소값에서 데이터값을 rbga8의 데이터로 추측되는 hex값을 그대로 가져왔다.

사진으로 찍은 이미지의 사이즈는 아래 frida 소스를 사용해 가로x세로 크기가 각각 1088이란걸 아는 상태

var org_width = ObjC.classes.PlatformOCR["+ getOriginWidth"]; 
Interceptor.attach(org_width.implementation, { 
	onEnter: function(){ 
	}, 
	onLeave: function(retval){ 
		console.log("origin img width > "+retval); 
	} 
}); 
const method = ObjC.classes.PlatformOCR["+ getOriginHeight"]; 
const originalImpl = method.implementation;  
method.implementation = ObjC.implement(method, function (self, sel) { 
	var retval = originalImpl(self, sel); 
	return originalImpl(self, sel);  
});

 

사진으로 찍은 이미지 데이터의 주소 값 또한 아래 frida 소스를 통해 확인한 상태(포인터 변수의 데이터 확인)
var find_org_byte = ObjC.classes.PlatformOCR["+ getOriginBytes"]; 
Interceptor.attach(find_org_byte.implementation, { 
	onEnter: function(args){ 
	}, 
	onLeave: function(retval){ 
		console.log("rgb data is here > "+retval); 
		//console.log(Memory.readByteArray(retval,16)); 
	} 
});


iOS에서 fridump를 사용해 메모리 덤프 후 출력된 주소값이 포함된 메모리 파일을 참고하여 비트맵 데이터를 추출했다.

ex) 비트맵 데이터 메모리주소가 0x78101234로 표시된다면, 0x78100000.dump 파일에서 1234만큼 뒤에 존재하는 데이터


그리고 가져온 hex값을 비트맵 이미지로 확인하고 싶다면 비트맵 파일 헤더 정보를 맞춰줘야한다.
비트맵 파일 헤더의 구조는 아래와 같다.

멤버 크기(바이트) 설명
bfType
2
BMP 파일 매직 넘버. 비트맵 파일이 맞는지 확인하는데 사용하며 ASCII 코드로 0x42(B), 0x4D(M)가 저장
bfSize
4
파일 크기(바이트)
bfReserved1
2
현재는 사용하지 않으며 미래를 위해 예약된 공간
bfReserved2
2
현재는 사용하지 않으며 미래를 위해 예약된 공간
bfOffBits
4
비트맵 데이터의 시작 위치
biSize
4
현재 비트맵 정보 헤더(BITMAPINFOHEADER)의 크기
biWidth
4
비트맵 이미지의 가로 크기(픽셀)
biHeight
4
비트맵 이미지의 세로 크기(픽셀)
양수: 이미지의 상하가 뒤집혀서 저장된 상태
음수: 이미지가 그대로 저장된 상태
보통 세로 크기는 양수로 저장
biPlanes
2
사용하는 색상판의 수. 항상 1
biBitCount
2
픽셀 하나를 표현하는 비트 수
biCompression
4
압축 방식. 보통 비트맵은 압축을 하지 않으므로 0
biSizeImage
4
비트맵 이미지의 픽셀 데이터 크기(압축 되지 않은 크기)
biXPelsPerMeter
4
그림의 가로 해상도(미터당 픽셀)
biYPelsPerMeter
4
그림의 세로 해상도(미터당 픽셀)
biClrUsed
4
색상 테이블에서 실제 사용되는 색상 수
biClrImportant
4
비트맵을 표현하기 위해 필요한 색상 인덱스 수

 

확인한 데이터를 기반으로 이미지 rgba8 데이터 앞단에 아래 비트맵 파일 헤더를 붙이니 비트맵 이미지로 확인가능 했다.(리틀엔디안 기준)

42 4D (비트맵 파일 시그니쳐) 36 40 48 00 (비트맵 파일 크기) 00 00 00 00 (사용하지 않는 공간)36 00 00 00 (비트맵 이미지 데이터의 시작 오프셋 위치) 28 00 00 00 (비트맵 정보 헤더의 크기) 40 04 00 00 (비트맵 이미지 픽셀 기준 가로 크기) 40 04 00 00 (비트맵 이미지 픽셀 기준 세로 크기) 01 00 (항상 1) 20 00(픽셀 하나를 표현하는 비트 수 rgba8은 32비트므로 0x20이 맞음) 00 00 00 00 (압축방식 보통 사용하지 않음) 00 00 00 00 (픽셀 데이터 크기) C4 0E 00 00 (그림의 가로 해상도(미터당 픽셀)) C4 0E 00 00 (그림의 세로 해상도(미터당 픽셀)) 00 00 00 00 (색상 테이블에서 실제 사용되는 색상 수) 00 00 00 00 (비트맵을 표현하기 위해 필요한 색상 인덱스 수)

 

※ rbga8 데이터 타입은 기본적으로 픽셀당 32비트로 표현

'보안 기술 > ETC' 카테고리의 다른 글

flAWS cloud level 1  (0) 2022.08.03
WhiteHat Contest(2021) Imageflare  (0) 2022.07.18
MarkAny DRM decryption  (0) 2022.07.18
(응용프로그램 변조)AhnlabSafe Transaction Bypass  (0) 2022.07.18
(Pwnable.kr) [Toddler's Bottle] fb  (0) 2022.07.18
Comments