경희대학교 장대희 교수님의 소프트웨어보안 수업을 기반으로 정리한 글입니다.
Reverse Engineering (역공학)
리버스 엔지니어링이란, 완성품의 설계도 없이 이미 만들어진 소프트웨어나 제품을 다시 뜯어 파헤치는 개념이다. (개발의 역과정)
이 과정에서, 문제가 없었는지를 찾아볼 수 있기에 보안에 있어서 중요하다.
보안 분야에서의 Reversing (바이너리 -> 어셈블리 -> pseudocode로 재현)
- 1. 바이너리 취약점 분석 용도
- 2. 컴파일이 잘 되었는지 확인하는 용도
정적 분석
파일의 외적인 모습을 분석하는 방법으로, 파일을 실행하지는 않고 그냥 열어서 분석하는 것이다. (e.g., IDA)
장점
- 프로그램의 전체 구조를 파악하기 쉬움
- 분석 환경의 제약에서도 비교적 자유로움
- 바이러스와 같은 악성 프로그램의 위협으로부터 안전함
- 동적 분석할 경우 바이러스를 실제로 실행해야 하므로 컴퓨터가 감염될 우려가 있음
단점
- 프로그램이 난독화(Obfuscation)가 적용되면 분석이 매우 어려움 (파일을 여는 건 쉬운데, 이해는 어려운 이유)
- 다양한 동적 요소를 고려하기 어려움
동적 분석
파일을 직접 실행해 보면서 동작하는 것을 분석하는 것이다. (e.g., x64dug)
장점
- 코드를 자세히 분석해 보지 않고도 프로그램의 개략적인 동작을 파악할 수 있음
단점
- 분석 환경을 구축하기 어려움
- 자신이 디버깅 당하고 있는지 검사하고, 디버깅 중이면 프로그램을 강제로 종료시키는 안티 디버깅 기법이 존재
IDA 활용 방법
IDA는 Interative Disassembler의 약자로, 바이너리를 분석해야 하는 리버스 엔지니어링 시 사용된다.

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

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


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

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')

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

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

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

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

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

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









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 |