Reversing Advance 01 번 문제이다.
프로그램의 실행하는 동안의 시간을 구하는 문제이다.
프로그램은 위와 같은 팝업창을 띄우고 몇 초 뒤에 알아서 종료된다...
디버깅 전에 PEiD로 프로그램 정보를 확인해보니 UPX로 패킹이 되어있다.
UPX 언패킹 툴로 언패킹 해주자 :)
올리 디버거에 올려서 디버깅 하는 과정에서 자꾸 밑과 같은 오류 창이 뜨면서 종료가 된다.
진행 시키면서 확인해보니 IsDebuggerPresent로 안티디버깅이 되어있다.
※우회법 중 하나는 TEST EAX, EAX 를 CMP 구문으로 바꿔주는 것이다.
아무튼 코드 패치를 해주고 다시 저장해주자.
※ 코드 패치를 해준 다음 저장하는 방법은 오른쪽마우스 클릭 -> Copy to executable -> Selection이나 all 아무거나 -> Save(저장)
이제 언패킹 , 안티디버깅 우회 까지 준비는 마무리 했고, 시간을 맞추는 문제이니 시간에 관여하는 함수가 있을 것이라고 추정하였다.
그런데
.
.
.
시간에 관여하는 함수가 4~5개 정도 있어서 처음엔 감을 잡기가 힘들었다.
그래서 intermodular calls 로 함수 호출 리스트를 보았는데 TimeGetTime 함수가 여럿 있었다. (물론 다른 시간 관련 함수도 확인해보았다)
GetSystemTimeAsFileTime |
현재 시스템 시간을 가져온다. |
GetTickCount |
처음 실행한 이후로 틱 카운트가 늘어난다. 스톱워치 비슷한 느낌(밀리세컨 단위를 쓴다.) |
QueryPerformanceCounter |
처음 실행한 이후로 시간이 늘어나며 두 번째로 실행하면 지난 시간에 대한 반환 값이 반환됨. |
timeGetTime |
위와 유사함. |
이 4개의 함수는 프로그램에 내장된 시간관련함수인데 왜 4가지나 있는지는 모르겠지만 timeGetTime 함수로 프로그램 종료를 구분짓는다.
timeGetTime으로 프로그램 실행 후 지난시간을 가져와서 EBX+4에 있는 값과 비교를 한다.
그 결과 지난 시간이 EBX+4 에 있는 값보다 크면 exit(0)으로 프로그램을 종료한다.
EBX+4의 값은 0x00337B 와 같다.
플래그는 이 값을 md5 하면된다.
'<보안 study> > 리버싱' 카테고리의 다른 글
Ghidra-Server 환경 구성하기 (0) | 2019.11.27 |
---|---|
QEMU로 MIPS 구동 환경 구성하기 (4) | 2019.10.01 |
[CodeEngn]Advance - 06 [다시풀자] (0) | 2019.01.17 |
[CodeEngn]Advance - 05 (0) | 2019.01.15 |
[CodeEngn]Advance - 02 (0) | 2019.01.15 |