OEP를 구한 후 '등록성공' 으로 가는 분기점의 OPCODE를 구하시오.
정답인증은 OEP + OPCODE
EX) 00400000EB03
upx 섹션을 찾을 순 없어서 upx packing이 아님을 확인했다. 하지만 pushad, popad는 그대로 인것으로 확인했다. 찾아보니 ASPack이라는 패커가 사용되었다고 한다.
그 뒤의 push 10.445834, ret부분은 push 10.445834, pop eip, jmp eip이니 jmp 10.445934이니 oep는 0x445834가 됨을 확인할 수 있었다. 해당 주소를 OEP로 두고 IAT를 fix한 dump파일이 되니 정상적으로 실행이 됨을 확인했다.
등록 성공이라는 문자열을 찾고
해당 문자열이 참조되는 곳으로 간 다음에
해당 분기점의 OPCODE 75 55를 찾을 수 있었다.
004458347555
문자열 데이터를 보면 cm5.dat이라는 문자열을 확인할 수 있다.
39번 줄에서 v20에 해당 문자열 데이터를 가지고 어떠한 작업을 한 후
42번째 줄에서 READSTRING(v20, v18, 20) 이라는 문자열을 읽어오는 듯한 함수
45번째 줄에서 READSTRING(v20, v17, 20) 이라는 문자열을 읽어오는 듯한 함수
50번째 줄에서 v18 < 5보다 작으면 다음 메시지를 띄어준다.
66번 째 줄에서 v15와 v22를 비교한 후 v9(ida 상에서 ZF라 분석해줌)가 쓰이는 조건문이 참이 되어야 등록 성공 메시지를 띄어주는데 그럴려면 v15와 v22의 문자열이 같아야한다.
65번 째 줄의 함수에 들어가면 다음의 함수를 발견할 수 있고 문자의 길이만큼 문자열을 가져오는 듯 해보이는 함수이다.
아무것도 쓰여지지 않은 cm5.dat를 실행시키면
위 메시지 후에 Registered ...well done! 이라는 문자열을 띄울 수 있다.
v15에는 v17로 부터 들어가는 문자열이 들어가는 것 같고 v22는 v21 + v9-11의 위치로부터 문자열을 가져오는 것 같지만 아무 값도 가져오지 못해서 문자열이 없는 것 같다.
따라서 만든 파일에 아무값도 쓰지 않아야 성공 메시지를 확인할 수 있는 것 같다.