취약점 분석 55

FindWindow, 우회방법

안티리버싱 FindWindow, 우회방법 [ FindWindow API ]클래스네임과 윈도우네임이 일치하는 top-level 윈도우가 있다면 핸들을 반환.없다면 0 반환. [파라미터]LPCTSTRlpClassName: class name 또는 atom을 나타내는 null로 끝나는 문자열 포인터.atom이라면 GlobalAddAtom으로 생성된 global atom이어야 한다.atom은 16bit 값으로, lpClassName (4bytes)의 high-order word(2bytes)는 0으로 채우고 나머지 low-order word(2bytes)에 atom값이 위치해야 한다. LPCTSTRlpWindowName: window name (window title)을 나타내는 null 종료 문자열 포인터.n..

IsDebuggerPresent, 우회 방법

안티리버싱 IsDebuggerPresent [IsDebuggerPresent]IsDebuggerPresent 내부를 들여다 보자꾸나.mov eax, dword ptr fs:[18h] //TEB.self를 eax에 (TEB주소 그대로 eax로)mov eax, dword ptr [eax+30h] //TEB.PEB를 eax에 (PEB 주소를 eax에)movzx eax, byte ptr [eax+2] //PEB.BeingDebugged (디버깅 중이라면 1, 아니라면 0)ret 요약 : PEB.BeingDebugged 값을 eax에 담고 리턴. [TEB]fs:[18h] == 현재 스레드 TEB 주소.[eax+30h] == TEB에서 PEB주소 획득. [PEB][eax+2] == PEB의 BeingDebugged..

FS 레지스터를 알아보자.

FS 레지스터를 알아보자. FS 레지스터는 유저모드에서 현재 스레드의 TEB(Thread Environment Block)을 가리킨다.FS 레지스터는 커널모드에서는 일반적으로 KPCR(Kernel Process Control Region)을 가리킨다. 사용자 어플리케이션의 안티리버싱 기법을 정리하고자 FS레지스터를 짚고있으므로 유저모드 입장에서 다룬다. in windbgdt _TEB 명령어를 입력 ==> TEB 구조체 구조 확인 가능. FS레지스터가 TEB주소를 담는다면, FS:[0x30] == TEB.ProcessEnvirionmentBlock == PEB 주소 !teb: 현재 스레드의 요약정보 / TEB 주소(0x7efdd000)를 얻고, dt _TEB 7efdd000 : 현재 스레드의 TEB 구조체..

Mutex 뮤텍스 API 함수 정리

Mutex 뮤텍스 API 함수 정리뮤텍스는 커널 모드 동기화 오브젝트 이다. 동기화를 위해 사용되는 API 함수들은 아래와 같다.1) CreateMutex : 뮤텍스 생성 (핸들 획득)2) OpenMutex : 뮤텍스 핸들 획득 (핸들 획득)3) ReleaseMutex : 뮤텍스 반환 [사용]WaitForSingleObject(hMutex, INFINITE); //뮤텍스 획득까지 기다림. ( 기다릴 뮤텍스의 핸들, 기다리는 시간 )//사용//ReleaseMutex(hMutex); API 함수들을 하나씩 살펴 보자.1) CreateMutexSyntax출처 : https://docs.microsoft.com/ko-kr/windows/desktop/api/synchapi/nf-synchapi-createmut..

(임계영역) CriticalSection API 함수 정리

(임계영역) CriticalSection API 함수 정리 뮤텍스와 비슷한 개념이지만, 임계영역은 '같은' 프로세스 내부의 스레드를 동기화 한다. (속도 더 빠름) 당연히 공유자원 사용에서 발생하는 문제를 유발하지 않으려면 한번에 하나의 스레드만 진입 해야한다.관련 API 함수를 알아보자. 출처 : https://docs.microsoft.com/en-us/windows/desktop/api/synchapi/nf-synchapi-tryentercriticalsection [ 임계 영역 사용 흐름 ] 1) 임계영역 초기화InitializeCriticalSectionInitializeCriticalSectionAndSpinCount 2) 임계영역 소유권 획득/반환 --- 상호 배타적 접근을 만족하며 프로세스..

Win API) 메모리 값 읽기

