1. 문제
win10에서는 동작하지 않는다. win7에서 수행해야한다.
비밀번호를 찾으면 될듯
2. 접근방법
아이다에선 메인이 디컴파일이 안되서 기드라랑 같이 분석을 시작했다
문자열 기준으로 검색을 했을때 0x401d80함수에서 Enter password 를 사용한다. 저 함수는 단지 해당 문자열을 출력만 해줄 뿐 실제 입력은 받지 않는다
실제 입력은 0x402010함수에서 받는다.
'1234' 라고 입력했을 때 0x18f568에 저장되는 걸 볼 수 있다. 저기를 기준으로 분석을 시작하면 된다
3. 풀이
이어서 계속 분석해보자
사용자의 입력을 저장하고 루프를 돈다. 근데 입력값을 컨트롤 하는 로직은 아닌거 같다. 중요한 건 입력값을 키젠시키는 로직과 정답 비밀번호와 비교하는 부분을 찾아야한다. 저 루프를 벗어나자 일단.
그다음은 귀찮아서 traceoverbeyondtracerecord 기능을 이용하여 call 어셈만 확인하면서 입력값이 인자로 들어가는지를 확인해봤다. 커맨드는 다음과 같다
tobt dis.iscall(cip)==1
트레이싱을 하다보면 call edx 부분을 볼 수 있다. 여기서 두번째 인자에 입력 값이 들어간다. 원래는 0x18f568 에 초기에 저장되었지만 뭐 건너띈 로직에서 저곳에도 저장을 하나보다. 저 함수 내부 로직을 파악해보자
보면 입력 값을 통한 키젠 과정 따로없이 그대로 한바이트 씩 어떤 문자와 비교하는 걸 볼 수 있다
확인을 해보면 비교하는 문자열은 CRAAACKED! 이다. 이를 다시 입력으로 해서 첨부터 디버깅 해보자
조건을 다 만족시키면 msgbox를 호출한다. 내용은 Well Done이다.