본문 바로가기

CAT-Security/미분류

리버싱의 기초 정리

  지금부터 이루어지는 포스팅은  IA-32 Processor Architecture 기반입니다.

 

1.레지스터 - CPU 내부에 있는 8,16,32Bit 고속 저장소를 말하며 일반적으로 사용하고 있는

                 메모리 보다 데이터를 훨씬 빨리 Read ,Write 할 수 있음.

 

범용 레지스터 (General-Purpose Register) : 8

EAX, EBX, ECX, EDX, ESI, EDI레지스터는 우리 마음대로 쓸 수 있는 레지스터이다.

EAX : Accumulator Register. 곱셈나눗셈 명령에 쓰임.

EBX : Base Register.

ECX : Counter Register. 루프 카운터로 쓰임.

EDX : Data Register.

ESI : Source Index. 고속의 메모리 복사에 쓰임.

EDI : Destination Index. 고속의 메모리 복사에 쓰임.

 

ESP,EBP레지스터는 스택레지스터라고 불림.

ESP : Stack Pointer의 약자스택의 탑 가르킴.2개

EBP : Base Pointer. 고급 언어에서 사용하는 함수 파라미터와 지역변수를 가리키는 데 쓰일 것이

      다일반적인 산술이나 데이터 전송에 쓰여서는 안됨.

 

세그먼트 레지스터 (Segment Register) : 6

프로그램 수행에 필요한 내용들이 미리 메모리에 할당되어 있는 데 그곳의 주소를 갖고 있음.

-세그먼트 레지스터는 자세히 알 필요 없음

 

EIP Register = 명령 포인터 (Instruction Pointer) : 다음에 수행되어야 할 명령문의 주소

                    를 갖고 있게 된다. (우리가 흔히 알고 있는 PC=Program Counter와 같음.)

 

EFLAGS Register : EFLAGS의 각각의 비트는 1(set)이 되거나 0(clear)이 될 수 있

                      음예를 들어, Sign Flag라는 비트는 계산 결과가 음수인지 아 닌지를 표

                      현해줌.

                      즉이 레지스터를 통해 여러 가지 상태를 알 수 있다. (음수인 지 양수인

                      지오버플로우가 발생하였는지 등)

 

 

 

2.바이트 순서

-Little-Endian (리틀 인디언) : 주소의 낮은 자릿수를 기록하고주소값이 증가할수록 높은

                                   자릿수를 기록하는 것인텔 계열이 주로 사용

                                   Ex) 0x12345678 => 78 56 34 12

                                  

-Big Endian (빅 인디언) : 정수로 정렬된 큰 수에 대한 비교를 메모리의 작은 주소부터 큰 주

                             소 방향으로 읽으면서 바로 비교할 수 있어 더 빨리 할 수 있으며,

                             모든 정수와 문자열을 같은 순서 방향으로 읽을 수 있다는 장점 있

                             음.Motorola나 Sun, Sparc등 RISC에서 사용.

                             Ex) 0x12345678 => 12 34 56 78

 

 

 

3.Calling Conventions

-스택에 파라미터를 어떠한 순서로 넣을 것인가?

 전달되어진 파라미터를 어느 곳에서 해제할 것인가?

이 두가지에 따라 여러 가지 방식이 있는데 이를 콜링 컨벤션이라고 함.

 

_cdecl

파라미터 전달 방향오른쪽->왼쪽

파라미터 해제 호출한 쪽(Caller)

 

_stdcall

파라미터 전달 방향 오른쪽 ->왼쪽

파라미터 해제 호출 당항 쪽(Callee)

 

_fastcall

처음 두 개까지의 파라미터는 스택을 사용하지 않고 ECX와 EDX레지스터 사용.

파라미터 전달 방향 오른쪽->왼쪽

파라미터 해제 호출 당한 쪽(Callee)


명령어1

명령어2

설명

부등호 조건

Flag 조건

JA

JNBE

크면 분기

부호 없이 비교[unsigned] )

OP1>OP2면 분기

CF=0 & ZF=0

JAE

JNB

크거나 같으면 분기

부호 없이 비교[unsigned] )

OP1OP2면 분기

CF=0 | ZF=1

JB

JNAE

작으면 분기

부호 없이 비교[unsigned] )

OP1<OP2면 분기

CF=1

JBE

JNA

작거나 같으면 분기

부호 없이 비교[unsigned] )

OP1OP2면 분기

CF=1 | ZF=1

JG

JNLE

