[리뷰] 리버스 엔지니어링 기드라 실전 가이드
in Review on Review, Book, 리버스엔지니어링, 기드라, 확장, 백도어, 크랙미, 멀웨어, 안드로이드, 앱, 스크립트
한빛미디어
출판사의"리버스 엔지니어링 기드라 실전 가이드(나카지마 쇼타 외 3명 저/이창선 역 외 1명)"
를 읽고 작성한 리뷰입니다.
미국 국가안보국(NSA)이 개발한 소프트웨어 리버스 엔지니어링 도구인
기드라(Ghidra)
를 활용하여 멀웨어와 유사한 프로그램을 실전과 동일하게 정적 분석하는 책이다.
기드라는 소프트웨어 리버스 엔지니어링 도구이다. 그렇기에 먼저 리버스 엔지니어링
의 개념이 무엇인지 알 필요가 있다. 이는 쉽게 말해 실행할 수 있는 바이너리 프로그램의 원본 소스를 복원하는 과정이라 보면 된다.
아래 그림이 이를 잘 설명하고 있는데 실행 파일의 헥스 코드를 이용하여 원본 소스코드를 추적하는 과정으로 이해할 수 있다.
복원한 결과물이 어셈블리어일 경우 디스어셈블
이라 칭하고, C언어와 같은 고수준 언어로 복원 시 디컴파일
이라 칭하는 차이가 있을 뿐 결국은 인간이 이해할 수 있는 언어로 복원하는 과정이다.
그럼에도 본 도서에서 언급한 바와 같이 함수명이나 변수명과 같은 심벌, 주석, 컴파일러에 의한 자동 최적화 등의 문제로 완벽한 복원은 불가능에 가깝다.
특히 5장부터 등장하는 OS별 실전 문제를 진행하다보면 정말 건초더미에서 바늘 하나 찾는 느낌의 지루함이 반복되기에 끈기와 인내심이 필요하다는 것을 알 수 있다.
기드라에 익숙하지 않았음에도 사람의 노가다를 기드라가 얼마나 크게 줄여주는지 실습을 따라하며 알 수 있었다. 아래 그림과 같이 기드라의 그래프 뷰
기능 하나만 봐도 if문의 디스어셈블 결과를 입체적으로 볼 수 있어 가독성에 큰 도움이 된다.
1장은 리버스 엔지니어링에 필요한 기초 지식
이 정리되어 있다. 제어부, ALU, 레지스터, 명령포인터로 구성된 CPU의 기본 구조, 그 과정에서 활용되는 코드, 데이터, 헤더, 힙, 스택 등의 메모리 세부 구조, 호출규약 등의 기본 지식을 익힌다.
이어서 언어의 특성
기본을 배운다. 함수 호출, if, switch, for, while 등의 규약을 살펴보며 간단한 디컴파일의 과정을 거친다. 또한 OS와 칩셋 간 x64 등의 아키텍쳐를 학습한다.
기드라 본래의 기능에 집중하기 위해 이러한 백그라운드 지식은 짧게 서술되어 있지만 기드라 실전에 적용 시 큰 도움이 되므로 확실히 알아두는 것이 좋다. 예를 들면 뒷 부분의 main() 함수를 찾아내는 방법에서 경우의 수를 쉽게 줄일 수 있다.
이런 방법은 풍부한 경험을 통해 쌓이기도 하지만 1장의 기본 지식이나 규약을 잘 익혀두면 처음 겪는 문제나 패턴에서도 원하는 부분을 찾아내기에 좋은 감각을 유지 할 수 있겠다는 생각이 들었다.
2장은 기드라의 세부 구성
을 살핀다. 디스어셈블, 디컴파일은 물론 헤더, 라이브러리, 스크립트 분석 등의 기능이 제공된다. 먼저 기드라를 설치하는 방법이 소개된 후 실행 파일을 임포트한다. 분석 실행을 마치면 아래아 같은 화면이 등장하는데 기드라에서 가장 자주 보게 되는 화면이다.
책에서 소개되는 몇가지 권장설정은 그대로 따라하면 된다. 이후 위 그림의 각 기능을 세부적으로 소개하는데 중앙의 Listing 창에는 디스 어셈블한 결과가 표시되며 디컴파일러 창에는 C언어로 변환된 결과가 표시된다.
Program trees 창에는 헤더나 섹션 등 프로그램 구성요소가 구조화되어 출력되며, Symbol Trees 창에는 함수명, 변수명 등의 심벌 정보가 표시된다. Data Type Manager창에는 데이터 타입에 관련된 정보가 출력된다.
각 기능은 읽어도 어떻게 활용하는 것인지 구체적으로 어떻게 동작하는지 파악하기 어렵기 때문에 5장과 같은 실전 예제를 진행한 후 다시 볼 것을 권하고 싶다.
본래 레퍼런스라는 것들은 직접 겪어보며 필요할 때마다 참조하는 것이 기억에도 오래남고 바로바로 이해되는 것이니 이 장에서 개념이 어렵다고 읽기를 포기하지 않길 바란다.
3장에서는 downloader.exe라는 외부에서 타 프로그램을 다운로드하여 실행하는 프로그램을 리버싱한다. 그런데 이 부분 역시 리버싱의 큰 그림
은 그려지지만 구체적으로 실습을 따라가기 어려웠다. 가볍게 읽어보고 5장 이후의 실전을 전개하고 다시 돌어와서 보면 쉽게 이해된다.
4장 역시 바로 이해하기는 어렵다. 분석 자동화 기능을 제공하는 Script
라는 기능과 UI플러그인을 활용하여 분석 기능을 추가할 수 있는 Extension
기능이 소개된다. Scritps의 기능엔 Python 바인딩 기능도 제공하고 있다는 점이 특이한 부분이다.
5장 이후에는 각 OS별로 실전 러비싱이 진행되는 데 매우 상세하게 분석하고 있어 따라하다보면 감이 잡힌다. 앞의 1 ~ 4장은 가볍게 큰 그림만 그려본다 생각하며 읽고 개념이 어느정도 잡히면 5 ~ 9장을 가급적 먼저
실습해 볼 것을 권한다.
예를 들면 5장은 리눅스에서 구동되는 ELF
바이너리를 분석한다. 예제로 크랙미
라는 실행파일이 등장하는데 리버싱에 성공하면 엑세스 코드나 비밀번호를 찾아낼 수 있다.
이 프로그램을 실행하면 패스워드를 입력하라고 나오는데 아무 문자가 입력하면 Wrong이라고 틀렸다는 메시자 출력되는 프로그램이다. 결국 이 프로그램을 리버싱하여 정확한 패스워드를 알아내는 것이 본 리버싱 예제의 목적이라고 할 수 있다.
이 프로그램의 main() 함수를 디컴파일하면 아래 그림과 같은 리버싱 결과를 볼 수 있다. 25행에서 fgets()가 사용됨을 확인 가능하다. 위에서 설명한 사용자가 패스워드를 입력하면 fgets() 함수로 입력값을 가져와 변수에 저장하게 됨을 추측할 수 있다.
34행에는 비교문이 등장한다. 사용자가 입력한 값은 local_38 변수에 저장되고 local_68에 들어있는 값과 비교하는 셈이다. 그런데 자세히 보면 사용자의 입력값이 ^연산을 거친다. 즉, 0x7a값과 한글자씩 XOR 연산을 수행하는 것이다. 결과가 같다면 Correct라는 문자열을 출력하는 구조이다.
결국 핵심은 XOR 역연산
에 달려 있음을 알 수 있다. 책에서는 2가지 방법을 활용하여 역연산에 도전한다. 솔버라는 기드라 Script를 활용하는 방법 하나와 CyberChef라는 GUI기반 웹애플리케이션을 활용하여 패스워드를 찾아내는 방법이 소개된다.
그렇게 얻은 패스워드로 Level2에 도전하며 Level4까지 진행하는 실습을 거치게 된다. 이어서 6장 이후에는 윈도우 운영체제의 PX파일, 안드로이드 APK파일 및 패킹 등을 풀어내는 방법들이 소개되는데 한 과정씩 따라하다보면 쉽고 재미있게 저자들의 풍부한 경험을 흡수할 수 있다.
본 도서의 장점을 정리하면 다음과 같다.
매우 실전적이다.
리버싱에 관심이 많아 서점에서 찾다보면 개념이나 방법론만 늘어놓은 책들이 부지기수이다. 대충 내용은 알겠는데 다 읽어도 프로그램 간단한 것 하나도 리버싱 할 수 없다. 반면 이 책은 따라만 해도 감이 오며 저자들이 그간 경험했던풍부한 경험
을 거저 먹는 느낌이 든다.기드라의 기능이 매우 풍부하다.
구성된 GUI 자체만으로도 다 활용해보기 힘들 정도의 다양한 기능이 제공되는데 이것도 모자라 Script나 Extension 기능도 제공되며 관련 서드파티로 연동할 수 있는 프로그램도 풍부하다. 약 20년 전 즈음 소프트아이스라는 툴을 이용해 헥스코드로 일일이 수정하며 게임 머니를 올리려고 노력하며 진땀 흘렸던 것을 생각하면 기드라는 천상의 툴이라고 극찬할만 하다.주로 디컴파일의 기능을 활용하여 설명한다.
C언어가 제아무리 어렵다고 한들 어셈블리어에 비하면 천국이다. 어셈블리 프로그래밍은 해 본 사람이라면 알겠지만 한정된 레지스터 안에 어떤 값이 존재할지 머리가 기억해야 하는 경우가 태반이다. 게다가 PUSH, CALL 등 한정된 명령어로 분기, 반복문 혹은 그 이상의 로직을 구현하려면 기억력이 남아나질 않는다. 이 책에서는 주로 C언어로 디컴파일의 결과만 설명하기에 이 역시 천국이 따로 없다.
단점은 거의 없다. 기드라 툴로 동적 분석이 안된다는 점이 단점이라고는 하나 분기점 우회 등 일부 편법으로 대체 가능한 팁들도 소개되며 무엇보다 나의 경우 정적 분석 하나 숙달하는데도 부족한 실력이어서인지 동적 분석까지 집중할 겨를이 없었다.
아무튼 지금까지 나온 리버싱 책 중 실전 감각을 키우는데 가장 훌륭한 책이라는 생각을 했다. 아무리 이론이 빠삭해도 눈앞에 작은 프로그램 하나 리버싱을 못한다면 무슨 소용이 있겠는가?
그런점에서 백견이 불여일타의 정신을 확실하게 고수하는 본 도서를 추천하고 싶다.