안경잡이개발자

728x90
반응형

wargame.kr - DLL with notepad 문제풀이(Write Up)

문제 분류: 리버싱(Reversing)

 

  이번 시간에 풀어 볼 문제 또한 리버싱(Reversing) 문제입니다. 문제 이름은 DLL with notepad로 간단한 DLL 모듈을 분석할 수 있는 지에 대해서 물어보는 문제입니다.

 

  ▶ 문제풀이 사이트 주소: http://wargame.kr

 

  사이트에 접속하면 두 개의 파일이 들어 있는 압축 파일을 다운로드 받게 됩니다. 압축을 풀어 주고 다음과 같은 두 파일을 확인합니다.

 

 

  실제로 노트패드 애플리케이션을 실행해 보면, 메모장 프로그램이 실행되는 것을 알 수 있습니다.

 

 

  아무래도 이러한 메모장 프로그램이 실행됨과 동시에 blueh4g13.dll 모듈이 함께 실행되는 것으로 판단할 수 있습니다. 문제부터 DLL을 사용한다고 명시하고 있기 때문입니다. 따라서 가장 먼저 IDA Pro 32 bit을 실행하여 blueh4g13.dll 파일을 열어 보도록 하겠습니다.

 

  그랬더니 DLL 모듈의 메인 함수 부분이 눈에 보입니다.

 

 

  막막할 때는 해당 모듈에 어떤 문자열이 포함되어 있는지 확인하는 것이 가장 좋습니다. 따라서 Shift + F12로 [String View]를 실행합니다.

 

 

  확인 결과 'oh! handsome guy!'라는 수상한 문자열을 확인할 수 있었습니다. 따라서 더블 클릭하여 문자열이 참조되는 함수를 찾아가 보았습니다. start+49 함수에서 해당 문자열을 참조하는 것을 알 수 있습니다. 따라서 이를 따라가서 F5를 눌러 Hex-Ray를 이용합시다.

 

 

  그랬더니 다음과 같이 DLL 모듈이 notepad.exe와 연동되는 코드를 확인할 수 있습니다. wcsicmp는 문자열 비교 함수로서 두 문자열이 같을 때 0이 반환됩니다. 따라서 전체 소스코드를 살펴 보자면 정확히 "notepad.exe"라는 프로그램과 연동되는 것입니다. 또한 StartAddress라는 쓰레드 함수가 실행되는 것을 확인할 수 있습니다. 따라서 StartAddress 함수를 확인합시다.

 

 

  함수를 방문한 결과, 사용자가 입력한 문자가 dword_10003388과 동일할 때 정답 처리를 받을 수 있도록 소스코드가 작성되어 있는 것을 확인할 수 있습니다. 그렇다면 dword_10003388에 Password가 담겨 있을 가능성이 높습니다.

 

 

  따라서 dword_10003388을 더블 클릭하여, 해당 문자열이 어떤 함수에서 불려지는지 확인할 수 있습니다.

 

 

  아래 사진을 보시면 dword_10003388이라는 배열에 한 글자씩 v2의 값을 넣는 것을 알 수 있습니다. v2는 어떤 값인지 명확히 판단이 어렵지만, 시간 변수를 적절히 조절해서 임의의 값을 생성한 뒤에 이를 v2에 넣는 것임을 알 수 있습니다. 아무래도 정적 분석은 쉽지 않을 것 같습니다. 동적 분석이 가능한 상황이므로 동적 분석을 진행하도록 하겠습니다.

 

 

  이쯤에서 한 가지 의문점을 가져야 합니다. dword_10003388의 값이 언제 Update 되는 지 고려할 수 있습니다. 실제로 dword_10003388가 언제 참조되는지 확인해보면, 세 가지 명령어에서 참조되는 것을 알 수 있습니다. 다음과 같습니다.

 

 

  첫 번째 명령어: dword_10003388을 0으로 초기화

  두 번째 명령어: dword_10003388을 임의의 문자열로 만들기

  세 번째 명령어: dword_10003388이 사용자가 입력한 텍스트와 동일한 지 비교 

 

  결과적으로 dword_10003388은 임의의 문자열이 대입 된 이후에는 값이 다시 변경되지 않습니다. 정리하자면 notepad.exe가 실행되어 dll 모듈이 적재된 순간에 dword_10003388에 저장되어 있는 값을 출력하면, 그것이 바로 Password일 것이라고 유추할 수 있습니다.

 

  그렇다면, 이러한 dword_10003388에 담겨 있는 값은 어떻게 꺼내 올 수 있을까요? 앞서 언급했듯이 코드가 복잡할 때는 정적 분석보다는 동적 분석을 추천합니다. 이럴 때는 OllyDbg를 이용하면 쉽게 문제를 풀 수 있습니다.

 

※ OllyDbg를 이용한 방법 ※

 

  OllyDbg로 한 번 노트 패드 프로그램을 열어 보겠습니다.

 

 

  ALT + E를 눌러 [Executable modules] 탭을 열면, 해당 프로그램과 연동된 DLL 모듈을 확인할 수 있습니다. blueh4g13.dll이 보이네요. 더블 클릭합니다.

 

 

  blueh4g13.dll의 창을 불러 온 다음에 실행 버튼을 눌러서 노트 패드가 켜지는 것을 확인합니다.

 

 

  이제 실행이 되었으니, DLL 모듈이 성공적으로 초기화 되었겠죠? 이제 우클릭 하여 [Search for] - [All referenced text strings]를 눌러서 해당 DLL에 존재하는 문자열 정보를 확인합니다.

 

 

  그랬더니 다음과 같이 문자열에 Password 값으로 보이는 문자열이 발견되었습니다.

 

 

  다음과 같이 Password 값을 이용하여 [auth] 버튼을 누르면 Flag 값을 얻을 수 있습니다.

 

 

※ Process Explorer를 이용하는 방법 ※

 

  또한 사실 런타임 환경에서 dll 모듈에 저장되어 있는 변수의 값을 찾는 방법으로 프로세스 익스플로러(Process Explorer)를 이용하는 방법이 있습니다. DLL 모듈이 초기화 된 이후에 String 값은 Memory 영역에 올라가기 때문에 이를 검토할 수 있습니다.

 

  Process Explorer에서 현재 실행 중인 Notepad 프로그램을 선택하면, 아래 쪽에 함께 실행 중인 서브 프로세스를 확인할 수 있습니다.

 

 

  [Memory] 탭으로 이동하여 확인해도, 아까와 마찬가지로 Password 값이 보이는 것을 알 수 있습니다. 하지만 일반적인 경우 위에서 다룬 OllyDbg를 이용한 동적 분석 방식이 효과적으로 사용됩니다.

 

 

728x90
반응형