<보안 study>/리버싱

[CodeEngn]Advance - 01

gosoeungduk 2019. 1. 7. 20:00
반응형

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