[Stage 5] Tools: IDA
#IDA #디스어셈블러 #디버거 #디컴파일러
- IDA(The Interactive Disassembler) : Hex-Rays사에서 제작한 디스어셈블러. 디스어셈블 기능 외에도 여러 환경에서의 디버깅, 다양한 아키텍처 디컴파일 등의 여러 기능 제공.
- IDA Freeware 설치 : https://hex-rays.com/ida-free/
- IDA 파일 열기 : File > Open > 파일 선택 또는 drag and drop
- IDA 둘러보기
Function Window : IDA에서 분석한 함수 목록 나열. Ctrl+F 로 함수 찾기 가능
Graph Overview : 함수의 흐름을 파악할 수 있게 함수를 그래프화하여 보여줌
Output Window : IDA가 처리하고 있는 분석 과정을 메시지로 출력.
View : 디컴파일 결과, Hex-View, 구조체 목록 등의 화면 표시
- IDA의 기능
임의 주소 및 레이블 이동 : 단축키 G
함수 및 변수 이름 재설정 : 단축키 N
Cross Reference(Xref) : 임의의 함수 또는 변수 클릭 후 단축키 X
함수 및 변수 타입 변경 : 임의의 함수 또는 변수 클릭 후 단축키 Y
Strings(바이너리에서 사용하는 문자열 조회) : 단축키 Shift + F12
Decompile : 어셈블리를 C언어로 변환
[Stage 5] Exercise: Helloworld
#IDA #정적분석 #동적분석
위의 링크에서 드림핵에서 제공하는 HelloWorld.exe를 다운로드한다.
- 정적 분석
IDA를 실행하고 HelloWorld.exe를 열면 위와 같은 창이 나타난다.
변경사항 없이 OK를 클릭한다.
main 함수를 찾는 것을 목적으로
IDA에서 제공하는 다양한 기능을 활용해 정적분석을 진행해본다.
<기능1. 문자열 검색>
프로그래머가 프로그램을 작성할 때 여러 문자열을 포함시키는데,
이 문자열이 프로그램을 파악하는데 함수의 이름과 인자 등의 유용한 정보를 제공하는 경우가 많다.
HelloWorld.exe에서 문자열을 검색해보자.
파일이 열린 화면에서 Shift+F12 를 누른다.
스크롤을 내리다보면 Hello, world!\n 문자열을 찾을 수 있다.
해당 줄을 더블클릭한다.
어셈블리 코드창에서 해당 문자열이 있는 명령어줄을 찾을 수 있다.
필요에 따라 breakpoint 등을 걸어 디버깅에 활용할 수 있다.
<기능2. 상호참조(Cross Reference, XRef)>
정적 분석을 하다가 중요해보이는 어떤 함수나 값을 찾았을 때, 이를 참조하는 함수를 분석할 수 있다.
aHelloWorld를 클릭하고 상호참조 단축키 x를 누른다.
xrefs 창이 뜬다.
선택한 변수를 참조하는 모든 함수를 보여준다.
항목을 더블클릭한다.
aHelloWorld를 참조하는 함수 main 함수를 찾았다.
<기능3. 디컴파일>
함수를 찾은 상태에서 F5를 누르면 디컴파일이 진행된다.
1. 인자 분석
IDA는 main 함수가 argc, argv, envp 3개의 인자를 받는다고 해석했다.
2. 동작
(1) Sleep() 함수를 호출하여 1초 대기
(2) qword_14001DBE0 주소에 "Hello, world!\n" 문자열의 주소를 저장
*qword_14001DBE0는 data 영역에 위치한다.
*"Hello, world!\n"문자열은 rodata 영역에 위치한다.
(3) sub_140001060에 "Hello, world!\n" 문자열을 인자로 전달하여 호출
*sub_140001060함수는 printf 함수이다.
(4) 0을 반환
3. 반환값
0
- 동적 분석
동적 분석으로 파일을 실행해보며 정적 분석이 정확했는지 확인하고, 함수 호출 규약을 살펴본다.
main함수 시작부분에서 F2를 눌러 breakpoint를 설정한다.
상단 메뉴에서 Debugger > Start process 또는 F9 를 눌러 디버깅을 시작한다.
breakpoint를 건 지점까지 프로그램이 실행된다.
main함수의 시작부분에 프로그램의 실행이 멈춰있다.
F8를 눌러 Step Over 한다.
명령어가 한 줄씩 실행됨에 따라
General registers 창의 레지스터값, Hex View-1 창의 헥스값, Stack view 창의 값이 변하는 것을 살펴보며 동작을 분석한다.
call 명령어와 같이 함수를 호출하는 부분에서
F7을 누르면 Step into하여 함수 내부로 진입할 수 있다.
'드림핵' 카테고리의 다른 글
[드림핵 워게임] rev-basic-1 (0) | 2023.11.21 |
---|---|
[드림핵 워게임] rev-basic-0 (1) | 2023.11.21 |
[드림핵 Reverse Engineering] Stage 4 (0) | 2023.11.07 |
[드림핵 Reverse Engineering] Stage 3 (0) | 2023.09.20 |
[드림핵 Reverse Engineering] Stage 1,2 (0) | 2023.09.14 |