리버스 엔지니어링

Posted by 알 수 없는 사용자
2015. 6. 8. 20:42 네트워크및보안&해킹/보안&해킹

1. 리버스 엔지니어링이란

장치 또는 시스템의 기술적인 원리를 이해하며,단점을 보완하고 새로운 아이디어를 추가시키는 일련의 작업,

다른말로 일반적인 소프트웨어 제작과정을 역행하는 과정이다.

주로 소프트웨어를 분석하거나 자신이 제작한 소프트웨어를 업데이트,오류제거,패치할때 또는 악성코드를 분석할때 사용된다.

하지만 이를 악용하여 해킹을 시도하는 사례가 자주발생된다.


2. 패치 or 크랙

프로그램의 파일 또는 실행중인 프로세스의 메모리내용을 변경시키는작업을 패치(patch),

그 중 악의적으로 수행되는 작업을 크랙(crack) 이라고 한다.


워크래프트III 크랙






3. 사전 지식

PE의 구조 - PE는 'Portable Excutable' 의 약자로, '휴대해서 실행할수 있다.' 라는 의미이다.

이것은 실제로 인터넷을 통해서 다운로드한 파일을 실행하면 실행되듯이 어디에서나 실행할수 있는 파일을 말하는데, 크게 .exe, .dll, .sys 파일이 있다.


PE의 구조는 구조체 형태로 'WinNT.h'에 정의되어 있고, 간단하게보면 정리해보면 아래와 같다.

 헤더

설명 

Dos Header 

-DOS운영체제를 위해 제공되는 헤더

-e_magic : '4D5A' MZ의 시그니처

-e_lfanew : PE Header 위치 저장 

PE Header 

-'File Header,Optional Header 포함

-'5045' PE 시그니처 

File Header 

-PE 파일의 물리적구조 정보

-섹션의 갯수

-Optional Header의 크기

Optional Header 

-PE 파일의 논리적구조 정보

-Entry Point : PE 파일의 시작점

-Section Alignment : 메모리상 섹션의 크기단위

-File Alignment : 파일상 섹션의 크기단위

-Image Base : PE 파일이 로드되는 주소

Section Header 

-섹션의 갯수만큼 존재

-섹션의 정보 



어셈블리언어 - 리버싱을 통해 분석할 프로그램들은 주로 C,C++,자바 같은 고급언어로 작성되어 있지만, 컴퓨터가 이해할수 있도록 컴파일 되면서 

바이너리 파일로 만들어진다. 이 바이너리 파일을 분석해야하는데, 다행이도 시중에 나와있는 툴들이 그나마 알아보기 쉬운 어셈블리언어로 번역해주기 때문에 어셈블리언어를 알고 있어야한다.


기본적인 어셈블리함수.


레지스터 조작 - MOV,XCHG


스택 조작 - POP,PUSH


수학연산 - ADD,SUB,MUL,DIV


비트연산 - AND,OR,XOR,NOT


이외 자주사용되는 명령어 - CALL(Call Routine),JA(Jump Above),JAE(Jump Above or Equal),JB,JBE,JE(Jump Equal),JNE(Jump Not Equal)....


4.분석 도구(Tool)

다양한 툴들이 있지만 그중 가장 많이 사용되는 툴인 OllyDbg에 대해서 설명하였다.


OllyDbg

- 대표적인 바이너리 파일 분석도구로, 리버싱할때 가장많이 사용된다, MS윈도우에서만 사용가능하고 무료이다.

- 주요기능

* 코드분석 : 레지스터값 추적,프로시저 인식, 루프, API 호출, 스위치, 테이블, 상수 및 문자열.

* 오브젝트파일 스캐닝 : 오브젝트 파일과 라이브러리에서의 루틴 위치

* 사용자 정의 테이블,주석,함수설명 허용.

* 개방적 구조로 많은 플러그인 이용가능.

* 멀티스레드 어플리케이션 디버깅

* 실행프로그램 접근(Attach)

- 메인화면

  



Disassembler 창 - 디버깅된 프로그램의 코드를 출력한다.

*Address : VA ( Virtual Address ) 를 출력하며 ,더블클릭할 때 선택한 코드간의 상대적인 주소값( +,- ) 를 보여준다.

*Hex dump : Opcodes를 출력한다.

*Disassembly : 16진수로된 Opcodes를 Assembler mnemonics로 출력한다.

*Comment : Olly로 분석한 결과에 대한 주석을 출력한다. 사용자가 직접 세미콜론( ; )을 입력하여 주석을 넣을수있다.

Infomation 창 - Disassembler 창에서 선택한 구문에서 사용한 주요변수에 대한 값을 출력한다.


Registers 창 - 현재 실행중인 스레드에서 사용하는 CPU레지스터 값을 출력한다. 이때 출력되는 형식을 사용자가 변경할 수 있다.


