Day-02 어셈블리어

i2sec/Reverse Engineering 2014. 4. 28. 19:56

1.데이터 형식

메모리에 접근 했을때 얼만큼 읽어들일지 결정

데이터 타입

사용 용도 

 BYTE

부호 없는 1 byte  

 WORD

부호 없는 2 byte 

DWORD 

부호 없는 4 byte 


2. 어셈블리언어 명령어

플랫폼에 따라서 다르다(IA32 : intel 기반, AT&T : linux 기반)

ADD      [EBP-0x04],0x01

     └> 명령어(OPCODE)   └>피연산자(OPERAND)

1.명령어(OPCODE)

사용할 명령어가 들어가는 부분


2.피연산자(OPERAND)

operand의 갯수는 opcode에 따라 정해져 있다.(','로 구분)

<[EBP-0x04]>

메인 함수도 함수이기 때문에 호출 시 스텍프레임 생성

32bit 레지스터 이기때문에 자료형에 상관없이 4씩 변화

<0x01> : 상수

10진수로 표현가능하나 어셈블리어로 열면 16진수로 표시되어 있기 때문에 혼동이 될수도 있다.


<operand 표시법>

표시 기법 

설명

mem 

메모리 

label 

지정된 레이블 

imm

즉시 값, 상수 

reg 

범용 레지스터 

*레이블은 소스코드 중간에 이름을 지정하는것으로 뛰어넘을때나 반복할때 사용된다.

-뛰어넘기

int main(void)

{

int a = 0;

goto L1;

a = 5;

L1:

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

return 0;

}

이렇게 되면 a=5;는 뛰어넘고 바로 printf로 가게 되어 0이 출력된다.


-반복하기

int main(void)

{

int a = 0;

L1:

a = 5;

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

goto L1;

return 0;

}

이렇게되면 a=5; 와 printf가 계속 반복해서 실행되어 5가 무한번 출력된다.


3.INC

opernad의 값을 1증가시켜주는 명령어(operand 1개)

"++"연산자와 동일

결과 : a = 2

<사용가능한 operand>

INC reg (ex>INC EAX) 

INC mem(ex>INC [EBP-0x04]) 


*인라인 어셈

-상위레벨 언어에서 어셈블리어를 사용할 수 있게 해준다.

-문법상 오류가 발생해도 오류를 잘 표시 안된다

-한줄에는 한 명령어만!

-opcode 대/소문자 구분하지 않는다

-변수 a 대신에 [EBP-0x04]로 표현가능하다(피연산자 부분 참조)

-"_asm"영역 안에서는 기존 c언어의 함수를 사용할수없다(printf등)


4.DEC

operand의 값을 1감소시켜주는 명령어(operand 1개)

"--"연산자와 동일

결과 : a = 0

<사용가능한 operand>

DEC reg (ex>DEC EAX) 

DEC mem(ex>DEC [EBP-0x04]) 


5.ADD

첫번째 operand의 값과 두번째 operand의 값을 더해서 첫번째 operand에 저장(operand 2개)

"+="과 동일

결과 : a = 20, b= 10 (동일한 결과지만 형태가 다른것을 보기위해서 저렇게 표현함)

<사용가능한 operand>

ADD reg, reg(ex>ADD EAX,EBX) 

ADD mem,reg(ex>ADD [EBP-0x04], EAX) 

ADD reg, mem(ex>ADD EBX, [EBP-0x04])

ADD reg, imm(ex>ADD EAX, 0x04) 

ADD mem, imm(ex>ADD [EBP-0x04], 0x01) 

 


6.SUB

첫번째 operand의 값과 두번째 operand의 값을 빼서 첫번째 operand에 저장(operand 2개)

"-="과 동일

결과 : a = -15, b = -2

*주석처리한결과가 다른 이유(주의!!!)

[EBP-0x08]은 b의 주소값이다. 그런데 b는 현재 0으로 초기화되있다. 

이 경우 0에서 -2를 하는 것이아니라 메모리공간의 끝인 256에서 -2가 되기때문에 254가 출력된다.


*그렇다면 a는 왜 그렇게 되지 않을까?

a는 현재 5라고 초기화되어 있고 바로 앞에서 이미 계산이 되고 있기 때문에 이어서 계산이 진행된다.


<사용가능한 operand>

SUB reg, reg(ex>SUB EAX,EBX) 

SUB mem,reg(ex>SUB [EBP-0x04], EAX) 

SUB reg, mem(ex>SUB EBX, [EBP-0x04])

SUB reg, imm(ex>SUB EAX, 0x04) 

SUB mem, imm(ex>SUB [EBP-0x04], 0x01) 

 


