본문 바로가기

드림핵

[드림핵 Reverse Engineering] Stage 5


[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 다운로드

위의 링크에서 드림핵에서 제공하는 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하여 함수 내부로 진입할 수 있다.