2011. 10. 7. 11:50
728x90
PEB 구조체를 이용한 간단한 안티디버깅 코드
이걸 좀 눈에 보기 좋게 바꾸면....
FS:[0] 레지스터는 TEB구조체의 시작이다.
TEB구조는 다음과 같다.
FS:[18] 이라고 하면.. NT_TIB의 멤버중 하나이다.
NT_TIB의 구조체는 다음과 같다
그러므로 FS:[18]은 PNT_TIB Self; 값을 가리키고 있으며... 이것은 즉 FS:[0]을 뜻하는 것과 마찬가지다...
그러므로 아까 안티디버깅 코드를 좀 더 줄이면... 다음과 같이 줄일수 있다.
FS:[30]은 PEB 구조체에 대한 포인터를 가지고 있으며... PEB 구조체는 다음과 같다.
그러므로 위의 안티디버깅코드는... PEB 구조체의 BeingDebugged 값을 체크하여 만약 디버깅중일때는 0이 아닌 값이 저장되어 있으므로 이 값을 이용하여 리턴되는 EIP값을 조작하여 임의의 주소로 분기시켜 비정상 실행을 시키고 있다.
이 값은 IsDebugerPresent() 함수에서도 사용을 하여 디버깅 체크를 하고 있다.
참고사이트 :
http://www.nirsoft.net/kernel_struct/vista/NT_TIB.html
http://vbdream.tistory.com/entry/Windows-TEBThread-Environment-Block-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0
CALL
00000000
MOV EAX, 18
MOV EBX, DWORD PTR FS:[EAX]
ADD EBX, 30
MOV EAX, EBX
MOV EAX, DWORD PTR DS:[EAX]
INC EAX
INC EAX
MOVZX EAX, BYTE PTR DS:[EAX]
SHL EAX, 2
ADD EAX, 63
ADD DWORD PTR SS:[ESP], EAX
RETN
MOV EAX, 18
MOV EBX, DWORD PTR FS:[EAX]
ADD EBX, 30
MOV EAX, EBX
MOV EAX, DWORD PTR DS:[EAX]
INC EAX
INC EAX
MOVZX EAX, BYTE PTR DS:[EAX]
SHL EAX, 2
ADD EAX, 63
ADD DWORD PTR SS:[ESP], EAX
RETN
이걸 좀 눈에 보기 좋게 바꾸면....
CALL
00000000
MOV EAX, DWORD PTR FS:[18]
ADD EAX, 30
MOV EAX, DWORD PTR DS:[EAX]
ADD EAX, 2
MOVZX EAX, BYTE PTR DS:[EAX]
SHL EAX, 2
ADD EAX, 63
ADD DWORD PTR SS:[ESP], EAX
RETN
MOV EAX, DWORD PTR FS:[18]
ADD EAX, 30
MOV EAX, DWORD PTR DS:[EAX]
ADD EAX, 2
MOVZX EAX, BYTE PTR DS:[EAX]
SHL EAX, 2
ADD EAX, 63
ADD DWORD PTR SS:[ESP], EAX
RETN
FS:[0] 레지스터는 TEB구조체의 시작이다.
TEB구조는 다음과 같다.
typedef struct _TEB
{
NT_TIB NtTib;
PVOID EnvironmentPointer;
CLIENT_ID ClientId;
PVOID ActiveRpcHandle;
PVOID ThreadLocalStoragePointer;
PPEB ProcessEnvironmentBlock;
ULONG LastErrorValue;
...
}
{
NT_TIB NtTib;
PVOID EnvironmentPointer;
CLIENT_ID ClientId;
PVOID ActiveRpcHandle;
PVOID ThreadLocalStoragePointer;
PPEB ProcessEnvironmentBlock;
ULONG LastErrorValue;
...
}
FS:[18] 이라고 하면.. NT_TIB의 멤버중 하나이다.
NT_TIB의 구조체는 다음과 같다
typedef struct _NT_TIB
{
PEXCEPTION_REGISTRATION_RECORD ExceptionList;
PVOID StackBase;
PVOID StackLimit;
PVOID SubSystemTib;
union
{
PVOID FiberData;
ULONG Version;
};
PVOID ArbitraryUserPointer;
PNT_TIB Self;
} NT_TIB, *PNT_TIB;
{
PEXCEPTION_REGISTRATION_RECORD ExceptionList;
PVOID StackBase;
PVOID StackLimit;
PVOID SubSystemTib;
union
{
PVOID FiberData;
ULONG Version;
};
PVOID ArbitraryUserPointer;
PNT_TIB Self;
} NT_TIB, *PNT_TIB;
그러므로 FS:[18]은 PNT_TIB Self; 값을 가리키고 있으며... 이것은 즉 FS:[0]을 뜻하는 것과 마찬가지다...
그러므로 아까 안티디버깅 코드를 좀 더 줄이면... 다음과 같이 줄일수 있다.
CALL
00000000
MOV EAX, DWORD PTR FS:[30]
ADD EAX, 2
MOVZX EAX, BYTE PTR DS:[EAX]
SHL EAX, 2
ADD EAX, 63
ADD DWORD PTR SS:[ESP], EAX
RETN
MOV EAX, DWORD PTR FS:[30]
ADD EAX, 2
MOVZX EAX, BYTE PTR DS:[EAX]
SHL EAX, 2
ADD EAX, 63
ADD DWORD PTR SS:[ESP], EAX
RETN
FS:[30]은 PEB 구조체에 대한 포인터를 가지고 있으며... PEB 구조체는 다음과 같다.
typedef struct _PEB {
BOOLEAN InheritedAddressSpace;
BOOLEAN ReadImageFileExecOptions;
BOOLEAN BeingDebugged;
BOOLEAN Spare;
HANDLE Mutant;
PVOID ImageBaseAddress;
PPEB_LDR_DATA LoaderData;
PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
...
}
BOOLEAN InheritedAddressSpace;
BOOLEAN ReadImageFileExecOptions;
BOOLEAN BeingDebugged;
BOOLEAN Spare;
HANDLE Mutant;
PVOID ImageBaseAddress;
PPEB_LDR_DATA LoaderData;
PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
...
}
그러므로 위의 안티디버깅코드는... PEB 구조체의 BeingDebugged 값을 체크하여 만약 디버깅중일때는 0이 아닌 값이 저장되어 있으므로 이 값을 이용하여 리턴되는 EIP값을 조작하여 임의의 주소로 분기시켜 비정상 실행을 시키고 있다.
이 값은 IsDebugerPresent() 함수에서도 사용을 하여 디버깅 체크를 하고 있다.
참고사이트 :
http://www.nirsoft.net/kernel_struct/vista/NT_TIB.html
http://vbdream.tistory.com/entry/Windows-TEBThread-Environment-Block-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0
728x90
'리버싱' 카테고리의 다른 글
How to bypass antivirus with Metasploit (0) | 2011.12.15 |
---|---|
detail-analysis-advanced-persistent-threat-malware_33814.pdf (0) | 2011.10.28 |
unpack_dragonarmour (0) | 2011.09.06 |
Simple IDA Pro plugin to look up APIs on MSDN (0) | 2011.08.17 |
프로그램의 중복 실행을 막는 3가지방법 (0) | 2011.08.08 |