Basic RCE L04
먼저 문제를 봅시다!
디버거를 탐지하는 함수의 이름을 찾으라네요 :D
EP(Entry Point) 입니다!
그리고 도스 프로그램이 켜지네요 :D
[F8]을 누르면서 계속해서 내려가 봅시다!
계속해서 내려가다보니 빨간칸으로 표시 되어있는 곳에서
갑자기 "디버깅 당함"이라는 문자열이 출력되기 시작합니다.
그리고 더이상 분석이 안되더군요!
그래서 저 지점을 기억한 후 [Ctrl]+[F2]를 누르고 다시 시작해서 저 함수로 들어가 봅시다 :D
함수를 분석해보니 Sleep 함수와 IsDebuggerPresent 함수가 보입니다.
계속가다 401074 주소의 함수에서 "디버깅 당함"이라는 문자열이 출력됩니다.
그래서 저기 함수를 분석해보니 특별히 디버깅을 탐지하는 듯한 로직은 보이지 않습니다 : (
계속해서 디버깅을 해보았습니다!
여기서 무한루프가 걸립니다!
그이유는 뭘까요?
40108B 주소에서 JMP명령어로 처음으로 계속 돌아가게 됩니다.
즉, 저 구간이 계속해서 빙빙 돌아간다는 거죠!
그럼 디버깅을 탐지하는 함수는 무엇이냐인데..
IsDebuggerPresent 함수가 정답입니다!
IsDebuggerPresent 함수는 PEB 구조체의 디버깅 상태값을 확인하여
디버깅 시 1을 리턴하고 아니면 0을 리턴합니다 :D
https://docs.microsoft.com/en-us/windows/win32/api/debugapi/nf-debugapi-isdebuggerpresent
IsDebuggerPresent function (debugapi.h) - Win32 apps
Determines whether the calling process is being debugged by a user-mode debugger.
docs.microsoft.com
자세한 사항은 위의 microsoft 정식 홈페이지에서 확인하시면 됩니다 :D
현재 Ollydbg로 디버깅 중이기 때문에
1을 리턴한다고 했죠 ?
위의 사진을 보다시피 EAX가 1로 반환된 것을 볼 수 있습니다 :D
그럼 이를 우회하는 방법은 없을까요!?
다양한 방법이 있습니다!
첫번째
IsdebuggerPresent 함수로 반환된 EAX 값을 0으로 강제로 변경해주면 되겠죠 :D ?
바꿔주는 이유는 당연히 EAX를 0으로 바꾸면 디버깅하고 있지 않다는 뜻이니까요!
두번째
IsDebuggerPresent함수를 "MOV EAX, 0"로 변경하면 됩니다!
그럼 EAX값이 변하지 않겠죠 ㅎㅎㅎ?
세번째
PEB 구조체의 디버깅 상태값을 변경해 버리는 겁니다 :D
처음부터 차근차근해봅시다!
먼저 IsDebuggerPresent 함수로 들어가면 MOVZX 명령어가 나옵니다.
MOVZX 명령어를 실행 전까지 실행시키고
EAX 값에서 오른쪽 클릭하여 [Follow in Dump] 기능을 이용합니다 :D
그럼 메모리 부분 구조체로 이동하게 되고
빨간 칸으로 표시된 부분이 바로 디버깅 상태값입니다 :D
저 부분을 클릭 후 [Space] 바를 눌러서 0으로 변경을 시켜줍시다!
이후 실행하면 정상이라고 출력되는 것을 볼 수 있습니다 :D
이렇게 IsDebuggerPresent 함수에 대해 알아보았고 우회하는 방법까지 알아보았습니다 :D