본문 바로가기
# technic/- reversing

IDA 사용법

by ddddh 2020. 6. 30.

 

설치 후  바탕화면에 32비트, 64비트 바로가기 링크 파일 2개가 생겼을겁니다. 

분석하고자 하는 대상의 바이너리(파일)이 몇 비트 대상으로 컴파일 되었는지에 따라 결정되는 겁니다.

 

 

 

예를들면, 컴파일 시 위 처럼 x86 버전으로 빌드하였을 경우 ida 32비트 바로가기를 사용해 주시면 됩니다. (반대인 경우 x64)

대상 파일의 아키텍쳐를 모르신다면 그냥 x64로 열어보면 됩니다. (드래그앤드롭으로 바로가기 아이콘에 바이너리를 넣으시면 편합니다)

 

x86 아키텍쳐인 경우 "Portable executable for 80386 (PE)"라고 나옵니다.

 

x64 아키텍쳐인 경우입니다.

 

 

 

 

Ok 버튼을 누르고 대상 바이너리를 IDA로 열었을 때 왼쪽 "Function window" 창이 있습니다. "Function Window"에서 sub_XXXXXXXX으로 네이밍된 함수들은 IDA에서 자동으로 바이너리를 파싱해서 만들어준 겁니다.

대상 바이너리의 심볼이 살아있을 경우 함수 이름이 제작자가 네이밍한 이름으로 설정되지만 웬만해서는 심볼이 다 죽어있습니다... Win API들은 패턴기반으로 IDA에서 심볼을 살려줍니다! 그나마 다행이죠.

 

 

 

 

'''''' ! ! ! 

대상 바이너리 크기가 클 경우 파싱하는데 시간이 좀 걸릴 수 있습니다. 왼쪽 하단에 숫자 같은게 올라가거나 하면 파싱 중이니 잠시 기다려주세요.

'''''' ! ! !

 

 

 

자! 이제부터 시작입니다.

IDA의 hex-ray가 임의 코드(Pseudocode)를 지원해주지만 분석하고자 하는 함수를 찾지 못하면 쓸모가 없죠.

 

지금 Function Window 창의 "start"가 프로그램이 시작될 때, 메모리에 올라올 때 제일 처음 실행되는 진입점이라고 보시면 됩니다. 하지만 보통 여기를 분석하실 필요는 없으십니다.

해당 start 부분은 프로그램이 메모리에 올라와서 정상적으로 실행이 되도록  이니셜라이징 하는 부분이기 때문입니다. 즉, 개발자가 직접 건드리는 부분이 아니게 때문에 굳이 볼 필요는 없다 이 말이죠.

 

그렇다면 이제 Main 함수는 어디서 실행되는가 궁금하실 겁니다. 이 부분은 start를 잘 살펴보면 알아낼 수 있습니다. 

 

 

    --->

 

start 를 잘 살피어 보면 보시는 바와 같이 call, call, call, call, 을 연속으로 하며 인자를 레지스터에 담아(x64 기준 기본 인자 전달방법 __fastcall ) 메인 함수를 호출하는 부분이 보입니다. 

사실 지금 심볼이 살아있어서 __p__argc, __p__argv라는 함수명이 제대로 보이는거라 실전은 더 어려울 수 있으며, x86 architecture일 경우 push로 인자를 전달하기 때문에 위 사진과 다소 차이가 있을 수 있습니다. 

 

음.. 사실 컴파일러 및 버전, 사용한 언어 등에 따라 start 부분에서 main 함수로 까지 등 다소 많이 차이가 나서 원하는 핵심 루틴은 찾기 매우 어려울 겁니다. 경험이 필요한거죠...

 

 

그래서 야매[?]가 조금 필요합니다. IDA에서 Ctrl + 1 을 누르시면 Quick View 창이 뜰겁니다.

 

 

 

여기서 Strings를 눌러주십시오. 바이너리 내의 문자열을 탐색해 주는 기능입니다.

 

 

 

여기서 Setup... 을 눌러주신 후 탐색할 스트링 타입에 전부 v 해주면 됩니다... 그 후 다시 재탐색 될 때 까지 기다리시면 됩니다.

 

 

 

 

느낌있게 생긴 원하는 문자열이 보이면 더블 클릭을 해줍니다. 더블 클릭시  IDA View 창으로 넘어갈 수도, Hex View 창으로 넘어갈 수도 있습니다. 이전에 어떤 창에 있었느냐에 따라 다르지만 Default로 IDA View 창으로 넘어가집니다.

 

IDA View 창으로 넘어가졌을 경우 IDA가 미리 문자열을 네이밍 시켜놨습니다. "aKey0x08x"

저 네이밍된 변수?를 클릭 후 x를 누르시면 External Reference 기능을 이용할 수 있습니다.  w000w

IDA의 강력한 기능 중 하나인 외부참조 기능입니다. 어디서 이 문자열을 사용하는지 알 수 있는거죠.

문자열 외의 전역변수들도, 지역변수들도 (함수내에서만) 가능한 기능입니다.

자 이제 OK 버튼을 누를경우 사용되는 곳으로 이동이 됩니다.

 

 

 

 

이제 나왔습니다... 제일 필요하고 원하는 기능 Hex-ray ... tab 키나 f5를 눌러주시면 됩니다.

 

 

 

짠, IDA Hex-ray에서 임의코드를 주었습니다. 실망하실 수 있지만 사람이 어느정도 분석할 정도는 됩니다.

 

 

현존하는 C/CPP 디컴파일러 중 가장 강력한 툴이 hex-ray라서 다른 툴을 찾으셔도 더 안좋거나 만족스럽지 못하실겁니다.

또한, Hex-ray는 함수만을 디컴파일 할 수 있습니다. 즉, 함수 영역이 존재하는, 함수만의 Stack Frame이 할당되는 곳만 가능합니다.

 

함수 프롤로그 / 에필로그 부분을 예를들어 보겠습니다.

push ebp            // 이전 함수의 stack base pointer backup

mov ebp, esp     // 스택 최상단(esp)을 새로운 stack base pointer로 할당. (새로운 함수영역을 할당하겠다는 의미)

sub esp, 0x40    // 이 함수에서는 0x40만큼의 스택 공간이 필요함. (함수 공간 확장)

.

.

.

.

.

leave                    // 호출되기전의 base pointer로 복귀.

ret                         // 호출되기전 다음 주소로 이동 (계속하여 진행)

 

에필로그는 언어, 함수, 컴파일러 최적화 옵션 등 마다 달라지긴 하지만 이렇게 함수가 시작되어서 정상적으로 끝 마쳐 져야지 hex-ray가 디컴파일을 할  수 있게됩니다.

이것또한 hex-ray의 한계라고 볼 수 있죠..

 

 

 

물론 여러가지 방법?을 통해서 분석을 할 수 있긴합니다만... 역시 상황에 따라 다르기 때문에 그 상황에 놓여 봐야지만 알 수 있을것 같네요.

 

 

도움이 되셨기를!!!!

'# technic > - reversing' 카테고리의 다른 글

PostScript  (1) 2020.02.05
kakaotalk pc - 취약점 분석  (0) 2019.07.14
백신 분석 보고서. - 1 -  (0) 2018.10.20
z3 모든 경우의 수  (0) 2018.09.30
ARM 32bit  (0) 2018.09.29