Information Security Study

[CodeEngn] Advance RCE L01 본문

Reversing/CodeEngn

[CodeEngn] Advance RCE L01

gayeon_ 2023. 5. 23. 17:36

문제: 이 프로그램은 몇 밀리세컨드 후에 종료 되는가
정답인증은 MD5 해쉬값(대문자) 변환 후 인증하시오

 

 

 

 

 

 

문제 파일을 실행했을 때의 모습이다.

 

 

 

 

PEiD로 확인하니 UPX로 패킹되었음을 확인할 수 있었다.

CFF로 언패킹했다.

 

 

 

언패킹한 뒤 Immunity Debugger로 열어주었다.

 

 

 

이처럼 Autoit script가 뜨는 거로 보아 안티 디버깅이 걸려있는 것 같다.

IsDebuggerPresent 함수를 찾아볼 것이다.

 

 

 

 

하나씩 내려가 보면 결국에 바로 밑인 40E967에서 TEST EAX, EAX 로인해서 JNZ에서 분기를 하게 되어 4338DE로 가게되고 해당 주소에서 위의 메시지 박스가 생성된다.

그래서 40E967주소에 있는 TEST EAX, EAX를 CMP EAX, EAX로 변경을 해서 분기를 피했다.

 

 

 

 

시간 관련 함수인 모든 timeGetTime 함수에 BP를 걸어주었다.

 

 

timeGetTime() 함수는 윈도우가 시작되어서 지금까지 흐른 시간을 1/1000초 단위로 DWORD형을 리턴하는 함수이다.

 

그렇기 때문에 프로그램을 시작할때 timeGetTime 함수를 실행시켜서 시작시간을 저장하고 몇 초 뒤의 값을 비교해서 같으면 종료하도록 했을 것이다.

 

그렇기 때문에 모든 timeGetTime함수를 BP 걸어서 가장 먼저 걸리는 함수에 비교하는 값이 있을 것으로 예상했다.

 

 

 

 

F9로 가장 맨처음 사용된 함수 주소로 가보니 444C44 주소로 왔다.

밑에 CMP 비교 구문을 볼 수 있었다.

이 값들의 차를 JMP 구문을 지나서 비교할 때 사용한다.

 

 

 

 

JMP를 하면 00444D38 주소로 오게 되는데 바로 아래에 CMP에서 아까 ESI와 EAX를 SUB한 값인 2B24와 337B와 비교를 하고 있다.

 

그렇다는 것은 337B초가 지나면 종료가 되는 것 같다.

337B는 정수로 13179이다.

 

 

 

MD5 해시값으로 변환하면 끝!

 

 

 

'Reversing > CodeEngn' 카테고리의 다른 글

[CodeEngn] Basic RCE L19  (0) 2023.05.23
[CodeEngn] Basic RCE L18  (0) 2023.05.18
[Codeengn] Basic RCE L17  (0) 2023.05.18
[CodeEngn] Basic RCE L10  (0) 2023.05.16
[CodeEngn] Basic RCE L09  (0) 2023.05.16