본문 바로가기

정보보호/리버스엔지니어링

[F-Security] Level1. 문제 풀이

728x90
반응형

STEP1. 해당 실행 파일의 패킹여부를 조사한다.

실행파일이 패킹이 되어있다면, 본격적인 리버싱을 하기 이전에 언패킹을 수행해야 하기 때문이다.

여기서는 PEiD와 IAT를 확인하여, 패킹여부를 확인한다. 웬만한 패킹은 PEiD를 통해 검출이 가능하나, 검출이 안 되는 경우가 있으므로 IAT를 조사하여 교차검증을 한다.

[그림 1. PEiD로 패킹여부 검사하기]

[그림 2. IAT가 정상적인지 확인하기]

STEP2. EP(EntryPoint)를 찾는다.

보통 EP는 프로그램의 메인루틴이 실행되는 곳이기 때문에, 이곳의 주소를 찾으면 메인루틴을 찾는데 많은 도움이 된다. EP를 찾는 공식은 다음과 같다:

EntryPoint = ImageBase + Base of Code

여기서는 다음과 같이 적용할 수 있다:

EntryPoint(0x69001000) = ImageBase(0x69000000) + Base of Code(0x1000)

[그림 3. PEView를 통해, EP 찾기]

STEP3. EP를 찾아가기

먼저 Ollydbg를 켜면, 0x6900111E에서 시작하게 된다. (그림 4.) 밑으로 실행을 하다 보면, 우리가 찾는 EP인 0x69001000로 향하는 JMP문을 만날 수 있다. (그림 5.) 그 안으로 이동한다.

[그림 4. Ollydbg에서 처음 실행했을 때의 화면]

[그림 5. EP로 넘어가는 JMP문이 있음]

STEP4. 메인 루틴에서 시리얼을 처리하는 루틴을 분석하고, 정답을 찾아가기

EP인 0x69001000로 이동한 후(그림 6.), 계속 실행을 하다보면 문자열과 관련된 fprintf() 함수가 나온다.(그림 7.) 이 함수는 [그림 8.] 영역에 있는 데이터를 가져와 결합하는 것으로 보인다. 그다음, strcmp()를 통해, 입력 값과 프로그램이 원하는 값이 같은지 판단한 후(그림 9.), 성공 혹은 실패 메시지를 띄우게 된다(그림 10.).

따라서, 우리는 역으로, fprintf의 루틴을 파악하여 문자열을 파악해야 한다. 필자가 루틴을 파악하여, 문자가 들어오는 순서를 역으로 분석해보았다:

43 'C'

45 'E'

52 'R'

37 '7'

30 '0'

6D 'm'

73 's'

41 'A'

→ "Asm07REC"

보통 함수는 스택에 값을 넣어서(push) 인자를 전달한다. 스택은 FIFO의 구조이므로, 들어간 문자를 역계산하면 "Asm07REC"이라는 문자열을 얻을 수 있다. 따라서 이 값을 입력하면 [그림 10.] 같이 성공 메시지를 볼 수 있게 된다.

[그림 6. 0x69001000로 이동한 직후의 화면]

[그림 7. sprintf()를 통해, 문자를 결합하여 문자열로 만드는 루틴]

[그림 8. 그림 7에서의 문자열 소스로 의심되는 데이터 영역]

[그림 9. 시리얼과 관련한 조건분기문]

[그림 10. 시리얼을 찾아, 입력한 결과]

[출처: 리버스 엔지니어링 바이블 중, 해당 문제 풀이 부분의 과정만 참고]

반응형