실행파일을 실행해보면 위와 같이 뜹니다. 그리고 시간이 좀 지나고 꺼지는 걸 알 수 있습니다.
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 이랍니다.
대충 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 밀리초이네용 ^_^
'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 |