본문 바로가기
CS & Reversing

[book] 리버스 엔지니어링 기드라 실전 가이드: Chapter 2

by m_.9m 2023. 7. 24.

2. 기드라 입문


2.1 기드라란

기드라는 미국 국가 안보국(NSA)이 개발한 소프트웨어 리버스 엔지니어링(SRE) 도구이다.

기드라가 지원하는 운영체제는 윈도우 7,10(64비트), 리눅스, 맥 OS(10.8.3 이후)의 버전이다. 동작에 필요한 하드웨어 요건은 메모리 4GB이상, 1GB 이상의 빈 스토리지이다. 또한 자바 11이 설치되어야 한다.

2.2 사용 가이드

2.2.1 프로젝트 생성

  • 프로젝트 생성: 프로젝트 타입은 [Non-shared Project]와 [Shared Project]가 있다. Shared Project를 이용하려면 기드라 서버가 별도로 있어야한다. 생성 후 CodeBrowser과 Version Tracking 버튼을 볼 수있다.

2. 기드라 입문


2.1 기드라란

기드라는 미국 국가 안보국(NSA)이 개발한 소프트웨어 리버스 엔지니어링(SRE) 도구이다.

기드라가 지원하는 운영체제는 윈도우 7,10(64비트), 리눅스, 맥 OS(10.8.3 이후)의 버전이다. 동작에 필요한 하드웨어 요건은 메모리 4GB이상, 1GB 이상의 빈 스토리지이다. 또한 자바 11이 설치되어야 한다.

2.2 사용 가이드

2.2.1 프로젝트 생성

  • 프로젝트 생성: 프로젝트 타입은 [Non-shared Project]와 [Shared Project]가 있다. Shared Project를 이용하려면 기드라 서버가 별도로 있어야한다. 생성 후 CodeBrowser과 Version Tracking 버튼을 볼 수있다.

  • 임포트: 분석 대상 프로그램을 드래그 앤드 드롭하거나 메뉴에서 불러온다. 파일을 임포트하면 아래와 같이 옵션 화면이 뜬다. 프로그램 포맷이나 언어를 선택한다.보통 자동으로 포맷과 언어가 인식된다.

  • 분석: 이후 업로드된 파일을 자동 클릭해 분석을 시작한다. 여기도 옵션 창이 있는데 기본설정으로 문제가 없고, 필요한 옵션이 있으면 추가한다.
  • CodeBrower: 리버스 엔지니어링을 하기 위한 도구
    • Program Trees: 프로그램 구조를 분석해 [Fragment]라는 단위로 분할해 표시한다. PE 형식의 파일은 헤더나 섹션으로 분할된다.
    • Symbol Tree: 프로그램 내 심벌에 관한 정보가 표시된다.
    • Data Type Manager: 프로그램 내 데이터형에 관한 정보가 표시된다.
    • Listing: 프로그램을 디스어셈블 한 결과가 표시된다
    • Decompile: 디스어셈블한 프로그램을 C 언어로 디컴파일한 결과가 표시된다,
    • Console: Ghidra Script, Ghidra Extension 출력이 표시된다. 
      • 권장 설정: 하이라이트, 키 바인딩 어셈블리 언어 행간 수정: [Edit] → [Tool Option]에서 설정 가능하다. XRef에서 [Add/Remove Column] → [Function Name] 활성화

2.2.2 Listing 창

  • 주소: 00401385와 같이 기드라가 프로그램을 읽고 메모리에 로드되는 가상 주소 값
  • 바이트: e8 ec 02 00 00과 같이 디스어셈블한 명령과 대응하는 헥스 코드의 바이트 열 표시
  • 어샘들리어: PUSH, MOV, CALL과 같이 실행할 명령이 표시. 오퍼 코드라고도 한다.
  • 오퍼랜드: EAX나 ESP등의 레지스터, 0x1f, 0x20 등의 수치, LAB_004013e7, DAT_00418054와 같은 라벨 들 조직과 연산 대상이 되는 오퍼랜드가 표시된다.
  • XREF: 함수 및 데이처 영역 참조원에 대한 링크 표시, 클릭하면 참조원으로 점프가 가능하고 []에는 피참조수가 표시된다.
  • 함수 정보: 함수의 이름이나 인수 정보는 함수 선두에 표시된다.
  • 문자열: 기드라는 단순히 오퍼랜드를 표시하는 것이 아니라 라벨이나 호출하는 API 등의 오퍼랜드가 가리키는 곳의 값이나 문자열 등의 정보 표시도 가능하다.

