코드엔진 사이트에 들어가 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 |