imnyang's workspace

뒤로

Artifact-Based Anti-Debugging#

Artifact-Based 안티 디버깅은 디버거가 실행 환경에 남기는 고유한 흔적이나 파일 시스템의 변화를 검사하여 디버거의 존재 여부를 탐지하는 기법이에요.
리눅스 커널은 프로세스 및 시스템 정보를 가상 파일 시스템인 /proc을 통해 파일 형태로 제공해요. 안티 디버깅에서는 주로 자기 자신의 프로세스 상태 정보를 담고 있는 /proc/self/status 파일을 분석하여 탐지 로직을 구현해요.

1. 프로세서(프로세스) 이름으로 디버거 탐지#

원리: /proc/self/status 파일을 열어 Name: 항목을 읽어옵니다. 만약 프로세스를 추적 중인 상위 프로세스나 현재 환경에 gdb 같은 디버거 이름이 검출되면 디버깅 중인 것으로 판단합니다.

2. TracerPid로 디버거 탐지#

원리: /proc/self/status 내 정보 중 TracerPid 항목을 검사합니다. TracerPid는 해당 프로세스를 ptrace() 시스템 콜로 추적(디버깅)하고 있는 부모 프로세스의 PID를 나타냅니다. 디버깅 중이 아닐 때는 이 값이 0으로 설정되지만, 디버거가 붙어있다면 0이 아닌 디버거의 PID를 가지게 됩니다.

Artifact-Based 우회 방법#

반환값 조작: 디버거 탐지 함수(is_dbg_attached)가 실행되는 시점에 브레이크포인트를 걸고, 함수가 종료될 때 반환값이 저장되는 레지스터($rax)를 강제로 0으로 변환하여 우회합니다.

파일 무결성 조작 (바인드 마운트): 원래의 /proc/<PID>/status 파일 내용을 복사해 TracerPid를 강제로 0으로 수정한 위조 파일(fake_status)을 만듭니다. 그 후 sudo mount --bind 명령을 사용해 해당 프로세스의 status 경로에 위조 파일을 덮어씌워 디버거를 속입니다.


Behavior-Based Anti-Debugging#

Behavior-Based 안티 디버깅은 디버깅 과정에서만 필연적으로 발생하는 동적인 변화, 시간 지연, 또는 예외 신호(Side Effect) 등의 행위적 특징을 포착하여 판별하는 기법이에요.

1. 실행 시간을 이용한 탐지#

원리: 디버거 내부에서 사람이 코드를 한 줄씩 분석하거나(Single Stepping), 브레이크포인트에서 멈춰 있는 동안 프로세스의 실제 실행 시간은 정상 실행보다 비정상적으로 길어집니다.

구현: 특정 핵심 코드 섹션 전후로 GetTickCount()rdtsc 같은 시간 측정 API/명령어를 배치하여, 두 지점 사이의 시간 차이가 정해진 임계값(threshold)을 초과하면 디버거가 개입한 것으로 판단합니다.

우회 방법: 사람이 수동으로 디버깅하는 대신 동적 분석을 자동화하는 디버깅 스크립트를 작성해 탐지 구간을 식별할 수 없을 만큼 빠른 속도로 통과시켜 우회합니다.

2. 디버깅 행위(SIGTRAP) 탐지#

원리: 소프트웨어 브레이크포인트의 원리는 원래 명령어를 int 3 (0xCC)로 덮어쓰는 것입니다. CPU가 실행 중 int 3을 만나면 예외를 발생시키고 커널은 해당 프로세스에 SIGTRAP 신호를 전달합니다.

구현: 프로그램 내부에 SIGTRAP 신호에 대응하는 커스텀 시그널 핸들러(sigaction)를 미리 등록해 둡니다. 그 후 인위적으로 코드가 예외를 발생시키도록 유도(__debugbreak() 또는 __asm__(".byte 0xcc"))했을 때, 디버거가 연결되어 있다면 SIGTRAP 신호를 디버거가 먼저 가로채기 때문에 프로그램 내부 핸들러가 실행되지 않습니다. 반면 정상 실행 중이라면 자체 등록한 핸들러가 정상적으로 호출됩니다.

우회 방법: pwndbg 환경에서 signal SIGTRAP 명령을 사용해 디버거가 가로챘던 시그널을 프로세스 내부 핸들러에게 강제로 다시 전달(Forwarding)하여 정상 흐름인 것처럼 실행을 이어 나가게 만듭니다.


Anti-Debugging Bypass 2#

-----BEGIN SSH SIGNATURE-----
U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAg4c/dn4BitGH1/xNjKoKEp97I2b
eU57QXvkDBEdNNrEMAAAATYmxvZy5pbW55YS5uZy9wb3N0cwAAAAAAAAAGc2hhNTEyAAAA
UwAAAAtzc2gtZWQyNTUxOQAAAEBkmX5d2x6xJqMvUpZkfj8aKexURanqMB7qunB/vlDj/v
aculQtjSqEZ+TYyHToPAgZpvvEI1JNSTRGivYqf0wJ
-----END SSH SIGNATURE-----
[Layer7] 2026년 6월 10일 리버싱 5차시 과제
http://blog.imnya.ng/layer7/12
저자 imnyang
게시일 2026년 06월 15일