IDA Pro 사용법 다시 공부하면서 업데이트 완료👌
# IDA 파일 로딩
- File → Open 으로 신규 파일을 열면 위의 대화 상자가 나타난다.
- IDA 로더가 선택한 파일 타입에 대해 가장 적합하다고 생각하는 파일 타입을 보여주며, 아래 MS-DOS executable(PE가 MS-DOS EXE 파일 확장 형태이기 때문에 보여준 것)이나 Binary file과 같은 제시 목록들도 보여준다.
- 잘 모르겠으면 IDA 로더가 제시한 기본 값을 선택하자.
- Binary file은 IDA가 인식하지 못하는 경우 대비해서 기본적으로 보여주는 파일 분석 방법이다.
- 제시 목록이 Binary file만 있다면, 해당 파일을 인식한 로더가 없다는 것을 의미한다.
- Processor type: 디스어셈블 수행할 프로세서 모듈 선택한다.
- IDA가 선택한 파일의 프로세서 타입을 제대로 결정하지 못하면 프로세서 타입을 수동으로 선택해야 한다.
# IDA Database file
- IDA는 선택한 실행 파일을 메모리에 올려서 분석한다.
- IDA의 데이터베이스 파일이 생성되는데, .id0, .id1, .id2, .nam, .til 파일이 저장된다.
- IDA 데이터베이스 파일들은 현재 프로젝트 닫으면 단일 IDB 파일로 묶인다.
- IDA Database file은 IDB 파일을 말한다.
- 데이터베이스가 문제없이 닫히면 .id0, .id1, .id2, .nam, .til 파일은 사라지며, 이 파일들이 남으면 데이터베이스 닫는데 문제가 생기거나, 데이터베이스가 손상된 것이다.
# IDA database 닫기
- 저장하는 것이 신규로 생성한 데이터베이스의 최초 저장이면, 신규 데이터베이스 파일이름은 파일 확장자만 .idb로 바꿔서 저장한다.
Don't pack database
- 수정 사항을 4개의 데이터베이스 파일에 반영하고 IDB 파일 생성하지 않고 IDA를 닫는다.
Pack database(Store)
- 4개의 데이터베이스 파일이 압축되지 않고 단일 IDB 파일로 묶인다.
Pack database (Deflate)
- 4개의 데이터베이스 파일이 IDB로 묶일 때 압축된다.
Collect garbage
- 데이터베이스 닫기 전 쓰지 않는 메모리 페이지 삭제
DON'T SAVE the database
- 데이터베이스 마지막으로 저장한 이후 변경 사항 반영하지 않을 때 사용 4개의 데이터베이스 컴포넌트 파일 삭제하고, 기존 IDB 파일 기존 상태 그대로
- 신규 생성한 데이터베이스이면, 작업을 저장하지 않고 4개의 데이터베이스 컴포넌트 파일들도 삭제된다.
# IDA View 화면
(1) Tool bar 영역
(2) navigation band
- IDA overview navigator
- 로딩된 파일을 선형 주소에 따라 보여준다.
- 기본적으로 바이너리 전체 주소 보여준다.
- 오른쪽 클릭, 줌 옵션에 따라 확대, 축소 가능
- 각 색깔은 데이터, 코드 등 파일 내용에 따라 다르다.
- 노란색 화살표는 디스어셈블리 창에 표시된 주소가 내비게이션 밴드 상에서 주소 위치임을 알려준다.
(3) 현재 열려있는 데이터 (subview)
- 데이터 디스플레이는 바이너리에서 추출한 정보, 데이터베이스의 데이터를 다양한 시각으로 보여준다.
- View → Open Subviews 메뉴에서 다른 디스플레이 화면을 볼 수 있다.
- 닫은 서브뷰도 이 메뉴에서 다시 열 수 있다.
- 창은 열릴 때마다 누적된다.
(4) Disassembly view
- 기본적인 데이터 디스플레이 뷰
- 바이너리 분석에 중요한 툴
- 텍스트 기반의 리스트 뷰, 그래프 기반의 그래프 뷰의 2가지 방식이 있다.
- 엔터를 누르면 어셈블리 코드 창(리스트 뷰)을 볼 수 있다.
- Option → General 메뉴의 그래프 탭에서 Use graph view by default 옵션을 끄면 리스트 뷰를 기본 값으로 할 수 있다.
그래프 뷰
- 플로우차트 형식으로 단일 함수 내용을 보여준다.
- 조건 점프로 끝나는 블록은 조건에 따라 Yes이면 녹색으로, No이면 빨간색으로 플로우가 있다.
- 끝나는 연속 블록은 파란색으로, 다음 실행할 블록을 가리킨다.
텍스트 뷰
- [섹션 이름]:[가상 주소] 형태로 가상 주소 보여준다.
- code reference: 화살표 창은 함수의 비선형적인 흐름을 보여준다.
- 굵은 화살표: 무조건 점프
- 대시 화살표: 조건 점프
- 더블클릭 시 현재 location에서 분기점이 발생한 곳으로 이동하고, ESC 누르면 다시 전 화면으로 돌아온다.
- ; 는 주석으로, 상호 참조(cross reference)를 의미한다.
- 인스트럭션으로 제어권이 해당 위치로 이동했음을 의미한다.
- 함수 스택 프레임 레이아웃을 고려한 최적의 예상에 기초한 선언 코드를 보여준다.
(5) Graph overview
- 기본 그래프 구조를 보여준다.
- 점선의 사각형은 현재 그래프 뷰 위치를 보여준다.
(6) Output window
- IDA가 생성한 정보를 보여준다.
- 상태 메시지, 사용자 요청에 따른 동작 결과 보여준다.
- IDAPython을 사용할 수도 있다.
(7) Function window
- IDA가 식별해 데이터베이스에 넣은 모든 함수를 보여준다.
- sub_140001000이 .text 섹션에서 발견됐다.
(8) 마우스나 키보드로 선택된 디스어셈블된 코드의 위치 정보
- 왼쪽: virtual address
- 오른쪽: virtual address:location으로 분기 전 코드의 시작점에서부터의 오프셋
(9) 현재 하드디스크 남은 용량
(10) IDA 현재 상태
# 기본 IDA 디스플레이
- 기본 IDA 뷰 창, Function window, Output window이 있다.
- View → Open Subviews 메뉴에서 원하는 창을 열 수 있다.
- ESC: 웹 브라우저의 뒤로 버튼과 유사하게 동작한다.
Hex View 창
- 16진수와 대응되는 아스키 값을 보여주는 표준 헥사 덤프 창
- Edit 메뉴 선택 시 헥사 에디터가 되어 수정 마치면 commit 또는 취소로 view 모드로 돌아올 수 있다.
Export 창
- 파일의 entry point 목록을 보여준다.
- export 창의 entry를 더블클릭 시 그곳의 디스어셈블리를 보여준다.
Import 창
- 바이너리에서 분석된 import된 모든 함수 목록을 보여준다.
- 바이너리가 공유 라이브러리를 사용할 때만 유효하다.
- 정적 링크된 바이너리는 외부 의존도가 없기 때문에 import될 사항이 없다
- import된 곳에서 더블클릭 시 해당 엔트리 주소의 디스어셈블리를 보여준다.
Structures 창
- 바이너리에서 사용됐다고 판단된 C 구조체나 공용체 같은 복합 구조체 보여준다.
Enums 창
- IDA가 표준 열거형 데이터 타입(C의 enum)을 찾았을 때 enums 창에 나타낸다.
Name 창
- 전역 이름 목록 보여준다.
- F: 정규 함수
- L: 라이브러리 함수
- I : 공유 라이브러리에서 임포트된 함수 이름
- C: 이름 붙은 코드, 함수로 생각할 수 없는 instruction
- D: 데이터. 보통 전역 변수
- A: 아스키 문자열 데이터
sub_xxxxxx 서브루틴
loc_xxxxxx instruction
byte_xxxxxx 8bit data
word_xxxxxx 16bit data
dword_xxxxxx 32bit data
unk_xxxxxx 알 수 없는 크기의 data
Segment 창
- 바이너리 내 존재하는 세그멘트 목록 보여준다.
- 섹션(section)을 의미함
함수 호출 창
- 호출 함수, 호출되는 함수 그래프 관계를 함수 호출 그래프(function call graph)나 함수 호출 트리(function call tree)라고 부른다.
- function call 창은 이웃 관계(X가 Y를 호출하거나 Y가 X를 호출하는 관계에서 X와 Y를 이웃 관계라고 한다.)를 알려준다.
- 함수가 Caller에 의해 호출되는지 알 수 있다.
# Pseudo Code 보기
-F5
- 특정 함수에서 F5 누르면 해당 함수의 스도코드를 볼 수 있다.
# ESC
- jump to previous position (only in disassembly window)
- 디스어셈블리에서 새로운 위치로 옮길 때마다 히스토리 목록에 현재 위치가 기록되는데, 디스어셈블리 창에서 ESC로 히스토리 목록의 최근 항목으로 갈 수 있다.
# ENTER
- jump to operand
- operand 위치에서 ENTER를 누르면 된다.
# 디스어셈블 상태, 디버깅 상태에서 특정 어셈블리 코드 고치고 싶을 때
- 고칠 부분 클릭하고 Alt + F2
- Menu : edit -> Other -> Manual Instruction
- 바꾸고 싶은 어셈블리어 구문 넣고 OK
- 프로그램 파일이 수정되는 것이 아니라 분석 화면에서만 바뀐다.
# Text View 화면과 Graph view 화면으로 전환
- 디폴트는 Graph view로, Option -> General 메뉴의 그래프 탭에서 Use graph view by default 옵션을 끄면 List view를 기본 값으로 할 수 있다.
- Graph view에서 List view로 바꾸려면 IDA View 화면에서 Spacebar
# Open 한 파일 정보 보기
-IDA View 화면에서 스크롤을 맨 위로 올린다.
-Open한 파일의 MD5 정보, Open한 파일의 경로, 해당 파일의 Format 정보, ImageBase 정보, Section의 size, OS 정보 등
# Jump to function
- Ctrl + p
# Stack frame 확인하기
- 초록색 변수를 더블클릭하면 stack frame을 확인할 수 있고, 각 변수들의 위치도 볼 수 있다.
# Next immediate value
- Ctrl + l
- 가장 가까운 다음 값으로 이동한다.
# Text Search
- Alt + t
-검색하려는 어셈블리어 구문을 넣는다.
# String Window
- Shift + F12
- 사용되는 API 정보들과 문자열 보여준다.
- String 더블클릭 시 해당 지점으로 이동
Xref operand : 원래 함수 본체로 이동
Xref reference : 해당 함수를 호출한 곳으로 이동
# IDA 그래프
- IDA View에서 F12
# IDA Debugging 모드
빨간색으로 표시되면 bp가 설정된 것인데, 해당 지점에서 bp 해제하고 싶으면 빨간 동그라미를 다시 누른다.
- breakpoint 설정 : F2 또는 왼쪽 동그라미 누른다.
- Debugging 시작 : 메뉴의 Debugger -> Start Process (F9)
- Step Into : F7
- Step Over : F8
- Debugging 종료 : Ctrl + F2
- Stack trace : Ctrl + Alt + S
- Breakpoint list - Ctrl + Alt + B
# Evaluate expression
- Shift + /
# 주석 달기
: (콜론) : Enter comment
;(세미콜론): Enter repeatable comment
# (xref) call 따라가기
함수명에서 x
# 함수 또는 변수명 이름 바꾸기
n
# byte 검색
- Alt + B
- 메뉴의 search -> sequence of bytes
# 북마크 기능
- 메뉴의 Jump -> Mark position / Jump to marked position
-주소 체크하기(Mark position) : 메뉴의 Jump -> Markposition : Alt + m
- 체크한 주소로 이동(Jump to marked position) : Ctrl + m
# IDA View 창에서 OPcode 보이게 설정하기
- 메뉴에서 Options -> General 의 Number of opcode bytes 를 6으로 설정 (default : 0)
# Execuate Script
- Shift + F2
# 상호 참조 그래프
- 해당 함수가 호출되는 과정 및 해당 함수가 호출하는 함수를 그래프로 보여준다.
- 해당 함수 위치에서 우클릭 -> Xrefs graph from : 해당 함수가 호출하는 함수 그래프로 보여준다.
- 해당 함수 위치에서 우클릭 -> Xrefs graph to : 해당 함수가 호출되는 과정을 그래프로 보여준다.
# 호출 함수 보기
- main 함수 위치에서 메뉴의 View -> Open subviews -> Function calls
main 함수가 호출하는 함수를 주소와 함께 보여준다.
# Xrep
- x : 변수 등을 선택하고 x를 누르면 xrefs to name 창이 뜬다.
# IDA code patch
- code patch : 바이너리의 코드를 수정하는 것
- IDA로 바이너리를 패치해도 (코드를 수정해도) original 바이너리에 반영되지 않는다.
-Edit -> Patch program -> Change Bytes : 커서 위치부터 16 바이트의 값을 읽어와 출력해주고 그 값들을 수정할 수 있도록 한다.
-> Change Word : Word 값을 변경할 수 있다.
-> Assemble : 어셈블리 명령을 입력하여 코드 패치를 한다.
- 수정이 끝난 후 apply patch to input file 을 수행하면 patch가 반영된다.
# 동적 디버깅
Vmware 가상머신의 .vmx 파일을 텍스트 편집기로 연 후, 하단에
debugStub.listen.guest32 = “TRUE”
debugStub.hideBreakpoints = “TRUE”
monitor.debugOnStartGuest32 = “TRUE”
세 문장을 넣는다.
부팅하고 IDA에서 Attach -> Remote GDB Debugger -> localhost:<#port>
0번에 attach to the process started on target을 선택한 후 0x7c00에서 breakpoint를 걸면 MBR 영역부터 디버깅이 가능하다.
# Remote Debugging
- 가상머신에서 실행되는 바이너리를 원격의 호스트 머신에서 안전하게 분석할 수 있다.
IDA가 설치된 폴더에 dbgsrv 폴더가 있다.
이 안에는 원격 디버깅을 리스닝할 프로그램이 들어있다.
Linux remote debugging을 하고 싶을 때, linux_server는 32bit, linux_server64는 64bit를 나타낸다.
자신의 리눅스에 맞는 파일을 리눅스에 복사한다.
그 후 터미널에서 ifconfig 명령어로 자신의 리눅스 IP를 알아내고, 복사한 파일을 실행한다.
호스트 컴퓨터에서 IDA를 실행시킨 뒤 Debugger -> Run -> Remote Linux debugger 선택 후
Application – 디버깅할 파일
Directory – 디버깅할 파일이 있는 폴더
Parameter – 전달할 파라미터
Hostname – 구한 리눅스 IP
Password –패스워드 지정했을 시 입력 (패스워드를 지정하려면 linux_server을 실행할 때 뒤에 인자로 “-P 패스워드” 로 넣으면 된다.)
Port – 리눅스에서 복사한 파일 실행했을 때 listening하고 있는 포트 번호
위를 설정한 후 OK를 누르면 remote debugging을 할 수 있다.