어셈블리 코드로서, gdb로 오픈 시 형태가 다를 수 있음.

 

#1.

global main

section .text
main:

mov ebx, eax    -------------- ebx에 eax의 주소값 복사         : *eax = 0xf7fbb808
mov ebx, 0xbffff098 -------- ebx에 0xbffff098 복사            : *ebx = 0xbffff098
mov dword [eax], 0x10 ---- eax의 주소값 안에 0x10 복사    : eax = 0x10 (0xf7fbb808 = 0x10)

mov ebx, dword [eax] ------ ebx에 eax의 주소값 안에 들어있는 값 복사 : *ebx = eax --> *ebx = 0x10
mov ebx, eax   -------------- ebx에 eax의 주소값 복사         :  ebx = 0xf7fbb808

 

#초기 주소값과 데이터

*eax = 0xf7fbb808

*ebx = 0x0

eax = 0xffffcd9c

ebx = Cannot access

 

mov

 - 데이터 복사 명령어

 - lea와의 차이 뒤에 기술.

 - mov ebx, eax ---> ebx = 0x7fbb808

 - mov ebx, [eax] --> ebx = 0xffffcd9c

 

 

#2.

global main

section .text
main:
mov eax, esp   ---------- eax에 esp의 주소값 복사                                         : *eax = 0xffffccfc
sub  esp, 8   ------------- esp의 주소에 8를 빼기연산                                      : *esp = 0xffffccf4 
mov [eax], dword 1 ----- eax의 주소 안에 0x1 데이터를 복사                           : eax = 0x1 ---> 0xffffccfc = 0x1
mov [eax-4], dword 2 --- eax의 주소에서 4를 뺀 주소 안(값)에 0x2 데이터를 복사 

                                                                                                       : [eax-4] = 0x2 ---> 0xffffccf8 = 0x2
sub [eax-4], dword 1 ---- eax의 주소에서 4를 뺀 주소 안에 0x1 데이터를 복사

                                                                                                       : [eax-4] = 0x1 ---> 0xffffccf8 = 0x1

 

#초기 주소값과 데이터

*eax = 0xf7fbb808

*esp = 0xffffccfc

eax = 0xffffcd9c

[eax-4] = 0x00000000

 

 

#3.

section .text
main: 
        mov     eax, 1 ------------ eax의 주소에 0x1 복사                                : *eax = 0x1, eax = {cannot access}
        mov     ebx, 4 ------------ ebx의 주소에 0x4 복사                               : *ebx = 0x4, ebx = {cannot access}

       mov    ecx, 7  ------------ ecx의 주소에 0x7 복사                                 : *ecx = 0x7, ecx = {cannot access} 
        lea     eax, [eax+ecx] ---- eax의 주소에 *eax+*ecx의 주소값                : *eax = 0x8, eax = {cannot access} 

        lea     ebx, [ebx*4] ------- ebx의 주소에 *ebx * 4 = 4*4 --> 0x10 복사 :  *ebx = 0x10, ebx = {cannot access}
        mov     eax, [eax+ecx] --- eax(*1=?), ecx(*7=?) --> 0x1과 0x7에는 메모리가 접근 불가.(힙으로 추정)

                                                                            에러 후 종료

        mov     eax ---------------- 

 

#초기 주소값과 데이터

(시작부터 복사해서 의미없음)

 

 

#4.

global main

section .text
main:
        mov     eax, 0x33 ------- eax의 주소에 0x33 복사          : *eax = 0x33
        mov     ebx, 0x55 ------- ebx의 주소에 0x55 복사         :  *ebx = 0x55
        mov     ecx, 0x42 -------- ecx의 주소에 0x42 복사        :  *ecx = 0x42

        and     eax, ebx  --------- eax의 주소와 ebx의 주소를 and연산 : *eax = 0x11
        or      eax, ecx ----------- eax의 주소와 ecx의 주소를 or연산 :  *eax = 0x53
        xor     eax, 0xac ---------- eax의 주소와 0xAC를 xor 연산 : *eax = 0xFF

 

+) and, or, xor 연산

1. and 연산 : 둘 모두 같아야 1

*eax = 0x33 = 0011 0011

*ebx = 0x55 = 0101 0101        and

-----------------------------------------

                    0001 0001  ----> 0x11

 

2. or 연산 : 둘 중 하나라도 1이면 1

*eax = 0x11 = 0001 0001

