반응형
사용처 패커등 TLS등 다양한곳에서 사용된다
1. INT 0x3
#include <stdio.h>
#include <string.h>
#include <Windows.h>
int main()
{
while (1)
{
__try
{
__asm
{
int 0x3;
}
printf("Debugged\n");
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
printf("Not debugged\n");
}
}
}
첫 번째 케이스는 다음과 같이 구현된다. 일반적으로 int 0x3은 소프트웨어 브레이크 포인트이기 때문에, 정상적으로 실행이 될때는 해당 브레이크 포인트를 만나게 되면 Exception을 던지고 종료하는 구조를 갖게 된다.
하지만 디버거에서 디버깅을 진행할 때는 해당 인스트럭션을 실행해도 익셉션이 발생하지 않는다. 이를 이용해서 현재 프로세스가 디버깅중인지를 판단할 수 있다.
2. INT 0x2D
#include <stdio.h>
#include <string.h>
#include <Windows.h>
int main()
{
while (1)
{
__try
{
__asm
{
int 0x2d;
}
printf("Debugged\n");
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
printf("Not debugged\n");
}
}
}
3. INT 0x41
INT 0x41은 주로 ring0(커널)모드에서 실행되는 명령어라고 한다. 그래서, ring 3인 유저모드에서 실행이 되버리면 예외가 발생하는데, 이를 이용해서 디버깅을 탐지할 수 있다.
#include <stdio.h>
#include <string.h>
#include <Windows.h>
int main()
{
while (1)
{
__try
{
__asm
{
int 0x41;
}
printf("Debugged\n");
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
printf("Not debugged\n");
}
}
}
4. STI, CLI
STI, CLI는 ring0(커널)에서만 실행이 되는 명령어다. 인터럽트를 세팅해주는 명령어인데.. 그렇다보니까 유저모드에서 실행하면 예외가 발생한다.
대부분 디버깅을 하는 사람들은 sti나 cli에서 디버깅이 멈춘다면 해당 어셈블리를 nop으로 패치하고 진행할텐데
그러면 정상적으로 예외가 발생하지 않기 때문에 미정의 동작으로 빠지고 정상적으로 언패킹이 진행되지 않을 것이다.
#include <stdio.h>
#include <string.h>
#include <Windows.h>
int main()
{
while (1)
{
__try
{
__asm
{
sti;
cli;
}
printf("ring0\n");
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
printf("ring3\n");
}
}
}
반응형
'PC리버싱 > 안티디버깅' 카테고리의 다른 글
isdebuggerpresent 어셈구현 (0) | 2020.06.08 |
---|---|
GS (Stack Canary/Cookie)우회 (0) | 2020.05.28 |
TLS callback(TLS(Thread Local Storage) 와 isdebuggerpresent) (0) | 2020.05.24 |
간단한 ASLR우회 방법 (0) | 2020.05.20 |
Visual Studio 2019로보는 ASLR (0) | 2020.05.20 |