CodeEngn Basic19 풀이
Wargame | CTF/Reversing

CodeEngn Basic19 풀이

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

이런창이 뜨면서 일정시간 이후에 자동으로 종료하게 됩니다.

 

디버거로 열게되면 이런 메세지를 띄우게됩니다. 안티디버깅 기법이 적용되어있나보네요 . 


시간에 관련된거라 생각하면서 트레이싱 하다보니 뭔가 있었는데  메세지박스가 실행이 되지않는걸로보아 여기는 아니네요.

디버깅을 감지하는 함수를 발견했습니다. 여기에 bp를 걸어주시고 안티디버깅을 우회하기위해서 ZF를 1로 변경해 주었습니다. 점프를 하지못하게요.


프로그램을 실행하면 보이는 Msgbox의 text string은  참조된 문자열목록으로 봤을때 뜨질않아서 하드코딩한게 아닌 내부적으로 문자열을 만들어 낸다고 생각해서 트레이싱해보니 역시나 맞았습니다. 

MsgBox 내부에는 또 MessageBoxExW라는 하위 함수가있었구요

그 내부로 가보니 MessageBoxTimeOutW라는 함수가 있었습니다. 이함수도 메세지박스를 일정시간이 지나면 자동으로 종료하는 함수길래 파라미터를 살펴보니 FFFFFFF부분이 시간부분이였으나.. 이 큰 숫자가 종료시간일리가 없으므로 종료하는 부분은 다른곳에 있겠네요.

MessageBoxTimeOutW 내부에 또 하위함수인 user32.SoftModalMessageBox가 있었구요 그이후로는 트레이싱할수없을 정도로 주석도 안나오고 했기때문에 포기하고 시간을 처리하는 함수에 관해 찾아보기로 하였습니다.

찾는 도중 TimeGetTime 이라는 함수가 가장 유력한거같아서 모두 BP를 걸어주었습니다.

여기서 이 함수에대해 간단히 설명하자면... 윈도우(운영체제)가 시작되어서 지금까지 흐른 시간을 1/1000 초 (milliseconds) 단위로 DWORD형을 리턴하는 함수입니다.

 bp를 걸었더니 메세지박스 함수 내부에 timeGetTime 함수가 있었고 시간을 두번측정해 그 시간의 차를 구해서  일정시간 이상이되면 프로그램이 종료되는식으로 되어있었습니다.

여기서 cmp eax, dword ptr ds:[ebx+4] 이코드를 유심히 봐주세요. 이부분에서 eax에는 아까 위에서 구한 시간을 두번측정한 값의 차의 값이 들어있습니다. 그리고 ebx+4에는 2B70이라는 값이 있구요 

eax의 시간이 클경우에 프로그램이 종료되고 ebx+4의 값의 시간이 클경우에는 다시 시스템시간을 측정하는 함수인 timeGetTime를 사용해 eax값을 증가시켜줍니다. 

결론은 비교하는 시간값이 쭉 증가하다가 2B70 이라는 시간값을 넘어가는 그순간 프로그램이 종료가되는거겠네요 ! 

답은 2B70이고 10진수로 변환하면 11120 입니다. 11120ms = 11.12s 가 되겠습니다. 

풀이완료!

'Wargame | CTF > Reversing' 카테고리의 다른 글

CodeEngn Advance01 풀이  (0) 2018.03.25
CodeEngn Basic20 풀이  (0) 2018.03.23
CodeEngn Basic18 풀이  (0) 2018.03.20
CodeEngn Basic17 풀이  (0) 2018.03.19
CodeEngn Basic16 풀이  (0) 2018.03.19