TLS(Thread Local Storage)는 스레드 별로 고유한 저장공간을 가질 수 있는 방법이다.
악성코드나 패킹에
안티 디버깅 기술로 TLS callback등이있다
디버거가 프로그램을 열면 EP지점에서 멈추는데
TLS callback은 EP전에 실행된다
이걸 이용해 악성코드나 패킹은
디버거 탐지 기술을 넣어둔다 TLS안에
만약 이런한 지식 없다면 안티디버깅하기가 꽤어려울것이다
소스코드 Visual Studio 2019 기준
#define _WIN32_WINNT 0x0500
#include <stdio.h>
#include <windows.h>
#pragma comment(linker, "/INCLUDE:__tls_used")
void NTAPI Tls_Callback(PVOID THandle, DWORD Reason, PVOID Reserved)
{
if (IsDebuggerPresent()) //IsDebuggerPresent()함수를 이용해 디버깅 중인지 확인
{
printf("TLS검사디버거 발견0\n");
ExitProcess(1);
}
else
printf("TLS검사정상\n");
}
#pragma data_seg(".CRT$XLX") //TLS콜백 사용시 꼭 필요한 섹션
PIMAGE_TLS_CALLBACK TLS_CALLBACk[] = { Tls_Callback, 0 }; // TLS callback 함수 등록
#pragma data_seg()
int main()
{
while (1)
{
Sleep(1000);
if (IsDebuggerPresent())
printf("IsDebuggerPresent 디버거 발견1\n");
else
printf("IsDebuggerPresent 정상1\n");
}
return 0;
}
위에것가핵심이다
설정에서 TLS를 봐서 안에코드를 보고수정해도된다
여기서 수정해서 넘어가도된다
jmp해도되지만 다른방법도한번보자
CTF Exploer
TLS RVA값을 00000000으로 만들면된다
'PC리버싱 > 안티디버깅' 카테고리의 다른 글
isdebuggerpresent 어셈구현 (0) | 2020.06.08 |
---|---|
GS (Stack Canary/Cookie)우회 (0) | 2020.05.28 |
간단한 ASLR우회 방법 (0) | 2020.05.20 |
Visual Studio 2019로보는 ASLR (0) | 2020.05.20 |
1. CheckRemoteDebuggerPresent() Windows API (0) | 2020.05.20 |