WARGAME/reversing

[코드엔진/CodeEngn] Basic RCE L19

lucykorea414 2023. 11. 13. 20:26
728x90

 

 

 

실행파일을 실행해보면 위와 같이 뜹니다. 그리고 시간이 좀 지나고 꺼지는 걸 알 수 있습니다.

 

 

exeinfo로 분석한 모습입니다.

upx 패킹이 되어있음을 볼 수 있으니 upx 언패킹을 합니다!

 

 

 

이제 분석을 해보려고 x32dbg로 분석을 하려는데 실행을 해보면 다음과 같이 제대로 창이 안뜨고 에러메세지가 뜹니다

 

 

 

우선 이 에러에서 AutoIt가 뭔지 찾아봤는데 

 

AutoIt v.3.2.5.1 이하 버전들은 공식 디컴파일러가 디컴파일을 할 수 있다고 나와있는데

 

이 실행파일은 exeinfo에서 3.3 버전이라고 했으므로... ㅜㅜ 디컴파일러는 없고 그냥 분석에서 찾아야 할 것 같습니다

 

 

여기서 디버거를 탐지하는 함수를 찾아봤습니다

맨 위에 있는 거 더블클릭해서 들어가서 그래프로 보기 눌렀더니 아래와 같이!!

 

이렇게 오류문이 생긴것을 볼 수 있씁니다~

그럼 이 오류문이 안나오게 패치를 하면 되겠죠??

jne에서 점프가 취해져서 오류문이 출력되었으니 점프가 되지 않게 je로 수정해줍니다

그럼 이 상태에서 다시 한번 실행 해봅시다!

 

그럼 이렇게 정상적으로 뜨는걸 볼 수 있습니다 :)

 

이제 시간을 보는 함수를 찾아봅시다.

https://learn.microsoft.com/en-us/windows/win32/api/timeapi/nf-timeapi-timegettime

 

timeGetTime function (timeapi.h) - Win32 apps

The timeGetTime function retrieves the system time, in milliseconds. The system time is the time elapsed since Windows was started.

learn.microsoft.com

위의 문서를 보면 운영체제 시작하고 나서 현재까지의 시간을 밀리초로 리턴해주는 함수가 timeGetTime 이랍니다.

대충 gettime 으로 검색을 해보면 아래와 같이 뜨네요

모조리 bp를 걸어놓고

실행해서 어디서 멈추는지 봅시다

 

 

신기하게 저 중에서 함수 호출(call)이 아니라 mov 부분에서 멈췄습니다!

 

그럼 이제 제대로 어셈블리를 분석해봅시다

 

call edi -> eax에 운영체제가 실행된 시점부터 지금까지의 시간이 들어감

mov esi, eax -> esi에 시간 복사

( 0x00444C5F ) call edi -> 다시 timeGetTime 함수 실행, eax에 다시 업데이트된 현재시간까지의 시간이 들어감

(EIP설정된 부분) cmp eax, esi -> 전의 시간과 현재의 시간 비교!

그러면 무조건 esi가 eax작기 때문에 점프문 실행

 

 

점프문 실행 뒤:

sub eax, esi -> 프로그램이 실행된 시간(밀리초) 계산 후 eax 에 저장

cmp eax, dword ptr ds:[ebx+4] -> eax에 저장된 값(밀리초)와 ebx+4에 있는 값과 비교

 

만약 eax값이 더 작으면 밑의 명령어를 통해 다시 timeGetTime 함수를 실행하고 반복하는걸 볼 수 있습니다.

만약 eax 값이 더 크다면? 프로그램이 종료됩니다!!

 

그러면 ebx+4에 정확한 밀리초가 있겠죠?!?!?

여기서 ebx+4에는 2B70이라는 헥스값이 있네용

10진수로 바꾸면

따라서 11120 밀리초이네용 ^_^

728x90

'WARGAME > reversing' 카테고리의 다른 글

[코드엔진/CodeEngn] Advance RCE L03  (0) 2024.03.27
[코드엔진/CodeEngn] Basic RCE L13  (0) 2023.11.13
[dreamhack] rev-basic-3  (0) 2023.09.22
[dreamhack] patch  (0) 2023.09.22
[dreamhack] rev-basic-1  (0) 2023.09.15