크면 분기

부호 있는 비교[signed] )

OP1>OP2면 분기

ZF=0&SF ==OF

JGE

JNL

크거나 같으면 분기

부호 있는 비교[signed] )

OP1OP2면 분기

SF==OF

JL

JNGE

작으면 분기

부호 있는 비교[signed] )

OP1<OP2면 분기

SF!=OF

JLE

JNG

작거나 같으면 분기

부호 있는 비교[signed] )

OP1OP2면 분기

ZF==1|SF!=OF

JE

 

같으면 분기

OP1=OP2면 분기

ZF==1

JNE

 

같지 않으면 분기

OP1OP2면 분기

ZF==0

JC

 

Carry Flag가 Set되면 분기

 

CF==1

JNC

 

Carry Flag가 해제되어 있으면 분기

 

CF==0

JO

 

Overflow가 Set되어 있으면 분기

 

OF==1

JNO

 

Overflow가 해제되어 있으면 분기

 

OF==0

JS

 

Sign Flag가 Set되어 있으면(음수이면분기

 

SF==1

JNS

 

Sign Flag가 해제되어 있으면(양수이면분기

 

SF==0

JZ

 

Zero Flag가 Set되어 있으면 분기

 

ZF==1

JNZ

 

Zero Flag가 해제되어 있으면 분기

 

ZF==0

JP

 

Parity Flag가 Set되어 있으면 분기

 

PF==1

JNP

 

Parity Flag가 해제되어 있으면 분기

 

PF==0


ADD oper1, oper2 - oper1에 oper2를 더한뒤 결과값을 oper1에 저장.

                   ex) add eax, 1000h   <-eax = eax+0x1000

 

SUB oper1, oper2 - oper1에서 oper2를 빼고 결과 값을 oper1에 저장.

                   ex) mov eax, 5

                       sub eax, 5   <-결과는 0이됨.

 

MUL / IMUL oper - MUL은 부호 없는 곱셈 명령을 수행.

                  IMUL은 부호 있는 곱셈 명령을 수행.

                  EAX에 저장되어진 값과 oper을 곱한 결과를 아래와 같이 저장한다.

                  - 8비트 연산은 AX에 저장

                    16비트 연산은 DX:AX에 저장

                    32비트 연산은 EDX:EAX에 저장

                  ->곱셈 결과가 두배가 되어 자리수를 넘어가기 때문에 곱셈을 하였을때 두배

                    크기의 공간에 저장됨. (자리수를 넘어가면 캐리 또는 오버플로우 발생.)

 

ADC oper1, oper2 - ADD와 유사하나 캐리 플래그가 이용됨.

                   oper1 = oper1 + (oper2 + 캐리 플래그)

                   캐리비트는 0으로 리셋됨.

                   ex) mov ebx, 5

                       mov eax, 0

                       stc   <-CF=1(캐리 플래그)

                       sbb ebx, eax   <-ebx=4

          

SBB oper1, oper2 - SUB와 유사하나 캐리플래그가 이용됨.

                   oper1 = oper1 - (oper2 + 캐리 플래그)

                   연산이 끝나면 캐리비트는 0으로 리셋됨.

 

INC oper - Increment

           oper의 값이 1만큼 증가.

           ex) mov eax, 1

               inc eax   <-eax의 값이 2로 값이 증가.

 

DEC oper - Decrement

           oper의 값이 1만큼 감소.

           ex) mov eax, 1

               dec eax   <-eax의 값이 0으로 감소.

 

STD - Set Direction.

      DF를 1로 설정.

 

CLD - Clear Direction.

      DF를 0으로 설정.

 

CMC - Complement Carry

      캐리 플래그를 반전시킨다.

      1이면 0, 0이면 1로 만든다.

 

STC - Set Carry

      캐리 플래그를 1로 만든다.

 

CLC - Clear Carry

      캐리 플래그를 0으로 만든다.



출처- http://blog.naver.com/coool219?Redirect=Log&logNo=60114153387

[출처] 리버싱 기초 1 |작성자 초딩코딩


'CAT-Security > 미분류' 카테고리의 다른 글

[Defcon 21 ctf] policebox  (0) 2014.04.08
Python 예외처리  (0) 2014.01.09
MBR 덤프해서 16비트 어셈블리 코드로 보는방법  (0) 2013.07.22
MBR (Master Boot Record) 정리  (0) 2013.07.22
ASProtect 2.1 MUP 정리  (1) 2013.06.18