One's Knowledge

CodeEngn basic 19번 문제 풀이 본문

리버싱/CodeEngn 문제풀이

CodeEngn basic 19번 문제 풀이

coveter 2025. 6. 23. 14:23

CodeEngn basic 19번

이 프로그램은 몇 밀리세컨드 후에 종료 되는가

UPX로 패킹되어있다.

일단 unpack

문제를 보면 일정 시간이 지나면 자동으로 종료되는 프로그램인가보다.

대략 11초정도 뒤에 꺼진다.

디버깅해보자

실행하니 처음 실행할때랑 다른 창이 뜬다. 

디버깅 탐지를 하나보다..

조금씩 실행해보자

조금 파고드니까 isDebuggerPresent 라는 API가 나온다.

디버깅이 되고 있으면 1, 그렇지 않으면 0을 반환한다.

TEST EAX, EAX로 EAX가 0인지 확인하고,

JNZ 에서 EAX가 0이 아니면, 004338DE로 점프하는것이다.

실행하니 1로 잡힌다.

그리고 아까 디버깅할때 떴던 알림창이 뜬다.

다시 시작해서 zflag 수정하고 계속 들어가겠다.

계속 진행하니  waitforsingleobject가 나오고 기다리다 끝난다.

waitforsingleobject는 신호대기 api이다.

멀티스레딩, 비동기 처리 등의 작업이 완료될 때까지 대기하는 함수이다.

이러고 끝나는것을 보니 다른 곳에서 따로 시간을 재고 종료하는 것 같다.

어디선가 작업이 비동기적으로 실행된거 같다.

다른 방법으로 하자.

사용하는 함수들중에 timeGetTime이라는 함수가 보인다.

시간을 get하는 함수인데 다 breakpoint를 걸고 다시 실행해보자. 어디선가 걸리겠지

걸렸다.

함수 실행하니 EAX값이 바뀌었다.

계속 내려가니 설명은 주석에 했다.

보니까 먼저 1번째에 시간을 얻고 2번째 또 시간을 얻고 비교한다.

00444D38로 가보자

설명은 주석에 했다.

1번째 시간을 얻고(시작 기준점) 2번째 시간을 얻어(현재 시간)

2번째 시간에서 1번째 시간을 빼 얼마나 흘렀는지를 EAX에 담고 그것을 EBX + 4 와 비교하는 것을 볼 수 있다.

EBX + 4 에는 70 2b 00 00 이 들어 있고 10진수화 하면 다음과 같다.

11,120이다.

정답 : 11,120ms