본문 바로가기

리버싱/리버싱핵심원리

1, 2장 요약

정적 분석과 동적 분석

 

1) 정적 분석

파일의 겉모습을 관찰하여 분석하는 방법으로 파일을 실행하지 않는다. 파일의 종류(EXE, DLL, DOC, ZIP 등), 크기,

헤더(PE) 정보, Import/Export API, 내부 문자열, 실행 압축 여부, 등록 정보, 디버깅 정보, 디지털 인증서 등의 다양한

내용을 확인한다. 

 

2) 동적 분석

파일을 실행시켜서 그 행위를 분석하고, 디버깅을 통해 코드 흐름과 메모리 상태 등을 자세히 살펴보는 방법으로 파일, 레지스트리, 네트워크 등을 관찰하면서 프로그램의 행위를 분석한다. 또한 디버거를 이용해 프로그램 내부 구조와 

동작 원리를 분석할 수 있다. 

 

 

원하는 코드를 빨리 찾는 방법

  • 코드 실행 방법 : 프로그램의 기능이 명확한 경우 명령어를 하나하나 실행하면서 원하는 위치를 찾아가는 것
  • 문자열 검색 방법 : "마우스 우클릭 - Search for - All referenced text strings"
  • API 검색 방법(1) - 호출 코드에 BP : "마우스 우클릭 - Search for - All intermodular calls"를 이용하면 코드에서 사용된 API 함수 호출 목록만을 볼 수 있다
  • API 검색 방법(2) - API 코드에 직접 BP : "마우스 우클릭 - Search for - Name in all modules" 명령을 사용한다       OllyDbg는 Packer/Protector를 사용해 실행파일을 압축(또는 보호)하면, 파일 구조가 변경되어 OllyDbg에서 API     호출 목록이 보이지 않는다. 이 경우 프로세스 메모리에 로딩된 라이브러리(DLL 코드)에 직접 BP를 걸어보는 것이다.         

문자열 패치

패치 : 기존 응용 프로그램의 버그를 수정하거나 새로운 기능을 추가시킬 수 있다. 패치 대상은 파일 혹은 메모리가 될 수 있으며, 프로그램의 코드와 데이터 모두 패치 가능

 

문자열을 패치하는 방법

1. 문자열 버퍼를 직접 수정

덤프창에서 Go to 명령(Ctrl+G)으로 패치하고자 하는 주소로 이동 -> 수정할 범위를 지정하고 (Ctrl+E) 단축키로 Edit 다이얼로그를 띄움 -> 수정

 

2. 다른 메모리 영역에 새로운 문자열을 생성하여 전달

덤프창에서 프로그램에서 사용되지 않는 NULL padding 영역을 찾아서 원하는 문자열을 입력하고, 코드를 수정해서 함수에 새로운 버퍼 주소를 파라미터로 전달해야 한다.

 

주의사항

  • 유니코드는 알파벳 한 글자당 2바이트가 필요
  • 원본 문자열보다 큰 문자열을 덮어쓸 때는 그 뒤의 데이터를 훼손하지 않도록 조심해야 한다.
  • 유니코드 문자열은 2바이트 크기의 ULL로 끝나야한다.
  • 패치 작업은 메모리에 임시적으로 한 것이라 디버거가 종료되면 패치했던 내용은 사라진다. 따라서 변경한 내용을 보존하려면 별도의 실행 파일로 저장해야 한다 (덤프창에서 변경된 내용 선택 - 마우스 우클릭 - Copy to executable file - Save file)