7.MOV

첫번째 operand에 두번째 operand의 값을 복사(대입) 한다(operand 2개)

변수 초기화와 동일

결과 : a = 16

<사용가능한 operand>

MOV reg, reg(ex>MOV EAX,EBX) 

MOV mem,reg(ex>MOV [EBP-0x04], EAX) 

MOV reg, mem(ex>MOV EBX, [EBP-0x04])

MOV reg, imm(ex>MOV EAX, 0x04) 

MOV mem, imm(ex>MOV [EBP-0x04], 0x01) 

 


*operand가  mem,mem 은 실행되지 않는다

<해결법> : mem의 값을 reg에 저장 후 사용


레지스터는 저장공간이기 때문에 어떠한 레지스터를 사용하던 상관없다.


<예제 1>

a=16;   b=5;    b++;  c=a+b; d=a-b; 를 어셈블리어로 표현하라.

결과 : a=16, b=6 c=22, d=10


<예제 2>

a=3;      b=5;      c=10;       b++;        c--;       a=b+c;      b=a-c; 를 어셈블리어로 표현하라.

결과 : a=15, b=6, c=9

'i2sec > Reverse Engineering' 카테고리의 다른 글

DAY 1 - 어셈블리언어  (0) 2014.04.25

DAY 1 - 어셈블리언어

i2sec/Reverse Engineering 2014. 4. 25. 23:21

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

- 이미 만들어진 시스템을 역으로 추적하여 처음의 문서나 설계기법 등의 자료를 얻어 내는 일을 말한다.

  즉, 실행파일을 분석해 소스코드를 알아내는 일


2.어셈블리언어란?

-기계어와 1:1 대응관계에 있는 언어를 말한다.

3.바이너리 디버거 종류

- Olly DBG

  =http://ollydbg.de

  =동적 악성코드 분석시 사용


- IDA Pro

  =http://hex-rays.com/odapro/idadown.htm

  =그래프뷰 기능 존재, 정적 악성코드 분석시 사용


-WinDBG

  =http://www.microsoft.com/whdc/devtools/debugging/default.mspx

  =MS사에서 제작

 =Kernel + User 디버깅 가능 (명령어로 입력해야되는 것이 단점)


4.레지스터

-cpu내에 존재하는 저장공간으로 읽는 속도가 가장 빠르다



32bit General-Purpose Resgisters (32bit 범용 레지스터)

 EAX

EBP 

 EBX

ESP 

 ECX

ESI 

 EDX

EDI 


 EFlAGS

 

 AF

 CF

OF 

PF 

SF 

ZF 


 EIP

 

 


*EAX 

 =누산기, 산술연산을 저장 하는 공간

 =리턴값 저장에 주로 사용


*EBX

 =간접 주소 저장 공간

 = ex> JMP 1000(1000 주소로 이동) == EBX =1000, JMP EBX


*ECX

 = 반복 카운터(반복문에서 사용)

 = 반복이 한번 진행될때마다 안의 값은 하나씩 감소

 = ECX>0

 = ECX=5  == 5번 반복


*EDX

 = EAX의 보조역할

 = ex>64bit의 값을 EAX에 담을 시 상위 32bit는 EAX에 저장되고 하위 32bit는 EDX에 저장된다.


//EBP와 ESP는 stack과 연관

*EBP

=스텍 프레임의 기준점(고정)


*ESP

=스텍 프레임의 최상단(유동적)


*스텍은 높은 곳에서 낮은 곳으로 변수 생성(그림에서는 올라가고 있지만 실질적으로는 주소 감소)


//ESI 와 EDI는 주소와 연관

*ESI

=시작 주소 저장


*EDI

=도착 주소 저장


*EFALGS

=상태값 저장(0,1) -> 1:set , 0:clear

=종류 : AF,CF,OF,PF,SF,ZF


*AF,CF,OF

=>자리올림=1, 자리내림=0


*PF

=> 짝수=1, 홀수=0


*SF

=> 음수:1, 양수 :0


*ZF

=> 산술 연산 결과 저장

=> (산술연살 결과 = 0) == 1 , 나머지 == 0 


*bit별 명칭 분류

EAX 

 

 4byte(32bit)


 AX

 

 2byte(16bit)

 AH / AL

 

 1byte(8bit)

 

 1byte(8bit)



*64bit 레지스터

=32bit 레지스터 앞에 'E'가 붙는데 이것을 'R'로 바꾸면 된다.

=ex> RAX,RCX,RDX


출처 == i2sec



'i2sec > Reverse Engineering' 카테고리의 다른 글

Day-02 어셈블리어  (0) 2014.04.28