-榮-

[CodeEngn] Advance RCE L01 본문

CodeEngn/Advance

[CodeEngn] Advance RCE L01

xii.xxv 2021. 3. 31. 14:57

 

● CodeEngn Advance RCE L01 문제

 

 

CodeEngn Advance RCE L01

 

 

◎ 파일 실행 화면

 

[그림 1] 파일 실행 화면

 

 

 패킹 및 난독화 여부 확인

 

[그림 2] Exeinfo PE - UPX 패킹 확인

 

[※참고]

Advance RCE L01 실행파일은 Basic RCE L19와 매우 유사한 파일입니다.

파일의 자세한 흐름은 CodeEngn Basic RCE L19 참고해 주세요.


 

● CodeEngn Advance RCE L01 풀이

 

 

[그림 3] UPX Unpacked

 

 

[그림 4] 디버거 - OllyDbg / 디버기 - 01.exe (Advance RCE L01 실행파일)

 

언패킹 한 파일을 디버거에 올리고 실행[F9]하면 [그림 5]가 뜹니다.

MessageBox는 AutoIt로 컴파일되었다는 것을 알려줍니다.

 

[그림 5] 디버거에서 실행했을 때 MessageBox

 

AutoIt 전용 디컴파일러인 Exe2Aut을 사용하여 문제를 풀 수 있지만,

파일을 분석해서 문제를 풀어보도록 하겠습니다.

 

 

[Seach for > All intermodular calls]에서 디버거 탐지 함수인 IsDebuggerPresent 함수를 찾아 BP를 설치하고 실행[F9]해 보겠습니다.

 

 

[※참고]

다른 주소의 같은 함수에 한 번에 BP를 거는 것은 CodeEngn Basic RCE L03의 "+α 함수를 알고 있다면..." 참고해 주세요.

 

[그림 6] IsDebuggerPresent BP

 

실행을 하면 0040E961 IsDebbugerPresent 함수에서 정지합니다. 이 부분의 디버거 탐지 결과로 AutoIt로 컴파일되었다는 것을 알려주는 MessageBox를 띄우는 것이 결정되는 것입니다. 따라서 이 부분을 패치하여 디버거에서도 [그림 1]의 실행 화면을 띄우도록 합니다.

 

[그림 7] IsDebuggerPresent

 

패치 방법은 여러 개 있지만, CodeEngn Advance RCE L01 글에서는 TEST EAX, EAX --> CMP EAX, EAX로 패치했습니다.

 

[그림 8] 패치

 

패치를 하였으면, 패치 파일을 만들어 디버거에 올립니다.

 

[※참고]

패치파일 생성은 CodeEngn Basic RCE L01의 "+α 패치파일 만드는 법" 참고해 주세요.

 

 

[그림 9] 디버거 - OllyDbg / 디버기 - 01_patched.exe

 

CodeEngn Advance RCE L01의 문제는 몇 밀리세컨드 후에 종료되는가입니다.

[Seach for > All intermodular calls]에서 시간 관련 함수들에게 BP를 걸어두고 실행하면 어디 주소의 함수의 영향으로 종료가 되는지를 알 수 있을 것입니다.

 

[그림 10] 시간 관련 함수 BP (SetTimer / timeGetTime / Sleep)

 

종료되는 시점은 프로그램의 MessageBox가 뜨고 난 이후이므로 MessageBox 함수에도 BP를 걸어 [그림 1]을 띄우는 MessageBox를 찾고 난 뒤 실행되는 시간 관련 함수를 찾으면 됩니다.

 

[그림 11] MessageBox BP

 

MessageBox가 나오는 주소까지 실행[F9]합니다. 00444DB8에서 [그림 1]의 문자열과 같은 Parameters를 가지는 MessageBoxW 함수를 찾을 수 있습니다. 이후 실행[F9]을 한 뒤 나오는 시간 관련 함수가 문제의 핵심입니다.

 

[그림 12] MessageBoxW

 

실행[F9] 후 나온 00444C44 CALL EDI가 timeGetTime 함수를 호출하고 있습니다.

 

[그림 13] 00444C44 CALL EDI
[그림 14] CMP EAX, [EBX+4]

 

◎ [그림 13], [그림 14]의 흐름을 보자.  (CodeEngn Basic RCE L19와 같습니다.)

 

[그림 13]

 1. 00444C44에서 시스템 시간을 가져와서 ESI에 넣습니다.

 

 2. 00444C5F(timeGetTime)에서 시스템 시간을 가져와서 이전의 시스템 시간과 비교합니다.

    비교 결과가 EAX가 ESI 보가 크면 00444D38로 JMP 합니다.

    (00444C44에서 00444C5F까지 실행되는 동안 시간이 흐르기 때문에 EAX가 ESI보다 큽니다.)

 

[그림 14]

 3. 00444D38으로 JMP 후 EAX에서 ESI를 뺍니다.

    (두 번째 timeGetTime 결과 - 첫 번째 timeGetTime = 프로그램 실행 시간)

    프로그램 실행 시간이 337Bh보다 큰지 비교하여 크면 00444C71로 JMP 합니다.

 

 

프로그램이 특정 시간 이후 자동으로 종료되는 것을 생각했을 때, "337Bh"이 지나면 종료되는 것으로 보입니다.

 

 


 

● CodeEngn Advance RCE L01 확인

 

timeGetTime 함수가 시스템 시간을 밀리 초 단위로 반환하는 것을 생각하면 "337Bh"을 10진수로 변환하면 CodeEngn Advance RCE L01이 몇 밀리세컨드 후에 종료되는지 알 수 있습니다.

 

[그림 15] 프로그램 종료까지 시간

 

 

CodeEngn Advance RCE L01의 답은 DB59260CCE0B871C7B2BB780EEE305DB 입니다.

 

 


 

CodeEngn Advance RCE L01의 파일을 Exe2Aut에 올리면 MsgBox를 확인할 수 있습니다.

 

[그림 16] Exe2Aut

 

AutoIt의 MsgBox의 Parameters (출처:autoitscript.com)를 확인해 보면 해당 timeout Parameter는 초 단위로 밀리 초로 변환하면 13,179이다.

 

[그림 17] MsgBox의 Parameters

 

 

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

[CodeEngn] Advance RCE L05  (0) 2021.04.02
[CodeEngn] Advance RCE L04 Serial 생성 분석  (0) 2021.04.02
[CodeEngn] Advance RCE L04  (0) 2021.04.02
[CodeEngn] Advance RCE L03 Serial 생성 분석  (0) 2021.03.31
[CodeEngn] Advance RCE L03  (0) 2021.03.31