Security_RNRF

1장. 개요 - 디스어셈블러와 디버거 본문

Exploit/윈도우 버그헌팅 및 익스플로잇

1장. 개요 - 디스어셈블러와 디버거

RNRF 2021. 2. 14. 06:37

3. 디스어셈블러와 디버거

소스 코드는 당연히 볼 수 없고 험난한 수천 수만 줄의 기계어 코드 바다를 직접 휘젓고 다니며 취약점을 찾고 분석해야 한다. 다행히 리버스 엔지니어링 분야도 기술이 발전하면서 디스어셈블러와 디버거 툴이 날로 진화하기 시작했고 우리를 도와줄 강력한 툴 들이 몇 가지 존재한다.

3.1 디스어셈블러

디스어셈블러는 16진수로 이루어진 기계어를 사람이 알아보기 쉽도록 어셈블리어로 해석해준다. 분석에 있어 가장 기본적인 툴이라 할 수 있겠다.

대표적인 디스어셈블러는 두말할 필요 없이 최고의 디스어셈블러로 인정받고 있는 "IDA Pro"이다.
"IDA Pro"는 단순히 어셈블리어를 해석하는 것만이 아니라, 어셈블리어 구조를 재귀적으로 분석하여 그래픽으로 깔끔하게 표현한다. 분기문을 기준으로 코드 블록을 나누어 주는 것만으로도 디버거보다 훨씬 보기 편한 인터페이스를 제공한다는 것을 알 수 있다. 대표적인 기능 중 하나로 함수의 시그니처를 복구해서 사람이 알아보기 쉬운 의미 있는 함수명으로 변경하는 기능이 있다. 또한 Microsoft에서 제공하는 심볼 서버와 연동도 가능하여, Microsoft 관련 파일을 분석할 때 함수명 등의 식별 정보를 자동으로 다운로드 및 표시한다. 또한 SDK를 공개하고 플러그인을 누구나 개발할 수 있도록 문서를 제공하여 전 세계에서 다양한 플러그인을 개발하여 공개하고 있다는 것도 큰 장점이다.

실습 디스어셈블러 기능 실습
IDA Pro를 이용하여 어셈블리어를 분석한다.
구분 내용
테스트 환경 Windows 7 서비스팩1 / 32bit
테스트 대상 sample_calc.exe
테스트 도구 IDA Free or IDA Pro

IDA Pro 인터페이스

1) 크로스 레퍼런스 (= Xref)

특정 함수를 호줄하는 부분을 찾고 싶을 때 사용한다. 함수명을 클릭한 뒤 X 키를 누르면 해당 함수를 호출하는 코드를 자동으로 찾아준다.

크로스 레퍼런스 메뉴

이 기능은 취약점을 찾을 때도 용이하다. 취약 함수인 strcpy, gets, sprintf, scanf, getwd 등의 함수를 찾은 뒤 해당 함수의 크로스 레퍼런스를 찾는 방식으로 역순으로 접근해 나가는 것이다.

2) 문자열 검색

바이너리에 포함된 문자열들을 검색해서 보여준다.
문자열 창은 [View] — [Open subviews] — [Strings] 메뉴를 통해 확인할 수 있다.

Strings 윈도우 메뉴
문자열 목록

프로그램 내부에서 사용하는 문자열들을 쉽게 확인할 수 있으며, 문자열을 더블클릭하면 해당 문자열이 존재하는 주소로 이동할 수 있다.

문자열 주소로 이동

문자열에서도 x 키를 이용하여 Xref 기능을 이용할 수 있으며 이를 통해 문자열을 사용하는 코드를 쉽게 찾을 수 있다.

문자열 Xref 확인

3) 플러그인

플러그인은 IDA 설치 폴더 내부의 plugins 폴더에 존재하며, 다운로드받은 플러그인도 이 폴더에 복사하면 된다. [Edit] - [Plugins] 메뉴를 보면 추가한 플러그인들이 보일 것이다.

가장 유명한 플러그인으로 디컴파일러 플러그인인 Hex-Ray Decompiler가 있으며, 말 그대로 기계어 코드를 역분석하여 소스 코드로 디컴파일한다

디컴파일된 코드(상) / 원본 소스 코드(하)

두 소스를 비교하면 큰 차이가 없음을 알 수 있다. 이런 막강한 기능을 활용하면 분석 시간을 대폭 줄일 수 있다.

3.2 디버거

디버거는 말 그대로 디버깅을 수행할 수 있도록 해주는 툴이다. 공격 코드를 만드는 것 또한 프로그래밍이므로 공격 코드를 만들고 실행한 후 디버거를 통해 공격 코드가 메모리에 잘 들어가 있는지 혹은 실행을 하며 오류가 발생하지는 않는지 등을 살펴보아야 한다.
개인적으로는 디스어셈블러로는 "IDA Pro"를 사용하고, 리버싱 위주의 작업에는 "OllyDebugger"를 주로 사용하며, 취약점 분석 및 Exploit 제작에는 "Immunity Debugger"를 사용한다. 커널 디버깅과 브라우저 등 Microsoft 취약점 분석에는 "WinDBG"가 유용하다. (위에서 소개한 디버거들은 기능이 대부분 비슷하며 커널 디버깅을 제외하면 약간의 인터페이스와 부가 기능 정도에만 차이가 있으므로, 모두 사용해 본 뒤 자신에게 편리한 디버거를 선택하면 된다.)

Comments