리버스 엔지니어링의 모든 단계: 문자열 분석부터 제로데이 취약점 탐색까지
Every Level of Reverse Engineering Explained by Low Level
이 영상은 프로그래머나 멀웨어 분석가가 프로그램의 내부 동작을 파악하기 위해 필수적으로 갖춰야 할 리버스 엔지니어링(Reverse Engineering, RE) 기술을 5단계 레벨로 나누어 상세히 설명합니다. 단순한 문자열 추출부터 정적/동적 분석, 수학적 기법을 이용한 심볼릭 실행, 그리고 실제 하드웨어의 펌웨어를 분석하여 취약점을 찾는 실전 사례까지 체계적으로 다룹니다.
-
레벨 1: 문자열 분석 (Strings)
- 바이너리 파일 내에 포함된 인간이 읽을 수 있는 텍스트(문자열)를 추출하여 프로그램의 기능을 유추하는 가장 기본적인 단계입니다.
- 리눅스의
strings유틸리티를 사용하며, 보통 10글자 이상의 긴 문자열을 검색할 때 유용한 정보를 많이 얻을 수 있습니다. - 화웨이(Huawei) 장비를 공격하는 멀웨어 사례: HTTP POST 요청, 인증 필드, 특정 IP 주소(118.172.102.14) 호출 등의 문자열을 통해 해당 프로그램이 명령 주입(Command Injection) 취약점을 이용해 추가적인 바이너리를 다운로드하는 기능을 수행함을 파악할 수 있습니다.
-
레벨 2: 정적 분석 (Static Analysis)
- 프로그램을 실행하지 않고 코드의 구조와 로직을 분석하는 단계입니다.
object dump를 통해 CPU가 실행하는 기계어인 어셈블리(Assembly) 코드를 확인하며, 이는 인간의 의도(C 언어 등)가 기계의 명령어로 변환된 최종 형태입니다.- IDA Pro나 기드라(Ghidra) 같은 도구를 사용하면 복잡한 어셈블리를 더 읽기 쉬운 '의사 C 코드(Pseudo C)'로 변환(Lifting)하여 분석 효율을 높일 수 있습니다.
- 예제 프로그램 분석: 'is_correct'라는 변수가 조건문에 따라 어떻게 변하는지 추적하고, 사용자 입력이 특정 버퍼와 비교되는 루프 로직을 파악하여 암호를 유추합니다.
-
레벨 3: 동적 분석 (Dynamic Analysis)
- 프로그램을 실제로 실행하면서 메모리 상태와 레지스터의 변화를 실시간으로 관찰하는 단계입니다.
- GDB(GNU Debugger)와 같은 디버거를 사용하여 특정 위치에 중단점(Breakpoint)을 설정하고 CPU의 동작을 멈추게 할 수 있습니다.
- 복잡한 수학 연산이 포함된 암호 확인 프로그램의 경우, 정적으로 계산하는 대신 프로그램이 연산을 마친 직후 메모리(스택)에 저장된 정답 값을 직접 확인하는 전략이 유용합니다.
- GEF(GDB Enhanced Features)를 활용해 스택 프레임을 시각화하여 8글자 길이의 정답 암호("crack me")를 동적으로 찾아내는 과정을 보여줍니다.
-
레벨 4: 심볼릭 실행 (Symbolic Execution)
- 프로그램을 수학적 문제로 변환하여 특정 실행 경로에 도달하기 위한 입력값을 계산하는 고급 기법입니다.
- 입력값을 구체적인 숫자가 아닌 '심볼(기호)'로 처리하고, 만족도 해결사(SAT Solver)를 이용해 "성공 메시지가 출력되는 경로로 가기 위한 x의 조건"을 산출합니다.
- 파이썬 라이브러리인 'Anger'를 사용하여 복잡한 기차 관련 퀴즈 프로그램(Engine)의 정답을 자동으로 찾아냅니다.
- '경로 폭발(Path Explosion)' 문제: 프로그램이 너무 복잡하면 가능한 상태의 수가 기하급수적으로 늘어나 자원을 고갈시키므로, 입력값을 출력 가능한 문자(ASCII)로 제한하는 등의 제약 조건을 추가하여 연산 효율을 높여야 합니다.
-
레벨 5: 실전 소프트웨어 취약점 탐색 (Finding Real Bugs)
- 실제 하드웨어 장치의 소프트웨어를 리버스 엔지니어링하여 보안 결함을 찾는 단계입니다.
- 테무(Temu)에서 구매한 저가형 와이파이 리피터 사례: 장치에서 펌웨어 바이너리(
full.bin)를 추출합니다. binwalk도구를 사용하여 펌웨어 내부에 숨겨진 파일 시스템(Squashfs)을 재귀적으로 추출하고 리눅스 루트 디렉토리 구조를 복원합니다./etc/init.d/등의 시작 스크립트를 분석하여 주 서비스인commuos바이너리를 식별하고, 이를 기드라로 분석하여strcpy와 같은 취약한 함수 사용처나 제로데이(Zero-day) 취약점의 가능성을 조사합니다.
토픽:
프로그래밍