https://codeengn.com/challenge/rce_advance/
CodeEngn [코드엔진] 리버스엔지니어링 컨퍼런스
CodeEngn Challenge 리버스엔지니어링을 어느정도 접한 분들을 위한 중급 단계 Manager >> Auth | Checkin List | Hall of Fame Challenge >> Basic | Advance | Pro | Malware | Crypto | Mobile RCE Advance Level Description Author Download Adv
codeengn.com

문제에 대한 설명이다
디버거를 통해 열어보니 pushad 문구가 보인다

detect it easy를 통해 패킹 확인을 해보자

예상대로 UPX 패킹이 되어있는걸 확인할 수 있다
터미널을 통해 언패킹을 해준뒤 올리디버거로 다시 확인해보자

디버거를 방지하는 함수 또는 문구가 존재하는 듯 하다


위의 all intermodular calls 를 통해 IsDebuggerPresent 함수를 발견했다

test eax, eax 연산을 한 후 jnz 문구를 통해

아까 발견한 문장이 MessageBoxA 함수를 통해 출력되는 것을 확인하였다
이를 우회하기 위해 test 문구를 cmp로 수정하도록 하자
cmp로 수정하면 값이 같기때문에 jnz 문구에 영향을 받지 않는다
이제 어떠한 함수로 인해 프로그램이 종료되는지 확인해야하는데,
아까 IsDebuggerPresent 함수를 확인하면서
위에 timeGetTime 함수가 존재함을 확인할 수 있었다
의심스러우니 한 번 살펴보아야 할 것 같다

모든 timeGetTime 함수에 breakpoint를 걸고 확인해보려고 하니 call 명령어가 자주 보인다
call dword ~ 와 같은 명령어는 함수 호출을 위한 준비단계이므로 함수를 분석하기 위해서는
다른 부분을 살펴보아야 한다

찾다보면 call edi 부분이 존재하는데 이 부분을 분석해보자

1. call edi 명령어를 통해 timeGetTime 함수의 반환값을 eax에 저장
2. byte ptr ds:[48E8D3]에 저장된 값 ( 1이 저장되어 있음 )과 0을 비교
3. esi에 eax의 값 저장 ( timeGetTime 함수의 반환값이 저장됨 )
4. cmp 명령어의 결과에 따라 jmp
5. 값이 다르므로 mov 명령어를 통해 값 저장
6. eax에 timeGetTime 함수의 반환값이 저장 ( 1번과 동일한 동작 )
7. eax, esi를 비교 ( 두 함수의 반환값 비교 )

8. eax의 값이 더 크기때문에 00444D38로 이동

9. eax에서 esi를 뺀 값을 eax에 저장
=> 두번째로 호출한 timeGetTime 함수의 반환값에서 첫번째로 호출한 timeGetTime 함수의 반환값을 뺌
10. eax와 dword ptr ds:[ebx+4]의 값 비교
11. eax의 값이 더 크면 00444C71 주소로 이동

12. 008AF87C에 저장된 값인 337B와 비교
13. eax의 값이 337B보다 크거나 같으면 00444C71로 jmp
14. 작은 경우 48E8D3에 저장된 값과 0을 비교한 후 같지 않으면 444C5F로 이동
-> 444C5F로 이동하면 두번째 timeGetTime 함수를 호출후 앞 과정 반복
첫번째 timeGetTime 함수는 프로그램 실행 시간을 기록하고,
실행 한 후의 시간이 337B보다 커질때까지 timeGetTime 함수를 호출하여 확인

EndDialog, IsWindow등의 함수를 통해 프로그램이 종료되는 것을 알 수 있다
따라서 문제의 정답은 0x337B ( 16진수 ) -> 13179 ( 10진수 )

이를 대문자로 변환하여 사이트에 입력하면


성공이다
'CodeEngn' 카테고리의 다른 글
| [CodeEngn]Advance RCE 06 Write Up (5) | 2024.10.31 |
|---|---|
| [CodeEngn]Advance RCE 05 Write Up (8) | 2024.10.30 |
| [CodeEngn]Advance RCE 04 Write Up (0) | 2024.09.11 |
| [CodeEngn]Advance RCE 03 Write Up (1) | 2024.09.11 |
| [CodeEngn]Advance RCE 02 Write Up (2) | 2024.09.09 |