본문 바로가기
Reverse Engineering/gdb

sub, add 명령어

by manchesterandthecity 2020. 10. 10.

sub 명령어

[어셈블리 코드]

main:

            mov      eax,  esp                                    (1)

            sub       esp,  8                                        (2)

            mov      [eax],  dword 1                          (3)

            mov      [eax-4],  dword 2                       (4)

            sub       [eax-4],  dword 1                       (5)

 

[스택 주소]

(시작)

 

high

 

bffff0a0                       <-  esp                     처음엔 esp가 최상단 주소를 가리키고 있음.

bffff09c

bffff098

 

low

 

 

(1)        mov      eax,  esp   

 

high

 

bffff0a0                       <-  esp                     

                                 <-  eax                      esp가 가리키는 주소를 eax에도 할당.

bffff09c

bffff098

 

low

 

 

(2)        sub       esp,  8

 

high

 

bffff0a0                       <-  eax

bffff09c

bffff098                       <-  esp                       sub 명령어를 통해 esp가 가리키는 주소를 8만큼 내린다(빼준다).

                                         (즉, 주소 공간을 2개 만큼 아래로 확보한다는 말? 각 주소는 4크기 만큼의 차이가 있다.)

low

 

 

(3)        mov      [eax],  dword 1

 

high

 

bffff0a0                       <-  eax

bffff09c

bffff098                       <-  esp                     

 

low

 

 

<주소값 출력>

bffff0a0   :         0x00000001                           eax가 가리키는 주소에 1 값 할당.

                                             (dword는 4바이트이므로 주소 크기에 맞게 4바이트 만큼 확보하고 1값을 할당한 것.)

 

 

(4)        mov      [eax-4],  dword 2

 

high

 

bffff0a0                       <-  eax

bffff09c

bffff098                       <-  esp                     

 

low

 

 

<주소값 출력>

bffff09c   :         0x00000002                eax가 가리키는 주소(bffff0a0)에 4 만큼 뺀(내려간) 주소(bffff09c)에 2 값 할당.

                                             (dword는 4바이트이므로 주소 크기에 맞게 4바이트 만큼 확보하고 2값을 할당한 것.)

 

 

(5)        sub       [eax-4],  dword 1 

 

high

 

bffff0a0                       <-  eax

bffff09c

bffff098                       <-  esp                     

 

low

 

 

<주소값 출력>

bffff09c   :         0x00000001       

 

                                    eax가 가리키는 주소에 4 만큼 뺀(내려간) 주소(bffff09c)의 값(0x00000002)에서 1만큼을 sub

                                   (dword는 4바이트이므로 주소 크기에 맞게 4바이트 만큼 확보하고 1값을 뺸 것.)

 

 

add 명령어

[어셈블리 코드]

main:

            mov      eax,  esp                                    (1)

            add       esp,  8                                        (2)

            mov      [eax],  dword 1                          (3)

            mov      [eax+4],  dword 2                       (4)

            add       [eax+4],  dword 1                       (5)

 

[스택 주소]

(시작)

 

high

 

bffff0a8

bffff0a4

bffff0a0                       <-  esp                     처음엔 esp가 최상단 주소를 가리키고 있음.

bffff09c

bffff098

 

low

 

 

(1)        mov      eax,  esp   

 

high

 

bffff0a8

bffff0a4

bffff0a0                       <-  esp                     

                                 <-  eax                      esp가 가리키는 주소를 eax에도 할당.

bffff09c

bffff098

 

low

 

 

(2)        add       esp,  8

 

high

 

bffff0a8                       <-  esp

bffff0a4

bffff0a0                       <-  eax

bffff09c

bffff098                                               

 

low

 

 

                                             add 명령어를 통해 esp가 가리키는 주소를 8만큼 올린다(더한다).

                                            (즉, 주소 공간을 2개 만큼 위로 확보한다는 말? 각 주소는 4크기 만큼의 차이가 있다.)

 

 

(3)        mov      [eax],  dword 1

 

high

 

bffff0a8                       <-  esp

bffff0a4

bffff0a0                       <-  eax

bffff09c

bffff098                                            

 

low

 

 

<주소값 출력>

bffff0a0   :         0x00000001                           eax가 가리키는 주소에 1 값 할당.

                                             (dword는 4바이트이므로 주소 크기에 맞게 4바이트 만큼 확보하고 1값을 할당한 것.)

 

 

(4)        mov      [eax+4],  dword 2

 

high

 

bffff0a8                       <-  esp

bffff0a4

bffff0a0                       <-  eax

bffff09c

bffff098                       

 

low

 

 

<주소값 출력>

bffff0a4   :         0x00000002             eax가 가리키는 주소(bffff0a0)에 4 만큼 더한(올라간) 주소(bffff0a4)에 2 값 할당.

                                             (dword는 4바이트이므로 주소 크기에 맞게 4바이트 만큼 확보하고 2값을 할당한 것.)

 

 

(5)        add       [eax+4],  dword 1 

 

high

 

bffff0a8                       <-  esp

bffff0a4

bffff0a0                       <-  eax

bffff09c

bffff098                                      

 

low

 

 

<주소값 출력>

bffff0a4   :         0x00000001       

 

                                eax가 가리키는 주소에 4 만큼 더한(올라간) 주소(bffff0a4)의 값(0x00000002)에서 1만큼을 add

                                   (dword는 4바이트이므로 주소 크기에 맞게 4바이트 만큼 확보하고 1값을 더한 것.)

 

 

 

 

 

댓글