-->

[CodeEngn] Basic RCE L19 풀이

CodeEngn Basic RCE L19 문제 확인

이번 문제는 처음 보는 유형의 문제이다. 

 

 

 

파일을 실행시켜 보면, 아래와 같이 창이 하나 뜨고 곧 종료된다.

 

 

 

CodeEngn Basic RCE L19 풀이

먼저 해당 문제는 UPX 패킹이 되어있기 때문에 언팩을 해줘야 한다. UPX 언팩과 관련해선 다른 문제에서도 반복적으로 계속 다뤘으므로 여기선 패스한다.

 

일단, 프로그램 밀리세컨드 체크를 수행하는 함수가 어떤 것이 있는지를 먼저 알아야 한다. 구글링한 후 문제의 파일에서 임포트하고 있는 함수 중에 실제로 실행되고 있는 함수를 거르니 timeGetTime이 남았다. 호출부분을 찾으면 끝이겠거니 했는데 호출 부분이 상당히 많다.

 

 

 

IDA로 하나하나 보면서, 비교구문 없이 그냥 끝나버리거나 혹은 코드로는 있지만 실제 실행 흐름과는 상관이 없는 곳 등등을 거른 후에(다행히도 절반 이상이 걸러졌다) 전부 bp를 걸어주었다. 예를들어, 아래와 같이 timeGetTime 호출 후 cmp로 eax값과 비교를 수행하는 경우는 전부 확인을 해주었다(다행히도 3번째 bp에서 끝났다ㅎㅎ...).

 

 

 

x32Dbg로 실행시키는데 RtlRaiseException으로 빠져서 확인해보니 IsDebuggerPresent로 디버깅을 탐지하고 있다. 간단히 아래와 같이 패치해준다. (패치 방식은 정해져 있는 것은 아니다. 나는 아예 호출부분을 지우고 jmp를 해주었다.)

 

 

 

그렇게 위에서부터 몇개 거르면서 bp를 걸어 확인을 해주다보면, 3번째 정도에 아래와 같이 실행도 되면서 cmp로 반환값도 비교하는 부분을 보게되는데 아쉽게도 0x6306C5는 정답이 아니었다.

 

 

 

그런데 이 함수 부분에 EndDialog를 호출하고 실제로 프로그램이 종료되기 때문에 헥스레이로 좀더 자세히 확인을 해주었다. 아래와 같이 timeGettime을 호출한 후 v3이 특정값보다 크거나 같은 경우를 기점으로 while문을 탈출하게 된다. 여기서 이 v3가 정답임을 알수가 있는게 특정 밀리세컨드를 기점으로 프로그램을 종료하게 해놨으면 반복문을 돌면서 실시간으로 timeGetTime 함수를 호출하고 기준값과 확인하는 루틴이 필요하기 때문이다.

 

 

 

위 부분에 해당하는 곳에 bp를 걸고 확인해보면 ds:[ebx+4]와 timeGetTime의 반환값인 eax를 비교하고 있다. 그럼 이제 [ebx+4]를 확인해주면 된다. 덤프창에서 확인해주면 0x2B70이다. 10진수로 정답을 입력해주면 된다.

 

 

'리버싱 > CodeEngn' 카테고리의 다른 글

[CodeEngn] Basic RCE L20 풀이  (0) 2020.03.05
[CodeEngn] Basic RCE L18 풀이  (0) 2020.03.05
[CodeEngn] Basic RCE L17 풀이  (0) 2020.03.02
[CodeEngn] Basic RCE L16 풀이  (0) 2020.03.01
[CodeEngn] Basic RCE L15 풀이  (0) 2020.02.29

댓글

Designed by JB FACTORY