블로그 이전했습니다. https://jeongzero.oopy.io/
[CodeEngine] Advance RCE L01
본문 바로가기
워게임/CodeEngn

[CodeEngine] Advance RCE L01

728x90

1. 문제


이 프로그램은 몇 밀리세컨드 후에 종료 되는가
정답인증은 MD5 해쉬값(대문자) 변환 후 인증하시오

  • 패킹 : UPX
  • Autoit 스크립트 언어로 작성되어 pe로 빌드된 바이너리

2. 접근방법


exe2aut로 디컴파일해보자

autoit 스크립트 언어에서 msgbox 함수를 찾아보자

4번째 인자에 타임아웃 값이 들어간다. 13.179초 후에 종료된다는 걸 알 수 있다.

13.179s == 13179ms

3. 풀이


너무 쉽다. 이번에는 직접 분석을 해서 찾아보자. basic 문제 중에 동일한 문제가 있었다. 시간 체크를 하는 로직은 timegettime 함수로 현재 흘러간 시간을 계산하고 세팅된 시간과 비교하는 로직이 였다.

아이다에서 해당 함수를 검색해보자

많은 곳에서 해당 함수를 사용한다는 것을 알 수 있다. x32dbg로 이동하여 저 함수가 사용되는 곳에 전부 bp를 걸고 진행해보자

보면 0x444c44에 걸린다. edi를 call하는데 이는 timeGettime 함수이다. 흘러간 시간을 esi에 저장하고 다시 한번 해당 함수를 호출한다. 그다음 cmp eax, esi를 비교한다. 당연히 가장 최근에 호출한 timeGettime 함수의 반환값이 크므로 0x44d38로 이동한다.

그 전에 저 위치가 어디인지 아이다로 확인해보자

StartAddress 함수 내용이다. 저 함수는 어디서 호출할까

_beginThreadex() 함수에서 핸들러 함수로 등록되어있다. 따라서 시간 측정하는 로직은 쓰레드로 측정하고 그 밑에 보면 msgbox가 호출되는 걸 볼 수 있다.

autoit 스크립트 언어의 msgbox 함수의 4번째 인자는 타임아웃 값이지만 pe로 빌드되었기 때문에 win api 함수인 messagebox의 4번째 인자는 타임아웃 값이 아니다.

쨋든 다시 쓰레드를 분석해보자

jmp를 한 곳이다. eax-esi를 통해 최근에 구한 timegettime 결과 값과 전에 구한 값을 뺀다. 즉 프로세스가 수행된 시간을 측정하는 로직이다. 부모 프로세스에서는 msgbox가 띄워져 있을 것이다.

eax와 ebx+4에들어있는 값과 비교한다. 이를 확인해보면 0x337b이다. ebx+4가 더 크다는 소리는 정해놓은 시간 이상으로 시간이 흘렀다는 의미이고 call ebp를 호출한다.

따라서 0x337b가 기준 시간이다. 이를 10진수로 변경하고 md5 해시값을 구하면 된다

4. 몰랐던 개념


728x90

'워게임 > CodeEngn' 카테고리의 다른 글

[CodeEngine] Advance RCE L03  (0) 2021.01.27
[CodeEngine] Advance RCE L02  (0) 2021.01.26
[CodeEngine] Malware Analysis L08  (0) 2021.01.23
[CodeEngine] Malware Analysis L07  (0) 2021.01.23
[CodeEngine] Malware Analysis L06  (0) 2021.01.23