이 프로그램은 디버거 프로그램을 탐지하는 기능을 갖고 있다. 디버거를 탐지하는 함수의 이름은 무엇인가?
라고 묻고있다.
안티디버깅 테크닉이 쓰였단 말이며, 본인은 간단한 안티치트툴을 제작해 본 적이 있기 때문에
어떤 함수가 쓰일지 대충 알고 있지만 차근차근 찾아보도록 하자
프로그램 실행모습
"정상"이라는 텍스트를 출력해주다 디버깅을 감지하면 "디버깅 당함"을 출력해주고 있다.
IDA로 열어보자
그냥 바로 보인다. 역시 예상대로 IsDebuggerPresent를 사용하고있다.
이녀석이 무엇이냐 하면...
peb의 beingdebugged 의 값을 리턴하는데 디버깅중이라면 1 아니라면 0을 리턴한다.
peb의 주소는 teb에서 얻을 수 있다. 이 부분은 나중에 따로 글을 쓰도록 하자.
브레이크포인트를 걸고 실행시켜보면 디버깅 당했다고 무수히 외치는 걸 볼 수 있다.
계속 따라가보면 아래와 같은 부분이 나온다.
위를 보면 당연히 알겠지만서도
주기적으로 출력해주기 위해 Sleep 함수를 이용해 프로그램을 잠시 멈춰주고 있다.
파라미터로는 3E8을 push 해주고 있는데 Decimal로 변환하면 1000이된다. 1000 Ms = 1초
Sleep(1000) 을 해주고 있단 말인데 쉽게 말해 1초쉬어준다는 말이된다.
그리고 IsDebuggerPresent를 호출해 peb.beingdebugged 값을 리턴받아 eax에 넣어주고있다.
eax가 1로 세팅된 모습을 볼 수 있다. 즉 디버깅 중이라는 것.
그리고 좌우로 나뉘어 진행되는데 printf 를 호출 하고 있는걸 봐서는
"정상" 또는 "디버깅 당함"을 출력해주는 부분이다. 디버깅당하고 있을땐 왼쪽으로 진행되었다
이제 eax를 0으로 바꾸어 볼까 그럼?
0으로 바꾸었고 어떻게 될지 보자.
오른쪽으로 진행이되면서 "정상"을 뱉어주고 있다.
eax값을 변경해줘도 되지만 이러면 계속 변경해줘야하고 번거로워진다.
그래서 다른 방법으로 해보도록 하자
IsDebuggerPresent 를 call 하는 6byte 부분을 nop 처리 해줌으로써
아무런 동작도 하지 않도록 만들었고, "정상을 계속 뱉는 걸 볼 수 있다"
CheatEngine
지금 보고있는 부분이 위의 IDA에서 봤던 부분과 같다.
물론 여기서도 eax값을 0으로 바꿔주면 "정상"을 뱉어준다.
기존의 call 크기인 6바이트만큼 nop 처리 해주었다.
정상을 계속해 뱉는다.
'Reverse Engineering > [CodeEngn] Basic RCE' 카테고리의 다른 글
[Reversing] CodeEngn - Basic RCE L07 (0) | 2024.07.02 |
---|---|
[Reversing] CodeEngn - Basic RCE L06 (0) | 2024.07.02 |
[Reversing] CodeEngn - Basic RCE L05 (0) | 2024.07.02 |
[Reversing] CodeEngn - Basic RCE L03 풀이 (0) | 2024.07.02 |
[Reversing] abex' crackMe #1 풀이 (0) | 2024.07.02 |