Dump 창 - 미리 정의한 파일 형식으로 메모리나 파일의 내용을 출력한다. 이때 출력되는 형식을 사용자가 변경할 수 있다.


Stack 창 - 실행중인 스레드의 스택값을 출력한다. 보통 해당 창의 스크롤은 실행을 일시중지 시킬때 ESP값을 가리킨다.


참조 : www.reversecore.com

  hackerschool.org

http://blog.naver.com/PostView.nhn?blogId=sol9501&logNo=70107914969&parentCategoryNo=&categoryNo=93&viewDate=&isShowPopularPosts=false&from=postView

http://carpedm20.blogspot.kr/2012/08/3.html

  




'네트워크및보안&해킹 > 보안&해킹' 카테고리의 다른 글

[시스템해킹]버퍼오버플로우 실습  (329) 2015.08.28
CrackMe2 문제풀이  (6) 2015.07.17
DLL Injection  (6) 2015.06.21
CrackMe 문제풀이 (리버싱 기초)  (6) 2015.06.08
버퍼오버플로우  (928) 2015.06.08

버퍼오버플로우

Posted by 알 수 없는 사용자
2015. 6. 8. 20:19 네트워크및보안&해킹/보안&해킹

버퍼 오버플로우

버퍼(buffer) - 어떤 데이터가 한곳에서 다른곳으로 이동할 때, 그 데이터가 일시적으로 보관되는 임시기억공간.

오버플로우(overflow) -사용자가 입력한 데이터의 크기가 너무 과하여 제한된 버퍼의 용량을 넘어서 버린것.

즉 버퍼오버플로우는 사용자가 입력한 데이터의 크기가 너무과하여 제한된 버퍼의 용량에서 넘쳐버림 이라는 뜻이된다.

사용자로부터 어떠한 입력을 받는,또 그입력값에 따라 프로그램의 실행결과가 달라지는 프로그램들이 버퍼 오버플로우의 공격대상이 된다

위는 버퍼오버 플로우의 공격대상으로 아주 좋은 소스코드이다 . 


먼저 정상적인 입력을 했을때 결과를 보면 다음과같다.

패스워드 값을 알수없으니 당연한 결과이다.

그럼 비정상적인 값(passwd의 크기를 넘어서는 값) 을 입력해보자.

위의 결과를 이해하기위해서는 먼저 메모리주소를 알아야한다.










먼저 선언된 변수가 나중에 선언된 변수보다 높은 주소값을 가지게된다, 따라서 passwd보다 auth 변수가 더 높은 주소값을 가진다.

그리고 auth변수는 선언과동시에 0으로 초기화 되었으므로 사용자의 입력전에는 위와같은 상태가된다 




먼저 정상적인 값을 입력했을때 위와같이 낮은주소부터 차례대로 입력된다.

다음은 비정상적인 입력을 했을때 상태이다 .




입력값이 passwd의 크기를 넘어서 auth의 값을 덮어버렸다 .

위와같이 되는 이유는 

gets함수의 특성 떄문이다.

gets함수는 사용자가 엔터를 치기 전까지의 입력을 메모리 주소값에 저장한다.

따라서 입력크기에 제한이없다.

gets함수는 입력값이 변수크기를 초과하게되면 그변수보다 한단계 높은 주소에 있는 변수의 값에 덮어쓰기 식으로 

저장이 되기 때문에 auth변수를 직접 건드리지 않고 값을 바꿀수있는것이다.

지금까지 위의 내용이 버퍼오버플로우의 기본원리이다.

이를 이용하여 일반 사용자권한을 최고 관리자권한으로 상승시키거나 원격상의 다른 pc의 접근권한을 획득할수도 있다.



출처 - www.hackerschool.org



'네트워크및보안&해킹 > 보안&해킹' 카테고리의 다른 글

[시스템해킹]버퍼오버플로우 실습  (329) 2015.08.28
CrackMe2 문제풀이  (6) 2015.07.17
DLL Injection  (6) 2015.06.21
CrackMe 문제풀이 (리버싱 기초)  (6) 2015.06.08
리버스 엔지니어링  (3) 2015.06.08

[Active Directory] 그룹 정책

Posted by 알 수 없는 사용자
2015. 6. 7. 12:04 시스템인프라/MS서버군

AD에서는 그룹 정책을 이용하여 사용자나 컴퓨터에 대한 중앙관리가 가능하다.

예를들어 AD의 특정 그룹에 있는 사용자들은 제어판메뉴를 보이지 않게 하도록 하고 싶다면

AD의 그룹정책 중 제어판에 관련된 설정을 통해 관리할 수 있다는 것이다.

그룹정책에서는 소프트웨어 설치, Windows 구성 요소, 네트워크, 바탕화면, 시스템, 시작메뉴, 제어판 관리 등 여러 정책을 설정 할 수 있다.


