일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- c# 프로그램 종료
- c# 파일 IO
- anti vm
- Python GetProcAddress
- UDP Server/Client
- Python LoadLibrary
- c# 파일명 변경
- vbscript
- Universal ShellCode
- TCP Server/Client
- PPT Malware
- 악성코드
- 한글 악성코드
- 최순실 악성코드
- TCP Socket
- c# 파일 읽기쓰기
- VMware
- Python Win32 API
- c# xml 파싱
- Hover Action
- FTP Server/Client
- pdf 악성코드
- hex2bin
- 파워쉘
- PowerShell
- 파이썬
- c# 외부 프로그램 실행
- Mouse Over
- c# 디렉토리 파일 조회
- 파이썬 외부프로그램 실행
- Today
- Total
목록Reversing (14)
그냥저냥
- I/O 포트는 Host OS와 Guest OS간 데이터를 주고 받을 수 있는 일종의 통신 채널- I/O 를 위한 명령어로는 IN / OUT 명령이 존재함 - I/O 명령은 EFLAGS 레지스터를 이용하여 실행 --> EFLAGS 레지스터는 커널 레벨에서만 동작 (사용자 레벨에서 사용시 익셉션 발생) - Guest OS 에서는 IN 명령어 사용시 익셉션이 발생되지않음 + EBX 레지스터에 "VMXh" 라는 고유한 값이 저장됨 (VMXh = 가상 환경에서 IN 명령어의 특별한 기능으로 인해 생성되는 Guest/Host 간의 고유한 통신채널) - eax = VMXh , ecx = Command , dx = VX 설정 후 in eax, dx 명령 실행 시 EBX 로 "VMXh" 저장됨
- CPU 레지스터의 Trap Flag bit = On 상태에서 명령어 실행 ==> Trap Flag bit = Off됨 - 특정 VM에서는 Trap Flag bit 상태가 계속 On 으로 되어있음 --> 구별 - 탐지방법으로는 부적절
CPUID 명령은 CPU를 식별하기 위한 명령이며, CPUID 명령 실행 후 ECX 레지스터 값을 Shift 함으로써 가상환경 여부를 탐지한다. Intel IA32 Manual에 따르면 EAX가 1일때 CPUID 명령 실행 시 ECX 의 31번째 Bit는 항상 0 이어야만 한다 nop xor ecx, ecx xor eax, eax inc eax push ebx cpuid pop ebx sar ecx, 1Fh test cl,1 CPUID 기반 탐지의 단점 - Guest OS의 CPU가 하이퍼 스레드를 사용하는 경우 탐지방법으로는 부적절하게 된다. - CPU가 하이퍼 스레드를 지원하면서 Guest OS 의 CPU 갯수를 늘리면, Guest OS의 CPU는 하이퍼 스레드를 사용하도록 자동으로 설정된다.
IDT (Interrupt Descriptor Table) 인터럽트 처리에 관련된 Descriptor 들을 모아둔 내부 데이터 구조체프로세스당 하나의 IDTR 레지스터가 존재하며, 2개의 OS (Host/Guest) 가 구동중일 경우 Guest OS의 IDT는 재배치된다IDTR의 내용을 확인하면 IDT의 메모리상 위치를 알 수 있으며, SIDT (Store Interrupt Descriptor Table) 명령으로 IDTR의 내용을 가져올 수 있다 void main(){ unsigned char idtr[6]; int i; __asm{ sidt idtr } printf("IDT : 0x"); for(i=5; i>1; i--) printf("%2.2x", idtr[i]); } 코드 실행 시 Host OS에..