튜기's blogggg

CodeEngn basic #19

by St1tch


-------------------------------------------------------------------------------------------------------------


실행을 시키면 이런 창이뜨고 대략 10초 정도 지나면 창이 종료됩니다.


우선 OllyDump로 섹션을 보니 UPX로 패킹이 되어있습니다.

언패킹을 한 후 진행하였습니다.


저는 쓰레드를 이용하여 Sleep한 후 프로그램이 종료 된다고 생각해서

내부 함수 목록에서 Sleep부분을 모두 브레이크 포인트를 걸었습니다.

그리고 실행을 하였습니다.  


프로그램을 진행하다 보면 이 부분에 안티디버깅이 되어있습니다.

간단하게 플러그인을 이용해서 우회를 하였습니다.(IsDebugPresent, OllyAdvanced 등)


근데 이렇게 안티디버깅을 우회해도 Sleep함수에 안걸리는 걸 보니 Sleep함수를 이용하는게 아닌거 같아서 다시 함수목록을 살펴보았습니다.


그리고 이런 SetTimer함수가 있어 모두 브레이크를 걸고 다시 실행을 시켜보았습니다.


실행을 시키니 브레이크문에 걸리긴 한데 너무 짧은 750ms 에다가, 프로그램이 종료될때랑은 상관이 없는 부분인 것 같아 다시 함수목록을 살펴봤습니다.


그리고 다시 시간관련 함수인 timeGetTime함수가 있어 모두 브레이크를 잡았습니다.


실행을 시켜보니 위의 부분에서 브레이크가 걸렸습니다.

timeGetTime은 systemtime을 ms단위로 반환을 해주는데

위의 코드를 간단히 설명하자면

우선 첫 timeGetTime함수를 호출을 할 때의 systemtime을 ESI에 저장하고 다시 이후의 timeGetTime함수를 호출했을때의 EAX값과 비교를 합니다.

그리고 EAX의 값이 ESI보다 크면 아래 그림의 00444D38로 분기합니다.(당연히 무조건 뒤의 시간이 크기때문에 무조건 분기)


그리고 EAX에서 ESI를 빼고 그 값과 [EBX+0x4]와 비교를 하게됩니다.

만약 EAX가 더 크면 00444C71로 분기하며 종료가 됩니다.

그렇지 않으면 다시 00444C5F로 분기하여 EAX가 더 커져 종료를 할때까지 위 과정을 반복하게 됩니다.


따라서 현재시간 - 첫 timeGetTime의 system시간 > [EBX+0x4]이면 종료되므로

[EBX+0x4]값이 무엇인지 알면 이 문제의 해답을 알 수 있습니다.


EAX와 비교할때 값을보면 00002B70인 것을 알 수 있습니다.


만약 EAX가 00002B70보다 크면 이렇게 00444C71로 분기하여 종료가 됩니다. 


0x2B70을 10진수로 바꾼 결과입니다.

11120ms 시간 후 종료되는 것을 알 수 있습니다.


블로그의 정보

튜기's blogg(st1tch)

St1tch

활동하기