그룹정책은 도메인안의 특정 그룹에 대해 적용할 수 있는데 이를 위해서는 AD에 조직구성단위(OU)를 생성해야 한다.

그 OU에는 사용자, 컴퓨터, 그룹 계정등을 포함할 수 있고 그룹정책을 반영해 관리가 가능하다.

만약 OU를 삭제하면 그 안에 있는 개체도 같이 삭제 된다.


그러면 OU생성 및 그룹정책 반영하는 방법에 대해 살펴보자.


1. OU 생성

[그림 1-1]


그룹정책을 설정하기 전에 먼저 OU를 추가하는데 [그림1-1]에서 처럼 

Acitve Directory 사용자 및 컴퓨터 -> 마우스 오른쪽 버튼 클릭 -> 새로만들기 -> 조직구성단위 버튼을 클릭한다.


그림[1-2]


그림[1-3]


[그림1-2]에서처럼 OU의 이름을 적고 확인을 누르면 그림[1-3]과 같이 OU가 추가된 것을 볼 수 있다.

OU에 개체를 추가할 때 User나 Conputers에 이미 개체가 있다면 드래그앤 드롭으로 이동할 수도 있고 마우스 오른쪽 버튼을 클릭하여 추가할 수도 있다.

여기서는 김유저(kimuser)라는 사용자를 추가해서 사용하려고 한다. 사용자추가하는 방법은 다음을 참고하기 바란다.

[Active Directory] 사용자 추가 ]



2. 그룹정책 관리

이제 위에서 만든 그룹에 정책을 만드는 방법을 살펴보자.



그림[2-1]

그림[2-1] 처럼 그룹 정책 관리에서 도메인 -> 그룹 -> StudyGroup(생성한 OU) -> 마우스 오른쪽버튼 클릭 -> 이 도메인에서 GPO를 만들어 여기에 연결을 클릭한다.


그림[2-2]


그림[2-2]처럼 새 GPO 팝업이 뜨고 그룹정책이름을 입력 후 확인을 누르면 새 그룹 정책이 생성된다.


그림[2-3]

그림[2-4]

이제 그룹정책을 설정할텐데 그림[2-3] 처럼 생성한 그룹정책에서 마우스 오름쪽버튼 클릭 -> 편집버튼을 누르면 그림[2-4]와 같은

그룹 정책 관리 편집기 화면이 나타난다.

편집기 화면을 살펴보면 크게 컴퓨터 구성과 사용자 구성으로 나뉜다. 컴퓨터계정에 대한 정책을 설정하기 위해서는 컴퓨터 구성에서 설정하고

사용자계정에 대한 정책을 설정하기 위해서는 사용자 구성에서 설정하면 된다.

컴퓨터 계정에 정책을 반영하면 어떤 사용자가 로그인하더라도 컴퓨터 계정에 반영된 정책에 따라 사용하게 된다. 

각 구성에서 정책을 보면 소프트웨어 설정, Windows설정, 관리 템플릿등을 설정할 수 있다.

그러면 처음 예로 들었던 사용자가 로그인 했을 때 제어판 메뉴가 보이지 않도록 정책을 설정하고 실제로 정책이 적용되는지 보도록 하자.


그림[2-5]


그림[2-5]에서 보면 사용자 구성 -> 정책 -> 관리 템플릿 -> 제어판을 클릭하면 오른쪽에 제어판에서 설정할 수 있는 항목들이 나온다.

우리는 제어판 메뉴를 안보이도록 설정할 것이기 때문에 Prohibit access to Control Panel and PC settings(제어판 및 PC 설정에 대한 엑세스 금지)를 선택한다.


그림[2-6]

제어판 및 PC 설정에 대한 엑세스 금지화면에서 제어판을 사용하지 못하도록 설정하기 위해 사용을 선택하고 적용을 누른다.


그림[2-7]

그룹정책이 설정되면 기본적으로 컴퓨터나 사용자가 로그온할때 정책이 반영되고 그룹 정책이 변경되면 정기적으로 새로고침을 하는데 

약 90분 간격으로 변경여부를 확인한다. 

만약 변경된 정책을 강제로 재 반영하기 위해서는 그림[2-7]에서 처럼 클라이언트 PC의 command에서 gpupdate명령을 사용하면 된다.


그러면 실제 사용자로 로그인했을 때 그룹정책이 반영되었는지 보도록 하자.


그림[2-8]


클라이언트 PC에서 김유저라는 사용자로 로그인했고 그림[2-7]을 보면 시작메뉴에서 빨간줄 아래부분에 제어판메뉴가 사라진것을 볼 수 있다.

위와 같이 특정 그룹의 사용자나 컴퓨터에 대한 관리가 필요할 경우 그룹정책을 이용하면 중앙에서 쉽게 관리가 가능해진다.