함수 정보 편집

함수 선두 명령을 우클릭해 함수 정보 편집이 가능하다. 편집 가능한 항목은 함수 이름이나 인수, 반환값, 호출 규약 등이다.

라벨 정보 편집

함수 이름, 변수 이름등의 라벨을 우클릭한 후 메뉴에서 Edit Label을 선택하면 라벨 정보 편집 화면이 열린다.

  • Enter Name: 변경할 이름 입력
  • Namespace: 라벨 네임 스페이스 지정
  • Properties: 라벨 속성 정보 변경
  • Entry Point: 엔트리 포인트 설정
  • Primary: 여러 개의 라벨이 있을 때 1차 라벨로 설정
  • Pinned: 이미지 기반의 변경이나 메모리 블록 이동의 영향을 받지 않도록 라벨 고정

마커

마커를 이용해 프로그램 내의 특정 장소를 지정할 수 있다. 마커에는 마진 마커와 내비게이션 마커 2종류가 있으며 북마크나 기드라 플러그인으로 지정할 수 있다.

마진 마커는 한 곳을 가르키며 에어리어 마커는 여러곳을 가르킨다.

내비게이션 마커는 Listing창 우픅에 바 형태로 표시된다. 마커 부분을 클릭하면 해당 부분으로 넘어간다. 마커를 우클릭하면 표시 설정을 변경할 수 있다.

엔트로피

앤트로피는 정보량을 나타내는 값으로 이 값이 높을 수록 정보량이 많아진다. 데이터가 인코딩이나 암호화되어 있을 경우 엔트로피가 높아지고 표시하려면 Listing창 상부의 [Toggles overview margin displays] → [Show Entropy]를 선택한다. 데이터의 개요를 파악하기 좋다.

오버뷰

오버뷰는 프로그램에 존재하는 다양한 유형을 색칠할 수 있다. 위의 [Toggles overview margin displays]에서 [Show Overview]를 선택한다.

흐름 화살표

흐름 화살표는 Listing창 좌측 여백에 표시돼 실행 흐름을 가시화한다. 조건부 점프는 점선으로 무조건 점프는 실선으로 나타낸다. 클릭시 녹색이 되고 더블클릭해 이동이 가능하다.

하이라이트

창 내에 표현돼 있는 요소 위에서 마우스 중앙을 클릭하면 그 요소가 하이라이트됨.

코멘트

코멘트를 입력하고 싶은 행에서 우클릭한 후 메뉴에서 [Comments]를 선택해 Listing 창에 임의의 코멘트를 입력. 다섯 종류로 지정이 가능.

2.2.3 Decompile 창

현재 표시되는 어셈블리 언어를 C 언어로 변환해서 보여줌.

마우스 조작

  • 왼쪽 클릭: 선택 부분 하이라이트
  • 우클릭: 메뉴
  • 중앙 클릭: 일치하는 문자열 모두 하이라이트
  • 더블 클릭: 대상이 링크면 이동
  • Ctrl+더블 클릭: 별도 창에서 대상을 snapshot으로 표시

커밋

커밋 시 편집 내용을 데이터 베이스에 저장하고 Listing 창과 동기화한다.

검색

[Ctrl + F]나 콘텍스트 메뉴에서 [Find]으로 문자열 검색.

2.2.4 그 외

  • Symbol Tree 창: 프로그램 내에 포함된 심벌 정보를 보여준다.
  • Data Type Manager 창: Data Type 검색, 정리, 적용이 가능하다.
  • Program Trees 창: 프로그램 헤더 정보를 불러와서 프로그램을 헤더나 섹션별로 디렉터리와 fragment라는 단위로 분할하여 표시함.
  • Bookmarks 창: 주소에 플래그를 붙이고 북마크로 기록함.
  • Byte 창: 분석 프로그램을 16진수 덤프로 표시. 메모리 최소 주소를 Start/ 메모리 최대 주소를 End/ 각 메모리 블록에 추가된 바이트 수는 Offset, 커서가 있는 주소를 Insertion으로 표시
  • Defined Strings 창: 프로그램 내 정의되는 문자열 목록을 보여줌.
  • Function Call Graph 창: 함수의 호출 관계를 계층화하고 가시화 함.
  • Function Graph 창: Listing 창에서 보이는 함수를 베이지 블록, 코드 블록으로 그래프화해서 보여줌. 분기 처리가 가시화되기 때문에 직감적으로 제어 흐름 파악하기가 쉬움.