리버스엔지니어링 문제 19

2015. 4. 6. 11:52Security ★ Development/Reversing

반응형

http://codeengn.com/challenges/basic/19


프로그램을 실행시켜보면 메시지박스만 나오고 약 10초후에 저절로 꺼집니다.

문제는 이 프로그램이 몇 밀리세컨드 후에 종료되는지를 알아내는 것입니다.  정확한 값이 필요할겁니다.


디버거로 실행하면 다음과 같은 에러가 뜹니다.

그냥 실행했을 때 멀쩡했는데 디버거로 실행했을 때 이런 메시지가 뜨면 이는 안티디버깅 처리가 되어있다는 것으로 의심할 수 있습니다.  혹시 몰라 PEiD로 확인했더니 UPX팩이 되어있었습니다.  언팩을해주고(OllyDbg1.버전에서는 PUSHAD를 보고 팩이 되어있다는 걸 바로 알 수 있었는데 2. 버전은 팩된 것도 고려해서 시작지점을 보여줍니다.)

함수를 우회하기 위해 반환값인 EAX를 0으로 만들어줍니다.

그리고 실행을 하면 쭉 실행됩니다.  이제는 시간과 관련된 부분을 찾아야 합니다.  Intermodular calls를 불러서 보면 timeGetTime함수가 있습니다.  이곳에 bp를 걸고 f9를 눌러 한번 실행해줍니다.

<timeGetTime함수는 윈도우가 시작되고 난 뒤 지난 시간을 ms단위로 반환합니다.>


timeGetTime의 bp에 걸리고 시간을 계산하고 종류하는 루틴입니다.

1번은 한번만 실행됩니다.  첫 윈도우 시간값.

그리고 2번에서 다시한번 timeGetTime을 호출하여 1번에서 구한값과 비교해줍니다.  2번에서 구한값이 무조건 크기때문에 항상 점프합니다.

밑으로 내려오면 EBX+4에 있는 값과 2-1의 값을 비교합니다.

이 값이 작으면 2번으로 가서 loop를 돌고, 크면 00444C71로 점프하게 되고 종료하게됩니다.

즉 EBX+4에 들어있는 값인 11120이 넘을 경우 프로그램이 종료하게 됩니다.