코드엔진 Basic RCE L06을 IDA로 분석하여 풀어보려고 한다.
문제 파일을 실행해보면 다음과 같이 실행되고, 아무 시리얼 번호나 입력해보면 Wrong serial!!!
이라는 창이 출력된다.
문제는 다음과 같다.
따라서 우리는 첫번째로 Serial, 두번째로 OEP값을 찾아야 한다.
파일을 우선 Detect It Easy에 올려보았다. upx로 압축된 파일이라고 뜬다.
그래서 일단 upx로 언패킹을 해서 패킹된 파일, 언패킹한 파일 이렇게 각각 한개씩을 만들어뒀다.
이제 Serial값을 찾아보자.
언패킹된 파일을 IDA로 열어보았다. F5
를 눌러 디컴파일하면 아래와 같은 win32api가 보인다.
이 함수를 더블클릭해서 들어가봤다. DialogBoxParamA와 LoadIconA가 보이는데, LoadIconA는 아이콘을 로드하는 함수로 보이고 DialogBoxParamA는 메세지 박스를 만드는 함수이다.
DialogBoxParamA의 DialogFunc을 더블클릭해서 들어가봤다.
그리고 sub_4011A0 안의 sub_401005함수에 들어갔다.
sub_401030()함수를 더블클릭해서 들어간다.
스트링 비교 함수 strcmp함수가 나온다. Str1과 Str2를 비교한 후 같으면 “You got it;)”을 출력한다고 한다.
Str1을 더블클릭해서 들어가보았다. Str1은 AD46DFS547
이다. 따라서 시리얼값은 AD46DFS547
인 것 같다. 확인해보자.
맞는 것을 확인했다!
OEP란? OEP(Original Point)는 특정 언팩 루틴이 수행되고 정상 바이너리 흐름이 시작되는 곳을 의미한다. 일반적인 프로그램은 실제 시작점이 프로그램 실행 시 시작점과 동일하지만 패킹이 되면 실제 OEP가 숨겨져 있게 된다.
패킹킹된 파일의 OEP는 언패킹한 파일의 EP와 같다. 따라서 UPX로 언패킹한 파일의 EP인 00401360
이 이 실행파일의 OEP이다.
jmp 401360
으로 OEP로 이동하였다.따라서 답은 00401360
와 AD46DFS547
을 합친 00401360AD46DFS547
이다!