WinAPI로 메모리 값 읽기. Pin을 이용하여 ReadFile 인자를 전역변수로 잡아두고 After에서 읽은 결과를 뽑아내고자 한다.포인터 변수에 메모리 주소를 담았는데 *를 하나 더 붙이니 에러가 난다. 이럴 경우 윈도우 API 함수인 ReadProcessMemory() 함수를 쓰면 된다.프로세스 핸들이야 GetCurrentProcess() 함수로 받아오면 되고, 나머지는 선언해서 인자로 주면 된다. PIN_LockClient();WINDOWS::BYTE *tmp_buffer = new WINDOWS::BYTE[tmp_size]; //ReadFile 결과 버퍼 내용을 읽어들임.WINDOWS::HANDLE cprocess = WINDOWS::GetCurrentProcess();TraceFile

메모리 값을 Hex 문자열로 출력하기

PIN API 함수를 이용하여 메모리 값을 Hex문자열로 출력하기. WINDOWS::BYTE 타입의 배열을 선언하고 메모리 값을 읽고 파일로 출력하면 Byte값이 hex 형태로 잘 나오는데, ASCII로 표현 가능한 문자는 ASCII 문자로 출력이 된다...!!ㅜㅜ PIN_API에서 ADDRINT 값을 hex 형태의 문자열로 바꿔주는 함수인 hexstr() 함수를 지원한다.다양한 타입을 받아들이므로 쓰는데 큰 무리가 없다. hexstr(바꿀문자열, width)여기서 width는 자릿수라고 생각하면 된다. width 값을 주지 않을 경우 0x0A는 0xA로 출력이 된다.원하는 자릿수를 명시하여 값을 맞추자. 나는 BYTE별로 출력하고 있으므로 width를 2로 주었다. 원하던 대로 hex 값들이 두자릿수에..

명령어 주소를 이미지이름+나머지로 나타내기

[PinTool] 명령어 주소를 '이미지이름 + 나머지'로 출력하기. Pintool에서 InsertCall로 함수를 삽입할 때 지금 보고 있는 위치가 어디인지 식별하기 위해 인자로 IARG_INS_PTR을 넘겨 현재 명령어의 주소를 받아 파일로 출력하곤 한다. Imagebase는 자주 바뀌므로 IDA를 통해 본다던지 등에서 불편함이 있을 때가 많은데, IDA와 병행해서 보기 편하게 'dll+나머지주소'로 출력한다면 훨씬 수월하게 추적이 가능하다. 자주 사용하는 방식이므로 기록해두고자 한다. 넘겨받은 IARG_INS_PTR로 '현재 명령어 주소'는 가지고 있는 상태라고 가정한다. 현재 명령어가 속한 이미지를 찾기 위해서는 IMG_FindByAddress() 함수를 사용한다.이로써 img object를 얻었..

EXIF Format

Exif format 이란?: Exchangable Image File의 약자로 기본적으로 JPEG file format과 동일하다.★ "사진의 정보" & "썸네일 사진"을 담는다. 예를 들면 쉽게 이해가 된다.[카메라 정보]제조 업체 : Apple카메라 모델 : iPhone 6s [이미지 정보]사진 크기 : 2192 * 2921너비 : 2192픽셀높이 : 2921픽셀수평 해상도 : 72 DPI수직 해상도 : 72 DPI등의 정보들이 담겨있는데, 이 정보들이 바로 JPEG포맷에 삽입된 Exif format이다. JPEG라면 파일의 시작은 항상 SOI(Start of Image) Marker인 "FF D8"이다. 다음으로 APP0(JFIF)과 APP1(Exif) marker, 이후..

JPEG 헤더 구조

JPEG header structure JPEG, JPG는 손실 압축된 파일이다. 불필요한 픽셀들을 제거하는 방식으로 좋은 화질을 유지하며 큰 압축 효과를 얻지만 원본과는 어느정도 차이가 발생한다. 아래 설명에서 JFIF( JPEG File Interchange Format)는 JPEG 인코딩을 준수하는 파일을 JIF(JPEG Interchange Format)로 변환하기 위한 format이다. JFIF는 JFIF Marker들과 JFIF Marker Segment들로 구성된다.(Segment없이 Marker만 독립적으로 있기도 함.) 우선 파일의 전체적인 틀은 다음과 같다. JFIF file structure Segment Code Description SOI FF D8 Start Of Image를 의..