- 01.Sec.Exploit_milw0rm.com
- 02.FT_moneta.co.kr
- 01.Sec.INfo_KrCERT/CC 보안공지
- 01.Sec.Portal_securityfocus.co…
- 01.Sec.Portal_packetstormsecur…
- 02.FT_삼성경제연구소
- 01.Sec.Virus_Search_virustotal…
- 01.Sec.Tool_foundstone.com
- 01.Sec.Search.attack.IP_myNetW…
- 01.Sec.Search.attack.IP_DShiel…
- 00.Sec.Refer_FIRST.Newsroom
- 00.Sec.Refer_Security.NNOV
- 00.Sec.Refer_OWASP
- 00.Sec.Refer_HITBSecConf
- 00.Sec.Refer_Metasploiit
- 00.Sec.Refer_Xcon
- 00.Sec.Refer_Shmoo
- 00.Sec.Refer_대학CERT연합
- 00.Sec.Refer_Packetstorm
- 01.Sec.Virus_bot.INfo_shadowse…
- 01.Sec.INfo_NCSC_사고사례.기타
- 02.FT_매경.시티라이프
- 03.Etc_Google.Translate.Url
- 03.Etc_Naver.japan.translate.u…
- 01.Sec.Tool_check.ip.info
- 01.Sec.Virus_ahnlab.online.cur…
- 02.FT_다음.아고라
- 02.FT_다음.오로지
- 01.Sec.INfo_KISA_연구보고서
- 02.FT_다음.세일러
- 02.FT_다음.양원석
- 02.FT_한토마.김태동.글모음
- 02.FT_한토마.경제.재테크
- 02.FT_다음.아고라.즐겨찾기
- 01.Sec.Virus_search.malwareURL
- 01.Sec.Virus_anal.script_wepaw…
- 01.Sec.Virus_anal.binary_anubi…
- 03.ETC_고도원의 아침편지
- 02.FT_세이노
- 03.Etc_MyCityLife
- 03.Etc_구본형
- 03.Etc_동국대.논문검색
- 00.Sec.MS_Update
- 01.Sec.INfo_KISA 안전진단
www.ManiaLab.com
[Reference] Reverse-Engineering 본문
API Hooking은 크게 유저모드와 커널모드 두가지로 나뉜다.
User-Mode Hooking
- IAT(Import Address Table) Hooking: IAT 에 적혀있는 API 의 주소를 자신의 함수주소로 바꾸고 자신의 함수 끝에
다시 원래 API 주소로 돌려주는 방식. 가장 일반적으로 바이러스에서 사용하는 기법.
- Inline Function Hooking (Detour Hooking): 사용할 API 의 첫 5바이트를 자신의 함수주소로 Jmp 하는 코드로 바꾸고
자신의 코드에서 다시 원래 API 의 바뀐 코드를 수정해주고 API 시작위치로 돌려주는 방식. IAT 후킹보다 지능적이여서
찾아내기가 쉽지 않다. 요새 많이 등장한다.
Kernel-Mode Hooking (루트킷)
- SSDT(System Service Descriptor Table Modification): SSDT 가 가리키는 주소를 후킹 함수의 주소로 바꾸고
그 함수 호출후 다시 원래 커널 API 의 주소로 돌려주는 기법. 50% 이상의 루트킷이 사용하는 기법. 이런 기법은
프로세스, 파일의 은폐에 많이 사용됨.
- DKOM(Direct Kernel Object Modification): 커널 Object 를 직접 조작해서 실행되는 프로세스, 스레드, 서비스,
포트, 드라이버 및 핸들의 Entry 를 실행리스트(PsActiveProcessHead, PsActiveModuleHead....)에서 감추는 기법.
- SYSENTER: 유저모드에서 시스템 호출로 넘어갈때 INT 2E(for Windows 2000)/ SYSENTER 를 사용하게 되는데
호출후 시스템 서비스의 핸들러는 IA32_SYSENTER_EIP 라는 레지스터리에 저장된다. 커널 드라이버를 설치하여
해당 값을 수정하여 루트킷을 호출하고 다시 원래 값으로 돌려주는 기법.
- Filter Device Drivers: 시큐리티 제품의 하단에 filter device driver 로 등록하는 기법이다. 부트 타임에 로드됨으로써
다른 어떤 안티바이러스 제품보다 먼저 실행된다.
- Runtime Detour Patching: 커널 메모리를 직접 조작함으로써 그 메모리의 포인터가 루트킷을 가르키게 함으로써
커널 함수들을 후킹하는 기법. 예를 들면 Exception 을 일으키고 Exception Handle 을 컨트롤하는 IDT 레지스터를
자신을 가리키는 주소로 써줌으로써 후킹목적을 달성한다.
- IRP table Modification: 디바이스 드라이버가 네트웍 패킷을 처리하거나 파일을 쓸때 사용하는 I/O Request Packets 을
제어하는 Dispatch Routine 은 DEVICE_OBJECT 구조체에 저장된다. 바이러스에서 사용하는 루트킷은
IoGetDeviceObjectPointer 란 API를 사용하여 DEVICE_OBJECT 구조체에서 DRIVER_OBJECT 의 위치를 선정해줄수 있다.
즉 다른 Original Driver Call 이 일어나기 전에 자신의 루트킷을 먼저 실행하여 Call 결과를 조작한다.
*** 레지스터(Register)
- CPU 가 느린 메모리의 접근 시간을 줄이기 위해 CPU 내부에 고속의 기억 소자로 구성된 메모리.
* 범용 레지스터(General-Purpose Register) - 임시저장소
EAX, EBX, ECX, EDX - 하위호환을 위해 16비트영역과 8비트영역에 대한 별도의 이름을 가지고 있고 산술연산과 같은 범용연산에 주로 사용, ESI, EDI, EBP, ESP - 번지 지정을 위한 인덱스나 옵셋을 저장하는 용도
* 세그먼트 레지스터(Segment Register) - 세그먼트의 시작주소.
CS, DS, SS, ES, FS, GS - 전체 메모리를 효율적으로 관리하기위해 크기가 가변적인 일정단위의 구역으로 나눠진 세그먼트주소 저장(코드 레지스터 1개, 스택 레지스터 1개, 데이터 레지스터4개 -> 데이터 처리의 다양성위해)
* 플래그 레지스터(Flags Register) - 상태플래그, 제어플래그, 시스템플래그
EFLAGS - 연산결과에 따른 프로그램의 상태나 제어정보를 다룸
* 명령 포인터 레지스터(Instrucion Pointer Register) - CPU 가 실행해야할 다음 주소를 저장(EIP).
EIP - 읽기전용으로 CPU가 실행해야 할 다음 주소를 저장
EAX(Accumulator) - 산술연산 과 정수형 반환값을 호출함수에 넘김.
EBX(Base) - 함수나 변수의 주소(특히 DS안의 데이터 주소) 를 저장하거나 이동명령의 피연산자로 사용.
ECX(Count) - 카운터 역활을 수행하며 반복될 때마다 ECX 값이 자동 감소.
EDX(Data) - EAX 범위를 초과하는 64비트 산술연산의 상위 결과값을 저장하거나 I/O 포인터로 사용.
ESI(Source Index) - 스트링 명령을 수행할 때 출발지 주소를 지정하거나 DS 안의 데이터 주소를 저장.
EDI(Destination Index) - 스트링 명령을 수행할 때 목적지 주소를 지정하거나 ES 안의 데이터 주소를 저장.
EBP(Base Pointer) - SS 를 기반으로 스택내의 데이터에 접근하기 위한 기준주소를 저장.
ESP(Stack Pointer) - SS 를 기반으로 스택의 스택의 최상위 주소를 유지하는 용도로 사용.
push, pop, call, ret 명령에 의해 자동 증감.
EIP(Instruction Pointer) - 다음에 실행할 명령의 주소를 저장. 사용자 조작은 불가.
CS(Code Segment) - 명령어들이 위치한 시작 주소를 보관.
DS(Data Segment) - 데이터을이 위치한 시작 주소를 보관.
ES(Extra Segment), FS, GS - 변수들을 위한 추가 메모리 영역의 시작 주소를 보관.주로 스트링 명령에 사용
SS(Stack Segment) - 스택 영역의 최상위 주소(top)를 보관. (지역변수)
EFLAGS(Flags)
상태 플래그(Status Flag)그룹 - 특정명령결과, 산술명령에 대한 결과를 가리킴.
AF(Auxiliary carry flag) - 10진수 덧셈, 뺄셈 연산에서 보정이 필요한때 enable.
CF(Carry flag) - 양수 연산에서 연산 결과가 주어진 레지스터 길이를 초과할때 enable.
OF(Overflow flag) - 음수 연산에서 연산 결과가 주어진 레지스터 길이를 초과할 때 enable.
PF(Parity flag) - 연산 결과 1 이 짝수 개일때 enable.
SF(Sign flag) - 연산 결과가 음수일때 enable.
ZF(Zero flag) - 연산 결과가 0 이 아닐때 enable.
제어 플래그(Control Flag) - CPU동작제어, 문자열 처리명령의 제어.
DF(Direction flag) - 문자열 관련 명령에 사용하며 enable 은 역방향, disable 은 순방향 접근.
시스템 플래그(System Flag)
[출처] C언어 용어를 정리하자~|작성자 찡호야