나무모에 미러 (일반/어두운 화면)
최근 수정 시각 : 2024-03-29 01:00:15

IDA


파일:horizontal-logo-path-yk-wp.png
1. 개요2. 기능3. 디컴파일러4. 가격5. 기타

[clearfix]

1. 개요

공식 홈페이지

Interactive DisAssembler.

Hex-Rays SA에서 개발하여 판매중인 상용 디스어셈블러. 주로 리버스 엔지니어링을 위한 디버거로 이용된다.

매우 강력한 디스어셈블러로 평가받는데, 그 이유는 현존 디스어셈블러 중 손에 꼽을 만큼 매우 다양한 프로세서 및 파일 유형을 지원함은 물론, 사용자. 즉 리버서가 주도적으로 편하게 리버싱을 진행할 수 있다는 점에서 이름 그대로 사용자와 상호작용이 가능한 디스어셈블러이기 때문이다. 이 상호작용에는 막강한 해석 기능[1]과 더불어 자체적으로 지원하는 강력한 스크립팅 언어가 포함된다. 또한 이러한 강점을 세일즈 포인트로 삼고 있기도 하다.

또, IDA는 분석할 바이너리를 처음 로드하면, 바이너리 전체를 자동 분석하여 거대한 데이터베이스를 구축한다. 이 데이터베이스에는 바이너리 전체의 기계어 원본 및 자동 분석 결과물, 그리고 사용자가 작업하는 모든 내용이 이 데이터베이스에 저장된다. 즉 사용자가 분석 작업 중에 어떠한 일을 하더라도 원본 바이너리를 전혀 건드리지 않는다.

2. 기능

일단 가장 기본적인 기능들인 디스어셈블러, 디버거, 어셈블러, 헥스뷰 같은 기능들만 사용한다면 여타 디스어셈블러 또는 디버거들과 큰 차이는 없다. IDA를 제대로 활용하려면, IDA가 제공하는 코드 분석 기능과 더불어 프로그램 하나를 완전히 재구성하는 수준으로 지원하는 기능들을 모두 활용해야 한다. 세그먼테이션을 분리하거나 합치거나 타입을 변경하고, 구조체나 열거형을 추가하여 코드 분석에 용이하게 설정하고, 자동 분석의 방향을 직접 모두 지정할 수 있으며, 더 나아가 이 모든 과정을 IDA에서 지원하는 단순한 스크립팅 언어로 간단히 프로그래밍도 할 수 있다. 다시 말해, 디버깅 정보가 없는 프로그램을 디버깅 정보 데이터베이스(PDB)가 있는 것처럼 사용자가 만드는 것을 가능케 해준다는 의미. 프로그램 이름에 있는 상호 작용은 바로 이런 의미를 나타낸다.

IDA의 플러그인을 개발하기 위한 SDK가 제공되어 여러가지 플러그인을 개발할 수 있다. 악성코드들이 흔히 사용하는 더미다, VMProtect 등의 프로텍터들의 디버거 감지 기능을 우회하기 위한 TitanEngine을 사용할 수 있게 해주는 플러그인에서 시작하여 CodeXplorer 처럼 IDA의 기능을 확장시켜주는 공개 플러그인들도 나와있다.

상술한 것처럼, IDA는 매우 많은 프로세서와 파일 타입을 지원한다. 그러나 을 내는 만큼 지원하는 범위가 달라진다. 모든 기능을 사용하려면 Pro 버전을 구매하여 이용하여야 하지만, Home 버전으로도 자주 사용되는 프로세서 및 타입을 분석할 수 있다. 그러나 후술할 Hex-Rays 디컴파일러를 x86 타입에서 이용하려면 반드시 Pro 버전을 사용해야 한다.

디컴파일러도 필요 없고, 최신 버전도 필요 없고, 스크립팅 기능들도 필요 없고, 상용 목적(회사에서 사용 등)도 아니라면, 무료로 제공되는 약간의 구버전을 이용하는 방법도 있다. IDA 7.5가 최신 버전인 현재를 기준으로, IDA 7.0 버전이 무료로 제공되고 있다. 다만 x86, x64 프로세서만 지원되며, 윈도우 PE 포맷ELF 바이너리, Mach-O 형태의 바이너리만 지원된다는 단점이 있다.

이에 반해 IDA Pro는 매우 막강한 지원이 따라오는데, 당장 공식 홈페이지에 공개된 지원하는 파일 형식만 다음과 같다.

지원하는 프로세서 종류는 더욱 더 어마어마한데, 공식 홈페이지에서 그 목록을 확인해볼 수 있다. IDA Pro 하나면 매우 다양한 파일 형태와 프로세서 타입을 분석할 수 있기 때문에 가히 만능으로 불릴 만하다.

3. 디컴파일러

어셈블리 코드디컴파일 코드

push ebp
mov ebp, esp
push ebx
sub esp, 0Ch
mov ecx, word ptr [ebp+arg_0]
mov ebx, dword ptr [ebp+arg_0+4]
mov eax, ecx
mov edx, ebx
mov eax, edx
mov edx, eax
sar edx, 1Fh
sar eax, 1Fh
mov eax, edx
mov edx, 0
shr eax, 1Fh
add eax, ecx
adc edx, ebx
shrd eax, edx, 1
sar edx, 1
mov ebp+var_10], eax
mov [ebp+var_C], edx
mov eax, [ebp+var_10]
mov dx, [ebp+var_C]
shld edx, eax, 1
add eax, eax
sub ecx, eax
sbb ebx, edx
mov [ebp+var_10], ecx
mov [ebp+var_C], ebx
mov eax, ebp+var_10]
mov edx, [ebp+var_C]
add esp, 0Ch
pop ebx
pop bp
retn
int64 cdecl mod_ll(__int64 a1)
{
return a1 % 2;
}
#

