본문 바로가기
Reverse Engineering/gdb

gdb - Segmentation Fault, 대괄호 [ ]

by manchesterandthecity 2020. 10. 7.

gdb 명령어) 

 

PUSH : 스택에 데이터를 삽입

 

ex) push word

     push dword

     push word

 

• push 명령어는 자동으로 ESP를 4 바이트 감소 시킴

 

 

 

POP : 스택에서 데이터를 꺼냄(현재 위치한 스택인듯?)

 

ex) pop eax

     pop ebx

 

• 스택에서 4 바이트를 꺼내와 지정한 레지스터에 삽입

• pop 명령어는 자동으로 ESP를 4 바이트 증가 시킴

 

 

 

 

Segmentation Fault

이 프로그램( a.out )을 실행하면 어떤 결과가 나올까요? Segmentation Fault

 

 

Segmentation Fault

 

• 프로그램이 허용되지 않은 메모리 영역에 접근을 시도하거나, 잘못된 방법으로 메모리 영역에 접근을 시도할 경우 발생한다.

 

 

발생 이유)

 

프로그래머가 생각하지 못한 사용자 입력값이 있었다?

• 그냥 프로그램을 잘못 짰다

• 프로그램에 문제가 있다는 의미

 

 

즉, 끝맽음을 제대로 하지 않은 것이다.

 

프로그램의 끝은 시스템 콜을 이용해야 함.

 

 

 

시스템 콜

<system calls list>

 

 

system calls list에 의하면,

 

eax 에 들어가는 값 1이 함수 코드번호이고 1번은 exit함수를 뜻한다.

ebx 에 들어가는 값 0은 인자로 들어가는 값이다.

 

즉, C언어 코드로 해석하면 exit(0)란 의미이다.

따라서 프로그램을 종료하겠다는 의미가 된다.

 

 

결국 이 프로그램( a.out )이 이제는 정상적으로 종료된다.

 

 

 

 

대괄호 [ ]의 사용.

 

어셈블리언어에서 대괄호( [ ] )는 포인터를 의미한다. 즉, 해당 값이 가리키는 주소를 의미한다.

 

 

위 코드에서의 사용 예를 보면,

mov      dword  [ebx],   0x10

 

16진수 0x10이라는 값을 ebx가 가리키는 주소에 4바이트 크기(dword)의 공간에다 넣어라. 하는 의미가 된다.

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

lea, and, or, xor 명령어  (0) 2020.10.10
sub, add 명령어  (0) 2020.10.10
gdb 명령어, 리틀엔디언 방식  (0) 2020.10.07
gdb 실행, 명령어  (0) 2020.10.07
gdb at&t 방식을 intel 방식으로 바꾸기  (0) 2020.10.07

댓글