문제풀이/CodeEngn

[CodeEngn] Basic 19 문제풀이 과정

ILV_쉱이 2022. 1. 20. 22:11
728x90
반응형

 


CodeEngn 사이트

https://ch.codeengn.com/

 

CodeEngn.com [코드엔진]

코드엔진은 국내 리버스엔지니어링 정보공유를 위해 2007년 부터 리버스엔지니어링 컨퍼런스 및 세미나, 워크숍을 현업 실무자들과 함께 운영하고 있는 비영리 커뮤니티입니다.

ch.codeengn.com

위 사이트에서 Basic 19번 문제를 다운로드 받습니다. 그 후 압축 푸시면 비밀번호입력이 나오게 됩니다. 비번은 'CodeEngn'입니다.

 


Basic 19번 문제

 

이 프로그램은 몇 밀리세컨드 후에 종료 되는가 입니다!


Basic 19번 문제풀이

 

B19의 실행파일을 x32dbg에 올려 ‘F9’으로 실행하니 실행이 안된다. 확인해본 결과 패킹되어 있었습니다.

 

pushad와 연관되어 있는 popad를 찾습니다. 다만, popad가 한 개만 있을 가능성은 드물기에 popad 아래에 jmp문이 있는 popad를 찾습니다.

 

B19문제는 ‘popad‘가 하나뿐입니다. BP를 걸어놓고, 더블클릭으로 해당 주소로 넘어갑니다.

넘어가서 확인해 본 결과

jmp문이 있고, 이 jmp문은 OEP라고도 합니다.. 이 부분을 x32dbg에 있는 플러그인으로 dump하는 방법과 uxp.exe 파일로 패킹을 푸는 방법이 있습니다 

저는 2번째 방법으로 언패킹을 시도하겠습니다.

언패킹 후 파일을 올렸다

언패킹된 파일로 ‘F9’를 한 결과 아래 그림처럼 메시지 박스가 출력되었습니다.

하지만, 문제를 보면 프로그램이 실행 이 후 몇 초 후에 종료가 되는지 물어봤으니까 관련된 명령어만 찾았으면 되는 문제였습니다.. 프로그램이 실행되는 시간을 의미한다고 생각하여 ‘time’과 관련된 명령어를 훑어 보았습니다.

어디에 있을지 짐작되지 않아 모든 모듈에서 모듈간 호출을 눌렀고, Time을 검색하게 되었습니다.

나온 검색창에서 맨 위에 있는 timeGetTime부터 구글링해보았습니다.

구글링 결과로 인해 바로 찾을수 있어서 다행이었습니다 ㅠㅠ

x32dbg에서 검색된 timeGetTime을 모두 BP를 걸어놓습니다(어디에 정답이 있는지 모르니까,,). 다시 한 번 확인하기 위하여 다시 실행하기 위하여 ‘F9’를 눌렀습니다.

눌렀을 때. 위에 메세지 박스처럼 똑같이 똑같이 나오는데, 확인해본 결과 ‘IsDebuggerPresent’가 있어서 바로 종료되는 거였습니다. 이것을 해결하기 위하여 [0x0040E967 ‘test eax,eax’] 부분에서 test를 cmp로 변경하거나, [0x0040E969 jne b19.4338DE]에서 jne를 je로 변경해야합니다.

변경 한 후에 ‘F9’를 눌러 실행하게 되면 처음에 걸었던 timeGetTime부분이 나옵니다.

위 그림을 보면, [0c00444C63 jae b19.444D38]에서 0x00444D38로 jmp하였습니다.

이 때 jae는 jmp above or equal를 의미합니다!

[0x00444D38]에서 뛰어넘은 그림입니다. 또 한 이 부분에서 분기했기 때문에, 이 때 다음에 나올 cmp부분을 확인합니다.

[0x00444D3D cmp eax,dword ptr ds:[ebx+4]을 확인합니다.

‘dword ptr ds:[ebx+4]’부분을 덤프하거나 ebx(0x008AF878)+4를 하여 나온 결과 값을 메모리에서 검색합니다.

검색하게 되면  ‘0x2B70’이 나오게 되는데,  이 것을 10진수로 환산한다.

‘2B70’ = 11120으로 밀리세컨드를 초로 바꾸면 1000으로 나눠야하기 때문에

따라서 답은 '11.12'초가 됩니다.

 

 

728x90
반응형