CS/소프트웨어보안

3. IDA 활용 및 리버싱 방법

arsenic-dev 2025. 10. 13. 03:52

경희대학교 장대희 교수님의 소프트웨어보안 수업을 기반으로 정리한 글입니다.

 

Reverse Engineering (역공학)

리버스 엔지니어링이란, 완성품의 설계도 없이 이미 만들어진 소프트웨어나 제품을 다시 뜯어 파헤치는 개념이다. (개발의 역과정)

이 과정에서, 문제가 없었는지를 찾아볼 수 있기에 보안에 있어서 중요하다.

 

보안 분야에서의 Reversing (바이너리 -> 어셈블리 -> pseudocode로 재현)

  • 1. 바이너리 취약점 분석 용도
  • 2. 컴파일이 잘 되었는지 확인하는 용도

 

정적 분석

파일의 외적인 모습을 분석하는 방법으로, 파일을 실행하지는 않고 그냥 열어서 분석하는 것이다. (e.g., IDA)

 

장점

  • 프로그램의 전체 구조를 파악하기 쉬움
  • 분석 환경의 제약에서도 비교적 자유로움
  • 바이러스와 같은 악성 프로그램의 위협으로부터 안전함
    • 동적 분석할 경우 바이러스를 실제로 실행해야 하므로 컴퓨터가 감염될 우려가 있음

 

단점

  • 프로그램이 난독화(Obfuscation)가 적용되면 분석이 매우 어려움 (파일을 여는 건 쉬운데, 이해는 어려운 이유)
  • 다양한 동적 요소를 고려하기 어려움

 

동적 분석

파일을 직접 실행해 보면서 동작하는 것을 분석하는 것이다. (e.g., x64dug)

 

장점

  • 코드를 자세히 분석해 보지 않고도 프로그램의 개략적인 동작을 파악할 수 있음

 

단점

  • 분석 환경을 구축하기 어려움
  • 자신이 디버깅 당하고 있는지 검사하고, 디버깅 중이면 프로그램을 강제로 종료시키는 안티 디버깅 기법이 존재

 

IDA 활용 방법

IDA는 Interative Disassembler의 약자로, 바이너리를 분석해야 하는 리버스 엔지니어링 시 사용된다.

IDA

 

Functions window

: IDA에서 분석한 프로그램의 함수를 나열

해당 창에서 Ctrl+F 단축키를 통해 원하는 함수를 찾을 수 있음

 

Graph overview

: 함수를 그래프화하여 사용자에게 보여줌

해당 창을 통해 함수의 흐름을 파악할 수 있음

 

graph overview에서 스페이스바를 누르면 나오는 창

 

Output window

: 분석 과정을 메시지로 출력함

해당 창을 통해 IDA의 분석 과정을 알 수 있음

 

View

: 디컴파일 결과, Hex-View, 구조체 목록 등의 화면을 표시함

 

임의 주소 및 레이블 이동

: 단축키 G를 사용해 임의 주소 또는 레이블로 이동할 수 있음

 

함수 및 변수 이름 재설정

: 단축키 N을 사용해 함수 및 변수 이름을 재설정할 수 있음

정의되지 않은 함수 및 변수의 경우 해당 기능을 통해 이름을 설정하여 분석 속도를 향상시킬 수 있음

 

Cross reference (Xref)

: 임의의 함수 또는 변수를 클릭하고, 단축키 X를 사용하면 해당 함수 및 변수가 사용되는 영역을 재참조할 수 있음

 

함수 및 변수 타입 변경

: 임의의 함수 및 변수를 클릭하고, 단축키 Y를 사용하면 해당 함수 및 변수의 타입을 지정할 수 있음

함수의 경우, 전달되는 매개 변수를 추가하거나, 타입을 변경할 수 있음

 

Strings

: 단축키 shift+F12를 사용해 바이너리에서 사용하는 모든 문자열을 조회할 수 있음

함수의 심볼이 존재하지 않거나, 복잡할 경우 문자열을 통해 분석 시간을 크게 단축할 수 있음

 

실제 프로그램  분석 시, 표면적으로 알 수 있는 것은 해당 프로그램에서 나온 string 뿐이기에, 

이러한 string을 앵커로 사용해, 이를 토대로 전후를 비교한다. (x를 눌러 해당 string 호출하는 부분 확인하며 역추적)

 

Decompile

: IDA에서 제공하는 가장 강력한 기능으로, 어셈블리를 C언어 형태로 변환하여 보여줌 (단축키 F5 or Tab)

 

숫자에서 문자로 변환

: 조건문에서 비교하는 각 숫자는 문자와 1대 1로 대응되는 아스키 코드로 변환할 수 있음 (숫자 -> 문자 변환 단축키 'r')

각 숫자에 커서를 올리고 'r'을 누르면 숫자에서 문자로 변환하는 것이 가능

 

Exercise: IDA 사용하여 HelloWorld 프로그램 분석

▶ IDA를 시작하면 보이는 화면

  • New: 새로운 파일을 엶
  • Go: 로딩 절차를 끝내고 비어 있는 워크스페이스를 시작
  • Previous: 최근에 사용한 파일을 열 수 있음

 

▶ 파일 로딩

  • 파일의 특징 등을 설정하는 창
  • 보통 IDA가 해석한 정보로 설정
  • 파일 타입
    • 파일을 열면 파일 타입을 선택하라고 뜸
    • 위 이미지의 목록은 IDA 로더가 가장 적합하다고 생각한 파일을 보여준 것

 

▶ 파일 로딩

  • Processor type
    • 디스어셈블을 수행한 프로세서 모듈
    • 기계어를 어떤 CPU를 기준으로 해석할 것인지 결정

 

▶ 파일 로딩

  • Kernel Options
    • 디스어셈블리 옵션을 건드릴 수 있음
    • 보통은 기본이 가장 알맞음
  • Processor Options
    • 프로세서 모듈에 적용할 옵션을 수정할 수 있음
  • Options
    • 프로그램을 분석할 때 넣을 각종 옵션

 

정적 분석

start: linux에서의 entry point

entry point: 프로그램이 메모리에 올라오면 CPU에서 패치를 해 하나씩 읽는데, 이때 처음 실행하는 코드

 

 

check string 하는 함수

 

string인 이유: sting 끝에 null이 오는데, 이 함수가 마지막이 0인지 비교하기 때문에 스트링이라고 볼 수 있음

동적 분석

 

동적 분석의 핵심: 브레이크 포인트

 

동적 분석은 IDA 보다 리눅스에서 사용하는 디버거인 GDB가 좋다.

 

'CS > 소프트웨어보안' 카테고리의 다른 글

5-1. 소프트웨어 보안을 위한 리눅스 기초  (0) 2025.10.17
4-3. 어셈블리 실습  (0) 2025.10.17
4-2. GDB 실습  (0) 2025.10.15
4-1. 메모리 구조  (0) 2025.10.15
1. 소프트웨어 보안이슈 소개  (0) 2025.10.12