*ecx = 0x42 = 0100 0010          or

-----------------------------------------

                   0101 0011 ------> 0x53

 

3. xor 연산 : 둘이 서로 (무조건)달라야 1

*eax    = 0x53 = 0101 0011

*0xAC = 10, 12= 1010 1100        xor

------------------------------------------

                      1111 1111 ----> 0xFF 

 

#5.

global main

section .text
main:
        mov     eax, 2 ------- eax의 주소에 2를 복사 eflags=0x246
        cmp     eax, 2 ------- eax의 주소와 2를 비교 eflags=0x246
        cmp     eax, 1 ------- eax의 주소와 1을 비교 eflags=0x202
        cmp     eax, 3 ------- eax의 주소와 3을 비교 eflags=0x297

        test    eax, eax ------ eax의 주소와 eax의 주소를 and연산 eflags=0x202 
        mov     eax, 0 ------- eax의 주소에 0 복사 eflags=0x202
        test    eax, eax ------ eax의 주소와 eax의 주소를 and 연산 eflags=0x246

 

+)

cmp : oper1 - oper2 ---> +,-,0 나올 수 있음.

 

EFLAGS Register

ex)202

0010 | 0000 | 0010 -----------> [IF]

OF DF IF TF | SF ZF 0 AF | 0 PF 1 CF

 

 

OF(Overflow Flag) : 연산의 결과 값이 Sign-bit(MSG)를 제외한 최대 허용 정수값보다 크거나,

                          최소 정수값보다 작으면 1이 된다. --> overflow check

 

DF(Direction Flag) : 문자열을 처리하는 명령(MOVS, CMPS, SCAS, LODS, STOPS)를 제어하는 플래그.

                          1이 되어 있으면 높은 주소에서 낮은 주소대로 처리, 0이면 낮은 주소에서

                          높은 주소로 처리한다. (assembly = STD : set(1), CLD : clear(0))

 

IF(Interrupt Flag) : 프로세스로부터 인터럽트가 발생하면 인터럽트 처리를 할 것인지 제어.

                       1이 되어 있으면 인터럽트 신호가 발생 시 인터럽트를 처리.

                       0인 경우는 인터럽트 신호 와도 반응안함.

 

TF(Trap Flag) : 디버깅 시 Single step mod 활성화 하였을 때 1이 된다.

                   명령 실행 시 TF를 세트하여 하나의 명령씩 프로그램을 수행 가능

 

SF(Sign Flag) : 최상위 bit의 결과와 같은 결과로 설정된다. Signed Integer로 사용되는 경우

                   SF가 0이면 양수, 1이면 음수를 나타낸다.

 

ZF(Zero Flag) : 산술 연산 결과가 0인 경우 1이 되고 아니면 리셋.

                    보통 값 비교에서 oper1 - oper2=0 (같음) 혹은 루프에서 1씩 차감하여

                    0이 되면 루프를 빠져나오게 하는 등의 방식으로 활용되는 플래그.

 

AF(Adjust Flag) : 산술연산 수행결과가 bit3 자리에 자리 올림이나 내림이 발생할 때 1이 됌.

                      10진법(BCD) 연산에 사용되는 플래그.

 

PF(Parity Flag) : 산술연산 수행결과가 하위 1Byte 중 1bit가 짝수면 1, 아니면 0이 된다.

 

CF(Carry Flag) : 산술연산 수행결과가 자리 올림이나 자리 내림이 발생할 때 1이 된다.

 

참고 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=no1rogue&logNo=30095428920 

 

즉, 3번째 줄 cmp     eax, 1 에서 eflags가 202가 나왔는데, 이는

0010 0000 0010 을 뜻하고, IF 하나만 세팅되었다는 것을 알 수 있다.

 

 

#6.

global main

section .text
main:
        mov     ecx, 0  ------------- ecx의 주소에 0 복사                      : *ecx = 0
        mov     eax, ecx ----------- eax의 주소에 ecx의 주소 복사          : *eax = 0
        inc     ecx ------------------ ecx의 주소에 1 증가                       : *ecx = 1
        cmp     ecx, 255 ----------- ecx의 주소에 255를 빼서 and연산     : *ecx - 255 != 0 ----> 1 != 255 [ZF = 0]
        jne     0x8048067 ---------- 같지 않으면 0x8048067로 점프       
        ret

 

 

+ Recent posts