본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

디스어셈블러(Disassembler, 역어셈블러)는 기계어로 된 실행 파일을 사람이 읽을 수 있는 어셈블리 명령어로 되돌려 보여 주는 프로그램이다. 이 작업을 디스어셈블(역어셈블)이라 한다.

어셈블러가 어셈블리어를 기계어로 바꾸는 것과 반대 방향의 일을 한다. 원시 코드가 없는 프로그램이 무엇을 하는지 알아내는 역공학과 악성코드 분석에서 가장 먼저 쓰는 도구이고, 프로그램을 실행하지 않고 코드를 읽으므로 정적 분석 도구에 속한다.

기계어에는 변수 이름·주석·자료형 같은 정보가 남아 있지 않아, 디스어셈블한 결과는 주소와 레지스터로 된 명령어 나열이다. 분석가는 여기에 함수 이름과 주석을 붙여 가며 흐름을 읽는다.

비슷한 도구와의 구분

편집 원본 편집
도구 하는 일 분석 방식
디스어셈블러 기계어를 어셈블리 명령어로 되돌린다 정적
디컴파일러 기계어나 바이트코드를 C·자바 같은 고급 언어 형태로 되살린다 정적
디버거 프로그램을 실제로 실행하면서 한 명령씩 멈추고 레지스터·메모리 값을 본다 동적
언패커 실행 압축된 파일에서 원래 코드를 풀어낸다 → 패커 분석 준비
  • 선형 스윕(Linear Sweep) : 코드 영역의 처음부터 끝까지 명령어를 차례로 해석한다. 단순하지만 코드 사이에 끼운 데이터를 명령어로 잘못 읽는다
  • 재귀 하강(Recursive Traversal) : 분기·호출을 따라가며 실제로 실행될 경로만 해석한다. 데이터 오인은 줄지만 간접 점프의 목적지를 놓칠 수 있다

대표적인 도구로 IDA, Ghidra, objdump, radare2 가 있다. 많은 도구가 디스어셈블과 디컴파일을 함께 한다.

분석을 방해하는 기법

편집 원본 편집

악성코드 제작자는 디스어셈블한 결과를 읽기 어렵게 만든다.

  • 난독화 : 무의미한 코드를 끼워 넣고 실행 순서를 뒤섞어(제어 흐름 평탄화, 불투명 술어) 흐름을 알아보기 어렵게 한다
  • 패킹 : 원래 코드를 압축·암호화해 두어 파일을 디스어셈블해도 풀기 루틴만 보이게 한다. 먼저 언패킹해야 한다
  • 디스어셈블러 속이기 : 명령어 중간으로 점프하는 코드를 넣어 선형 스윕이 엉뚱한 명령어를 만들게 한다
  • 안티 디버깅 : 디버거가 붙어 있으면 다르게 동작하게 해 동적 분석을 막는다