[CodeEngn] Basic RCE L04
L04
문제
이 프로그램은 디버거 프로그램을 탐지하는 기능을 가지고 있음
디버거를 탐지하는 함수의 이름은 무엇인가
파일 실행
올리디버거 실행
All intermodular calls
해당 위치로 이동
- BreakPoint 잡아주기(Double Click)
실행(Run : F9)
- BreakPoint의 함수 실행되고 난 후 반환값 받고 다음 줄에 있는 CMP 명령을 실행하고
- 비교되는 값에 따라 ‘정상’, ‘디버깅 안함’ 이라는 문자열 출력될 걸로 추측
F8 : 한 줄씩 Step Over
- BreakPoint 실행 후 EAX 값 1 반환
- 0040106F : 00431024의 값을 Arg1 인자로 받음
Dump Window에 00431024 값 찾기
- 00401074 : 00408190 함수를 호출하는 데 이 함수는 문자열 출력하는 기능 확인
무한 루프 발견
- 00401048 : ESP 값을 읽어들여 ESI에 복사
- MOV 명령어 : MOV [복사될 곳], [읽어들일 곳]
- 0040104A ~ 0040104F: 1초 쉬고
- 0040105C : ESP 값을 읽어들여 ESI에 복사
- 0040105E : 디버그 모드인지 판별
- 0040106B : EAX 값이 0인지 조건
- TEST 명령어
- AND 비트 연산 수행
- SF, ZF, PF 플래그 수정되며 AND 결과는 버려짐(CMP와 같이 저장되지 않음)
- 플래그 값을 세팅하여 JE, JZ와 같은 분기문에 영향
- ex) TEST EAX, EAX
- 논리상 레지스터끼리 연산 시 EAX 값 도출
- EAX 값이 0인지 아닌지를 판단하기 위함
- TEST 명령어
- 0040106D : 참이면 7E, 거짓이면 6F
- 0040108B : 00401048로 이동
IsDebuggerPresent 내부 : BreakPoint에서 F7 실행
- 75DE9F20 : ‘FS:[30]’ 값을 EAX에 복사
- ‘FS’ : 세그먼트 레지스터
- ‘FS[0x30] 4 INT’ : Process Environment Block (PEB)의 선형 주소
- ‘[30]’ : Pointer ro PEB
- PEB : 윈도우 NT에서의 데이터 구조체
- PEB 구조를 통해 안티 디버깅 가능
- ‘FS : [30]’으로 디버깅 모드인지 아닌지 0, 1로 다음 주소에 반환
- 75DE9F26 : EAX 레지스터 값에 2를 더한 주소값을 EAX에 복사
- EAX = 003BA000
- EAX + 2 = 003BA002 = 01
- 01 값 반환
- 75DE9F2A : RETN 값 00000001
결론
- BreakPoint에서의 EAX의 반환값이 00000001
- 무한루프에서 TEST EAX, EAX로 EAX값이 0인지 조건
- 거짓으로 ‘디버깅 당함’이라는 문자열로 디버깅 모드임을 알려줌