Hex-Rays에서 직접 개발하여 판매중인 디스어셈블된 코드를 C언어 문법의 고급 언어로 디컴파일해주는 플러그인. 이 디컴파일러가 Hex-Rays SA의 핵심 매출원이다. 현재 x86, x64, ARM, MIPS, PowerPC 형태의 프로세서만 지원한다. 이 중 x86 32bit 디컴파일러를 사용하려면 반드시 IDA Pro 버전에서 사용해야 하며, Home 버전은 x64만 지원하고 ARM을 베타 서비스로 제공하고 있다. IDA의 여러가지 다양한 기능들을 다 사용하지 않더라도, 이 디컴파일러 하나만으로도 사실상 IDA Pro를 사용하는 주된 이유가 되기도 한다.

Ghidra, JEB나, x96dbg에서 사용 가능한 플러그인인 snowman에도 유사한 디컴파일 기능이 있으나, 여타 디컴파일러와는 비교할 수 없는 디컴파일 정확도와 안정성을 보인다. [7] 심지어 IDA SDK로 제작된 여러 유명 플러그인과 조합하면, 시너지는 배가 된다. 심지어 현재 진행형으로 계속 버전 업 되며 분석 성능이 개선되고 있다.

그러나 결국 디컴파일 플러그인은 어셈블리 해석을 보조하는 프로그램일 뿐, 어느 부분에서는 오히려 어셈블리 코드를 보고 해석하는 것이 더 나을 때도 종종 있다. 프로그램의 자동 분석이 잘못되어 스택 포인터가 어긋난 경우나, 프로텍터의 난독화로 인해 프로그램이 기계어를 잘못 해석하고 있을 때는 강력한 디컴파일 플러그인조차도 무용지물이다. 그럴 땐 직접 사용자가 해당 문제들을 직접 판단하며 IDA가 올바르게 분석을 수행할 수 있게끔 잡아주어야 하거나, 또는 아무리 정적 분석이 강력한 IDA라고 하더라도 동적 분석으로 넘어가는 수밖에 없다. 다시 말해 결국 이것조차도 제대로 쓰기 위해서는 IDA를 자유자재로 다룰 수 있는 기술 및 지식이 필요하다. 다시 말해 리버싱의 무안단물 수준의 만능은 아니라는 점.

4. 가격

이렇게 장점이 많은 디스어셈블러 도구지만, 단점은 바로 그놈의 가격. 프로그램 역분석에 거의 반드시 사용하게 될 x86 디컴파일러만 이용하려고 해도 무려 1000만원에 달하며, 다른 아키텍처에 여러가지 부가기능에 타 OS 대응까지 이것저것 다 추가하다보면 최대 1억 5000만원[8]이라는 정신나간 금액의 돈이 깨진다.(...) 게다가 한 번 산다고 끝나는게 아니라, 사후지원 비용으로 아키텍처 및 운영체제당 200만원씩 최대 5000만원이라는 돈이 또 매년마다 나간다.(...) 사실상 취미로 리버싱을 하는 사람이 소프트웨어 하나에 태우기에는 엄청나게 부담이 되는 가격인 것이 사실이다. 무엇보다도 애초에 취미로 리버싱을 하는 사람이 이런 툴을 사용할 필요 자체가 없다.(...)물론 그딴거 신경 안쓰고 그냥 일시불로 윈도우 리눅스 맥까지 전부 풀버전으로 질러버리는 용자도 없는 것은 아니다.(...)[9]라기엔 너무 비싼 것도 사실이기는 하다.(...)] 다만 실제 보안 업계에 종사하거나, 또는 그럴 예정이라면 반드시 필요한 필수 소프트웨어 중 하나이다. 이런 경우에는 무료 버전 또는 비교적 저렴한 Home 에디션[10]을 사용하여 배우는 것이 권장된다.

5. 기타


[1] 코드를 어떤식으로 디스어셈블러가 해석해야 할지 매우 세세한 부분까지도 사용자가 지정할 수 있다.[2] NE 및 LE(LX) 모두 DOS 기반, OS/2 등에서 실행되는 파일 형식 중 하나이다.[3] BIOS등 프로그래밍에 사용.[4] 모두 16비트 시대에 사용되던 구시대 유물들이다.[5] 물론 ZIP 파일 자체를 분석한다는 의미가 아니라, ZIP 형태로 압축된 아카이브 내의 바이너리를 압축해제를 거치지 않고서 바로 분석할 수 있다는 의미이다.[6] 아주 예전에 유닉스 계열에서 사용하던 실행파일 형태이다. Assembler Output의 줄임말. 현재 GCC 컴파일러 등에서, -o 플래그를 넣지 않고 컴파일을 돌릴 경우 나오는 기본 출력 파일에서 그 잔재를 확인할 수 있다.[7] 물론 단순한 파일에서는 다른 디컴파일러도 매우 우수한 성능을 보이나, IDA의 강점은 상호 작용이기에 제대로 분석되지 않는 일부 복잡한 형태의 어셈블리들을 사용자가 직접 프로그램의 분석을 제어하여 비교적 정확한 디컴파일 결과물을 낼 수 있게끔 지원하는 것이 IDA의 강점이다.[8] 이 돈이면 포르쉐 파나메라를 한 대 살 수 있다.(...)[9] 물론 이걸 돈지랄이라고 폄하할 수는 없다. 애초에 자기가 자기돈으로 자기가 공부하고 싶은 분야에 투자하겠다는데 거기다 대고 뭐라뭐라 할 수는 없지 않은가[10] 하지만 기능 제약이 매우 심하다.