BLOG
Tracefield · 02
Tracefield · 01
블로그 · 14
Vibe Audit · 04
Vibe Audit · 03
Vibe Audit · 02
Vibe Audit · 01
출판편집자 · 01
StudyTree · 01
SecurityOps · 02
SecurityOps · 01
AI챗봇 · 04
AI챗봇 · 03
AI챗봇 · 02
AI챗봇 · 01
퍼플심 · 04
퍼플심 · 03
퍼플심 · 02
퍼플심 · 01
블로그 · 13
rootscan · 07
rootscan · 06
블로그 · 12
블로그 · 11
블로그 · 10
블로그 · 09
블로그 · 08
블로그 · 07
블로그 · 06
블로그 · 05
블로그 · 04
블로그 · 03
블로그 · 02
블로그 · 01
rootscan · 05
rootscan · 04
rootscan · 03
asmspeak · 03
asmspeak · 02
rootscan · 02
asmspeak · 01
rootscan · 01
웹보안도구 · 02
웹보안도구 · 01
루트캠프 · 02
루트캠프 · 01
All notes 167
안티 디버깅(Anti-Debugging) 탐지 및 우회
프로그램 제작자는 분석을 방해하려고 여러 안티 디버깅 기법을 넣기도 한다. 리버싱을 하다 보면 꽤 자주 마주치는 방식이 ptrace 기반 탐지다. 여기서는 그 원리와 대응 흐름을 정리한다.
1. ptrace 탐지 원리
GDB는 ptrace 시스템 콜로 대상 프로세스를 제어한다. 여기서 중요한 점은, 한 프로세스에 동시에 하나의 디버거만 붙을 수 있다는 배타성이다.
안티 디버깅 코드는 이 성질을 이용한다. 프로그램 시작 직후 자기 자신에게 ptrace(PTRACE_TRACEME, ...)를 호출해보는 식이다.
- 성공 시: 지금 디버거가 붙어 있지 않다는 뜻이다.
- 실패 시: 이미 누군가가 붙어 있다는 뜻이므로 탐지로 간주한다.
; 탐지 로직 예시
mov rax, 101 ; sys_ptrace
mov rdi, 0 ; PTRACE_TRACEME
syscall
cmp rax, 0
jl debugger_found ; 음수(에러)면 디버깅 중임
2. 우회 전략(Bypass)
핵심은 시스템 콜 결과값을 조작해서 프로그램이 잘못 판단하게 만드는 것이다.
ptrace호출 직후에 브레이크를 건다. (catch syscall ptrace)RAX에 들어간 리턴값을 본다. 디버깅 중이면 보통-1이다.set $rax = 0으로 성공처럼 보이게 바꾼다.
그러면 프로그램은 ptrace 호출이 성공했다고 착각하고 다음 흐름으로 넘어간다. 결국 대응의 핵심은 탐지 분기를 지우거나, 리턴값을 속여서 검사 로직을 통과시키는 데 있다.

