"Software Vulnerability"의 두 판 사이의 차이
Cslab admin (토론 | 기여) (새 문서: <Reverse Engineering> • Reverse Engineering이란? 국내에서는 ‘역공학’ 이라 부르며, 리버스(reverse)와 엔지니어링(engineering)의 합성어이다. 줄여서 ...) |
(차이 없음)
|
2011년 7월 11일 (월) 23:43 판
<Reverse Engineering>
• Reverse Engineering이란?
국내에서는 ‘역공학’ 이라 부르며, 리버스(reverse)와 엔지니어링(engineering)의 합성어이다. 줄여서 리버싱(reversing)이라고 한다. 영어 의미 그대로 풀이하면 ‘거꾸로 분석하는 것’을 의미하며, 이미 만들어진 시스템을 역으로 추적하여 처음의 문서나 설계기법 등의 자료를 얻어 내는 일을 뜻한다. 보안 분야에서의 리버싱은 보통 소프트웨어 리버스 엔지니어링을 뜻하며 이미 완성된 소프트웨어를 역으로 분석하는 과정이다. 간단하게 그 과정을 살펴보자면, 먼저 개발자가 소스 코드를 작성하고 자신이 택한 컴파일러로 컴파일 하여 실행 가능한 바이너리를 만든다. 이것이 소프트웨어이다. 이 소프트웨어를 리버서(reverser)들이 기존 소스로 복원하는 과정인 디컴파일을 진행하게 되는 데, 이 과정이 ‘리버스 엔지니어링’ 이다. 하지만 100% 정확한 소스 코드를 복원해내기는 힘들기 때문에 디버깅 과정을 통해서 얻어진 어셈블리어 코드를 가지고 원래 소스 코드의 구조와 원리에 대해 분석한다.
국내에서 리버스 엔지니어링은 크랙을 만드는 연구라고 잘못 인식되는 경우가 많다. 이것과는 반대로 프로그램을 구현하는 과정에서 실수할 수 있는 부분들을 분석하여 허점을 찾아내 프로그램의 보안이 강화되기를 바라며 자신의 찾은 취약점을 세상에 공개하여 방어 기술의 발전에 공헌하는 사람들도 많다. 리버싱을 통해 할 수 있는 일들 중에서 대표적인 것은 악성 코드의 분석이 있다. 또한, 이미 완성된 프로그램의 수정, 디버깅, 호환을 위해서도 사용되며 등의 많은 일들에 사용되고 있다.
※이미지 참고 : 리버스엔지니어링 - 역분석 구조와 원리
※ 본문 내용 참고 : 리버스엔지니어링 - 역분석 구조와 원리, 네이버 백과사전
• Reverse Engineering의 예
간단하게 Window XP에서 쉽게 즐길 수 있는 ‘지뢰찾기’ 게임을 가지고 리버스 엔지니어링을 소개하고 한다. 이것은 아주 초보적이고, 단순한 리버스 엔지니어링의 예이다. 우리가 하고자 하는 일은 다음과 같다. ‣ 지뢰찾기에서 ‘도움말’을 누르면 지뢰의 위치가 표시.
이를 위해선 리버스 엔지니어링에 활용하기 위한 몇 가지 툴이 필요하다. 이는 다음과 같다.
‣ IDA Pro ‣ OllyDBG
IDA Pro는 http://www.datarescue.com/ 에서 free 버전을 다운로드 받을 수 있으며, OllyDBG는 http://www.ollydbg.de/ 에서 다운로드 받을 수 있다.
※ 튜트리얼은 IDA Pro 6.1과 OllyDBG 1.1.0을 사용하여 제작되었다.
1. IDA를 실행한 후, 'C:\WINDOWS\system32\winmine.exe‘를 로드한다. 함수 목록이 나타나는 Functions 탭을 열고, 함수 이름을 확인한다. 그리고 ShowBombs(x) 함수를 찾는다.
2. ShowBombs(x)함수를 더블 클릭하여 ShowBombs(x)함수 부분으로 이동한다. IDA View모드 일텐데, 화면에서 오른쪽 클릭을 하고 여기서 Text view를 선택한다. 그럼 다음과 같은 화면이 출력될 것이다. 주소값 01002F80을 알아놓자.
여기서 녹색글씨가 있는 ‘; CODE XRE: GameOver(x)+2F↓p’ 에 마우스 커서를 가저다 되면 다음과 같은 창이 출력된다.
즉, GameOver(x) 부분에서eax 레지스터 값이 매개변수로 사용되고, ShowBombs(x)를 호출했다는 것을 알 수 있다.
3. ShowBombs(x) 함수의 매개변수인 x의 값을 우린 모르기 때문에 이것을 먼저 찾아야 한다. 먼저 ‘; CODE XRE: GameOver(x)+2F↓p’를 더블클릭하여 ShowBombs(x)가 호출되는 지점에 F2를 눌러 BeakePoint를 설정한다.
그리고 F9를 눌러서 지뢰찾기 게임을 실행하고, 일부로 지뢰를 눌러 게임을 진다. 그러면 BreakPoint가 설정된 ShowBombs(x)를 호출하기 전까지 실행된다. 이때, IDA의 레지스터상태창을 보게 되면 eax 레지스터의 값이 0000000A인 것을 알 수 있다. 즉, hex값으로 0A이다.
4. 다시 F9를 눌러 지뢰찾기 프로그램이 실행되게 한 후, 종료한다. 그럼 이제 도움말 버튼을 눌렀을 때 호출되는 함수를 찾아보자. ‘DoHelp’ 이다. 이것이 실행되는 지점을 찾아 보면 다음과 같다.
사용되는 곳은 MainWndProc 내부이고, 해당 위치로 가보자.
파라미터는 0, 3이 들어가고, 01001F0F주소에서 DoHelp가 실행된다.
5. 이제 OllyDBG를 실행시켜 지뢰찾기 게임을 로드한다. 이유는 IDA는 분석해주는 기능이 뛰어나지만 디버깅 기능에 있어서는 OllyDBG가 더 뛰어나기 때문이다. 실제로 많은 리버서들이 이런식으로 이 둘을 병행해 사용한다. 이미 IDA를 통해 알아놓은 01001F0F로 이동한다. Ctrl+G를 누른 후 위에 주소값을 넣으면 된다. 이동하여 해당 명령어를 더블클릭하고 Push 3의 값은 원래 매개변수 값인 0A로 바꿔주고, Call 주소 역시 위에서 찾은 ShowBombs(x)의 주소값인 01002F80으로 바꿔준다.
6. 이제 오른쪽 클릭을 누르고 Copy to executable -> All modifications를 누른 후, 새로 뜬 창에서 Copy all 버튼을 클릭한다. 새로 뜬 창에서 오른쪽 클릭을 하고, Save File을 선택해 다른 이름으로 저장한다.
7. winmine1.exe를 실행한 후, 도움말 -> 목차를 눌러보자. 다음과 같은 화면이 출력되면 성공한 것이다.
※ 예제 참고 : 리버스엔지니어링 - 역분석 구조와 원리