Reverse Engineering 이란?

소프트웨에어 공학에서 리버싱이란 무엇일까? 일단 사전적 의미를 찾아봤다.

요약
소프트웨어 공학의 한 분야로, 이미 만들어진 시스템을 역으로 추적하여 처음의 문서나 설계기법 등의 자료를 얻어 내는 일을 말한다. 이것은 시스템을 이해하여 적절히 변경하는 소프트웨어 유지보수 과정의 일부이다.
[
http://100.naver.com/100.nhn?docid=719182]

위 내용은 네이버에서 Reverse Engineering으로 검색했을 때 나오는 사전 자료이다. 위 사전 자료에서는 소프트웨어 공학의 한 분야로만 일축하고 있는 것을 볼 수 있는데 그것보다는 좀더 포괄적인 개념이 있다. 리버스 엔지니어링은 사람이 만들어낸 어떤 것으로 부터 정보를 빼내거나 그것이 어떻게 설계됐는지 알아내는 과정이다. 소프트웨어 공학에서만 나오는 것이 아니라 건축공학, 자동차 공학등 모든 분야의 공학에서 나오는 것이 리버스 엔지니어링이다. 엘다드 에일람(WILEY: Reversing)님의 말을 빌리자면 "리버스 엔지니어링은 과학자들이 원자나 인간의 마음에 대한 설계도를 알아내고자 하는 것과 매우 흡사하다." 과학과 다른 점은 과학은 자연에서 얻고 리버스 엔지니어링은 인간이 만든 어떤 것에서 얻는 다는 것이다. 리버싱을 통해 어떤 제품의 설계도를 가져 오거나 제품의 부품을 가져 올 수도 있다.

소프트웨어 공학에서의 리버스 엔지니어링이란 소스코드로 부터 프로그램의 모든 것들을 알아오는 것을 말한다. 소프트웨어의 생명 주기는 보통 요구사항 분석->설계->소스코드 작성->어셈블리어->기계어 순서로 이루어진다. 하지만 리버스 엔지니어링은 기계어를 어셈블리어로 변환하여 소스코드는 물론 설계, 요구사항 까지 얻어 오는 것을 말한다. 그리고 대한민국의 법에서 리버스 엔지니어링은 "합법"이다.

제12조의2(프로그램코드역분석)

 ①정당한 권원에 의하여 프로그램을 사용하는 자 또는 그의 허락을 받은 자가 호환에 필요한 정보를 쉽게 얻을 수 없고 그 획득이 불가피한 경우 당해 프로그램의 호환에 필요한 부분에 한하여 프로그램저작권자의 허락을 받지 아니하고 프로그램코드역분석을 할 수 있다.

②제1항의 규정에 의한 프로그램코드역분석을 통하여 얻은 정보는 다음 각호의 1에 해당하는 경우에는 이를 사용할 수 없다.

1. 호환 목적외의 다른 목적을 위하여 이용하거나 제3자에게 제공하는 경우

2. 프로그램코드역분석의 대상이 되는 프로그램과 표현이 실질적으로 유사한 프로그램을 개발·제작·판매하거나 기타의 프로그램저작권을 침해하는 행위에 이용하는 경우


위의 글에서 볼 수 있듯이. 호환에 필요한 부분에 한하여 프로그램 역분석(리버스 엔지니어링)은 합법이다. 하지만 그 외의 목적에 관해서는 불법이라는 것을 볼 수 있다. DMCA(Digital Millenium Copyright Act) (DMCA는 저작권 보호 기술을 보호하기 위해서 1998년에 재정됐다)를 검색해 보면 리버스 엔지니어링의 법에 관한 여러가지 정보를 얻을 수 있다.


한가지 덧 붙이자면 소프트웨어 공학에서의 리버스 엔지니어링은 Reversing(리버싱)으로 불린다.

정리하자면 소프트웨어 공학에서 리버스 엔지니어링(이하 리버싱)은 프로그램의 어셈블리 언어 코드를 보고 프로그램을 분석하는 것이며 어느 정도는 합법적인 것이다.


Bloger: moltak.net

'Security > Reversing' 카테고리의 다른 글

CodeEngn 20  (0) 2010.04.27
CodeEngn 19  (0) 2010.04.27
CodeEngn 18  (0) 2010.04.14
CodeEngn 17  (0) 2010.04.14
CodeEngn 16  (0) 2010.04.13

Code Engn 두번 째!

Korea 
패스워드로 인증하는 실행파일이 손상되어 실행이 안되는 문제가 생겼다. 패스워드가 무엇인지 분석하시오 

 

일단 실행했더니

그리고 한가지 툴을 써서 잘 살펴보니 보이더라ㅋ

더 이상의 블로깅은ㅋㅋ

'Security > Reversing' 카테고리의 다른 글

CodeEngn 07  (0) 2010.04.12
CodeEngn 06  (0) 2010.04.12
Code Engn L04 Start  (0) 2010.04.06
Code Engn L03 Start  (0) 2010.04.05
Code Engn Reverse L01 Start  (0) 2010.04.02

리버싱 시그를 시작했다.

예전부터 하고 싶었던 과목이지만 어렵고 다른 것도 할것이 많아서 못하고 있엇지

이젠 시그로 묶었으니깐 열심히 해야징ㅋㅋ

 

Ezbeat이 추천해준 사이트 중 Code Engn의 문제를 풀어보기로 했다.

한글이고 쉬울거 같아서??ㅋㅋ

 

암튼 시작!!

 

문제:

Korea 
HDD를 CD-Rom으로 인식시키기 위해서는 GetDriveTypeA의 리턴값이 무엇이 되어야 하는가

실행하면 하드를 씨디로 인식하게 하라는 창이 뜨면서 프로그램이 죽는다.

위에 문제를 보면 GetDriveTypeA의 리턴값을 적절하게 수정하면 될 것 같다.

 

어제 ezbeat이 알려준 방법대로 Search for->All Intermodular Calls를 실행한다.

위 기능은 Import된 함수들의 목록을 보여주는 역할을 한다. 고로 API를 잘 하면 더 쉽게 Reversing을 할 수 있겠지??ㅋㅋ

문제에서 나왔던 GetDriveTypeA가 보인다. 일단 우클릭을 해서 브레이크 포인트를 찍고 실행해 보자.
참고로 F2: Break Point, F9: Run, F8: Step Over, F7: Step Into 이다. 잘 기억해 놓자.

암튼 F9를 눌러서 실행해서 리턴값이 뭐가 나오는지 확인해보자.

실행하면 위 GetDriveTypeA에서 멈춘 것을 확인할 수 있다. 이제 우리는 리턴값을 확인하면 되는데.

여기서 잠깐 x86의 Windows와 Linux는 리턴값을 대부분 EAX 레지스터에 저장한다는 것을 알아야 한다.

그래서 우리는 EAX 레지스터를 확인 할 것이다.

위 그림에서 보면 알겠지만 EAX의 값이 0x00000003 인것을 알 수 있다. 이 값이 아마도 HDD를 가리킬텐데 우리는 CD-ROM

으로 바꿔야한다. 어떻게 해야하나? MSDN을 봐야지.

자 위에서 보면 3이 드라이브를 가리킨다는 것을 알 수 있으며 우리가 원하는 것은 5번이라는 것을 쉽게 알 수 있다.

이제 EAX 레지스터를 수정하기만 하면 된다.

EAX 레지스터를 클릭해서 0x00000005로 바꾸고 실행.

올바른 결과가 출력됐다.

1번 문제 끝ㅋ

'Security > Reversing' 카테고리의 다른 글

CodeEngn 07  (0) 2010.04.12
CodeEngn 06  (0) 2010.04.12
Code Engn L04 Start  (0) 2010.04.06
Code Engn L03 Start  (0) 2010.04.05
Reverse L02 Start  (0) 2010.04.05

+ Recent posts