본문 바로가기

[Riversing]/[코드엔진] BASIC

[코드엔진] basic19

코드엔진 사이트에 들어가 basic19 문제를 다운로드 받고 압축을 푼다(비밀번호 : codeengn)

 

 

간단명료한 문제이다.

몇 밀리세컨드 후에 종료되는가?!

 

우선 PEiD로 분석해보자.

 

 

UPX 패킹이 되어있다.

우선 패킹을 해제해주자.

 

 

이제 프로그램을 실행해보자.

 

 

강석씨가 만들었다는 문구가 뜨고, 잠깐 냅두면 알아서 종료된다.

우리는 이 잠깐의 시간을 알아내야 한다.

 

Ollydbg로 정확한 분석을 해보자.

 

좌클릭 -> Search For -> All intermodular calls 클릭 후 time 을 타이핑하면 아래와 같이 

timeGetTime 함수가 나온다.

 

# timeGetTime 함수란

   -원형

   DWORD __stdcall timeGetTime(void);

  

   -설명

   윈도우가 시작되고 난 뒤 지난 시간을 DWORD타입 데이터로 얻는 함수.

   시간의 단위는 1/1000초(Milli Second) 이다.

 

   -리턴

   윈도우가 시작되고 난 뒤의 시간을 리턴한다.

 

 

이 함수가 나오는 모든 부분에 bp를 걸고 F9 를 이용해 진행해보았다.

 

엥 에러가 뜬다.

 

생각을 해봤다.

실행은 되는데 디버깅이 안된다? => 디버깅을 방해하는 뭔가가 있다? => 안티디버깅

이전 문제에서도 한번 다뤘던 함수 IsDebuggerPresent가 생각났다.

이 함수는 디버깅중이면 1을 반환하며 디버깅을 방해하는 함수이다.

 

 

좌클릭 -> Search For -> All intermodular calls 을 클릭 후 isdebug 까지만 쳐도 위 그림처럼 함수가 나온다.

 

여기로 이동해서 분기점을 아래 그림과 같이 바꿔서 우회해준다.

 

 

이제 다시 F9를 이용해 bp 걸어둔 timeGetTime 함수까지 실행시킨다.

 

F8을 이용해 코드를 진행하다보면 위 그림의 분기점을 마주치게 된다.

어떠한 값을 2B70(16)과 비교하는데 이 값의 10진수 값은 11120(10) 이다.

이걸 시간으로 바꾸면 11120 밀리세컨드 = 11.12초 가된다.

 

이 값을 코드엔진에 인증하면 성공!

'[Riversing] > [코드엔진] BASIC' 카테고리의 다른 글

[코드엔진] basic20  (0) 2020.04.07
[코드엔진] basic18  (0) 2020.04.06
[코드엔진] basic17  (0) 2020.04.04
[코드엔진] basic16  (0) 2020.04.04
[코드엔진] basic15  (0) 2020.04.04