반응형

문제는 프로그램이 몇 밀리세컨드 후에 종료 되는지를 원한다.

 

 

Die로 열어보면,

UPX패킹이 되어있다. 

 

언패커로 패킹을 해제해주고 

프로그램을 실행하면 메시지박스를 띄우고 사라진다.

디버거로 열어본다.

디버거로 열어서 실행하니 이상한 메시지 박스가 나온다. 문자열로 찾아 들어가서 확인해본다.

4338DE 함수에서 메시지 박스를 출력 하는데 이것을 호출하는 부분을 찾아보도록 한다.

함수 주소에 우클릭을 하고 외부참조버튼을 누르면,

 

특정 창이 뜨고 이 함수를 호출하는 부분을 보여준다. 그 부분으로 가서 보니 4번 문제에 나왔던 IsDebuggerPresent 안티디버깅 함수를 사용하여 디버깅 당하고 있다면 특정 메시지 박스를 출력 하는 것이었다.

test eax eax구문으로 0인지 아닌지 판단하고 0이라면 제로플래그가 셋팅이 됨으로 jne 점프를 하지 않게 되고,

0이 아닌 값이 들어있으면 제로플래그가 셋팅되지 않기 때문에 jne 점프를 하게 되고 특정 메시지 박스를 띄운다.

 

제로플래그가 세팅된 상태에서 점프하는 je구문으로 변경하게 되면 디버거로 열렸을때 제로플래그가 셋팅되지 않기 때문에 점프를 뛰지 않을 것이다. 그렇게 그 다음 구문으로 진행되기 때문에 jne부분을 je로 패치 후 저장한다.

 

그리고 패치한 파일을 디버거로 다시 열어주면, 잘 작동 한다.

이제 문제의 목표인 몇 밀리 세컨드 이후 종료되는지 알아보자.

 

시간에 관련된 함수를 사용할 것이다. 호출하는 함수 중에 time이 들어가는 함수를 찾아본다.

time이 들어가는 많은 함수들이 있었지만, 전부 검색해보니 지금 문제에서 원하는 부분과 가장 연관성이 있는 함수는 timeGetTime 함수였다. 

 

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

timeGetTime 함수만 남긴 뒤, 전부 브레이크 포인트를 걸고 디버깅을 해본다.

함수를 호출하는데서 걸리고 한줄씩 내려가며 해석해보았다. 점프한 뒤의 구문도 보게되면,

종합해보면, 흐른 시간(연산한 값)이 ebx+4보다 클 때까지 계속 다시 시간을 가져오는 함수로 점프한다. 

ebx+4에 있는 값이 flag가 될 것이다. 

ebx+4주소에 접근하여 살펴보면 dword만큼 가져와서 비교하니 2byte인 0x2B70이 되겠다.

이것을 10진수로 바꾸어 페이지에 인증해준다.

반응형

'Reversing 문제 풀이 > CodeEngn.com_Basic (Clear)' 카테고리의 다른 글

codeengn-basic-L20 풀이  (0) 2022.04.28
codeengn-basic-L18 풀이  (0) 2022.04.22
codeengn-basic-L17 풀이  (0) 2022.04.21
codeengn-basic-L16 풀이  (0) 2022.04.19
codeengn-basic-L15 풀이  (0) 2022.04.19