본문 바로가기

리버스엔지니어링/크랙미 풀이

CodeEngn Basic RCE L04 문제 풀이

코드엔진 RCE L04 시작하겠습니다.

 

문제를 보시면 오늘 분석할 프로그램은 디버거 프로그램을 탐지한다고 합니다. 그럼 이 디버거를 탐지하는 함수가 무엇일까요??

이 함수는 안티디버깅중에 한 방법으로써 리버싱을 계속 하면 잘 알고계셔야 하는 함수입니다.

코드엔진은 그것을 알고서 이번 문제는 안티디버깅 기술에 대한 리버싱실력을 키워주기 위해서 이 문제를 낸 것 같네요.

 

출처 - MSDN

 

디버거 프로그램을 탐지하는 함수의 이름은 맨 위에 있는 IsDebuggerPresent 라고 합니다.

 

뜻을 쭉 해석해보시면 api상태에서 IsDebuggerPresent(void)를 쓰면 프로그램 중간에 디버거를 탐지할수 있다고 합니다.

또한 리턴값으로는 디버거가 작동중이면 0이 아닌값(컴파일러마다 달라요), 디버거가 작동중이지 않으면 0을 리턴합니다.

 

그럼 이제 프로그램을 디버거로 분석해 보겠습니다.

프로그램을 실행시키면 이렇게 정상이라고 루프를 돌면서 계속 뜰텐데요,

이 프로그램을 디버거상에서 실행시키면

이렇게 디버깅 당함이라고 뜹니다.

 

저는 이정도면 분석은 끝났다고 생각합니다.

혹시 좀더 세부적인 분석이 필요하다고 생각되시면 댓글에 좀 써주시면 감사하겠습니다.

 

그럼 이제 보통의 리버싱을 하는 이유나 리버싱블로그들이 글을 쓰는 주제인 크랙버전을 만들어보도록하겠습니다.

 

안티디버거 프로그램을 크랙하는 이유는 바로 디버거로 돌려도 보통 프로그램과 다름없이 실행되도록 하게끔 만드는 것인데요 저희는 안티디버그 함수 이름도 알고있고, 프로그램이 어떻게 실행되는지도 다 알기 때문에 한번에 함수로 찾아가보도록 하겠습니다.

 

함수로 한번에 찾아가는 방법은 제가 L03에 써놓은 데로

오른쪽 클릭- Search for- All intermodular calls에서 함수이름을 찾는것입니다.

 

이렇게 들어가면 저희가 아까 찾은 IsDebuggerPresent함수가 있습니다.

여기에 브레이크포인트(F2)를 걸고 F9를 통해 이 함수가 쓰이는곳 까지 넘어가보겠습니다.

넘어가면 이런 곳으로 넘어오게 되는데요 중요구간을 정리하려고 맨 밑까지 보다보니

1. 프로그램이 루프형태로 계속 디버깅중, 정상이라고 뜬다.

2. 0040108B부분에 jmp구문이 00401048부분을 가리키고 있다.

3. 00401048부분의 어셈블리어가 함수호출규약에 의해서 함수 시작부분에 쓰이는 mov esi,esp 이다(원래는 mov esp ebp등으로 쓰이는데 거의 비슷해서 함수호출규약이라고 생각합니다. 혹시라도 틀리면 댓글로 알려주시면 감사하겠습니다.)

이런것을 보다보니 00401048부터 0040108B까지가 디버깅을 탐지, 정상-디버깅 이라고 메시지를 출력하는 함수이고 이 프로그램에서 이 함수를 0040104A부분의 주석부분에 쓰인 Timeout - 1000이라는 것을 보아서 1초마다 이 함수를 루프시킨다고 생각됩니다.

 

간단하게 안티디버깅을 없애는 방법은 간단하게는 IsDebuggerPresent의 정상 리턴값이 0이라는 것을 이용해서 0040105E부분의 어셈블리어 코드를 mov eax 0으로 바꾸는 방법입니다.

이렇게 0040105E의 코드를 바꾸고 새로운 파일을 만드는 방법을 이용해서 파일을 만들면 정상적으로 안티디버깅에 성공한 것입니다.

 

이것으로 이번 L04분석을 마치겠습니다.