리버스엔지니어링 문제 Advance 1

2015. 4. 15. 11:03Security ★ Development/Reversing

반응형

http://codeengn.com/challenges/advance/01



몇초 후에 종료하는지를 알아내는 문제입니다.

UPX로 되어있으니 풀어줍니다.  그런데 풀어줘도 ollydbg로 실행해보면 에러메시지가 발생합니다.  IsDebugger가 있으니 해당 부분을 우회해줍니다.

시간에 관련된 함수를 찾아보면 이전에 보았던 timeGetTime이 있습니다.  모두 bp를 걸어줍니다.


위에서 부터 내려오다보면 CALL EDI가 있습니다.  EDI에는 함수의 포인터가 있으므로 CALL EDI는 timeGetTIme을 호출하는 부분입니다.  두번째 CALL EDI부터 loop가 형성되어있습니다.  두번째 CALL EDI를 하고 바로 아래 JAE를 통해 노란색으로 여기서비교 이 부분 위로 점프합니다. 그리고 SUB와 CMP는 시간을 비교하는 부분입니다.  지난 시간이 EBX+4보다 큰지 작은지.  크다면 그 아래 JAE를 통해 종료 루트로 들어가게됩니다.  즉, 비교되는 기준 시간은 EBX+4에 있는 값으로 십진수 13179가 됩니다.

정답은 DB59260CCE0B871C7B2BB780EEE305DB