![]()
Basic을 모두 클리어하고, 다음 난이도인 Advance 문제를 풀이해보도록 하겠다.
#Advance RCE L01
이 프로그램은 몇 밀리세컨드 후에 종료 되는가
정답인증은 MD5 해쉬값(대문자) 변환 후 인증하시오
습관처럼 PEID에 파일을 올려보았다.
![]()
UPX로 패킹된 것을 볼 수 있었고, 언패킹을 진행했다.
![]()
![]()
PEID에 다시 올려 언패킹이 된 것을 확인할 수 있다.
올리디버거에 올려서 분석해보도록 하겠다.
![]()
Basic의 문제중에 비슷한 문제가 존재했기 때문에 함수를 검색해본다.
아마도 timeGetTime 함수가 있지 않을까 예상된다.
![]()
예상과 같이 timeGetTime 함수가 존재하는 것을 볼 수 있었고,
함수를 눌러 자세히 보도록 하겠다.
![]()
해당 함수를 호출하는 모든 부분에 BP를 걸고, F9를 눌러 실행시켜봤다.
![]()
Basic 문제와 같이 안티디버깅이 적용되어 있었고, 똑같이 우회하였다.
방법은 Basic에서 소개했기 때문에 따로 소개하지 않겠다.
안티디버깅 우회방법
![]()
실행을 시키면 해당 부분에서 브레이크가 걸리는 것을 볼 수 있다.
F8을 눌러 한줄씩 실행하다보면 JNB점프문에서 점프하게된다.
- JNB : 왼쪽 인자의 값이 오른쪽 인자의 값보다 크거나 같으면 점프
![]()
점프한 부분에서 CMP EAX,DWORD PTR DS:[EBX+4] 이 부분에서 시간을 비교하는 것을 알 수 있었고,
![]()
아래의 덤프창에 ebx+4로 이동하여 비교하는 부분을 알 수 있었다.
7b 33 00 00을 리틀엔디언으로 바꾸게 되면 33 7b이므로,
10진수로 전환하면 13,179가 나온다.
이를 MD5로 해쉬화를 진행했다.
![]()
인증방식처럼 대문자로 바꾸어 인증하면 클리어가 된다.
![]()