[정보 보안 개론] 코드 보안(프로그램 실행 구조-2, 셸-1)



- movl %esp, %ebp
- ESP(extended stack pointer) 레지스터는 항상 현재 스택 영역에서 가장 하위 주소를 저장
- 스택은 높은 주소에서 낮은 주소로 이동 및 데이터 저장
- 스택 확장 시 스택 포인터도 높은 주소에서 낮은 주소로 값이 변경됨
- 위의 명령은 현재의 SP 값을 EBP 레지스터에 저장하라는 의미
- pushl %ebp와 movl %esp, %ebp는 새로운 함수 시작 시 항상 똑같이 수행하는 명령

- 위의 이미지는 movl %esp, %ebp 실행 시 스택의 구조를 나타냄
- subl $4, %esp
- ESP 값(int c 할당 값)에서 4바이트만큼 뺀다는 의미
- 스택에 4바이트의 용량 할당
- pushl $2
- pushl $1
- call function
- function 함수 호출
- 4~6 단계는 function(1, 2)에 대한 코드

- pushl $2, pushl $1, call function 실행 시 스택의 구조
- pushl %ebp
- function 함수의 기준 값으로, 현재 EBP 값을 스택에 저장


- 모든 프롤로그 실행

- subl $12, %esp
- ESP 값(char buffer(10)의 할당 값)에서 12바이트 뺌(스택에 12바이트의 용량 할당)
- 소스 코드에서 'char buffer(10)'과 같이 10바이트만큼 할당되도록 했으나 스택에서는 4바이트 단위로 할당되므로 12바이트 할당

- movl 12(%ebp), %eax
- EBP에 12바이트를 더한 주소 값의 내용(정수 2)을 EAX 값에 복사
- 누산기인 EAX(extended accumulator) 레지스터는 입출력과 대부분의 산술 연산에 사용
- 예를 들면 곱셈, 나눗셈, 변환 명령은 EAX 사용

- addl %eax, 8(%ebp)
- EBP에 8바이트를 더한 주소 값의 내용(정수 1)에 EAX(10 단계에서 2로 저장) 값을 더함

- movl 8(%ebp), %edx
- EDX(extended data) 레지스터는 입출력 연산에 사용
- 근 수의 곱셈과 나눗셈 연산 시 EAX와 함께 사용
- 12번 명령은 EBP에 8바이트를 더한 주소 값의 내용(정수 3)을 EDX에 저장
- a = a + b의 결과를 저장하는 과정


셸
- shell
- 운영체제를 둘러싸고 있으면서, 입력받는 명령어를 실행하는 명령어 해석기

- 윈도우에서 볼 수 있는 명령 창도 셸이라고 할 수 있음
- 셸의 종류는 매우 다양
- 본 셸(bourne shell),C 셸(C shell), 콘 셸(korn shell)로 나뉨
본 셸(bourne shell)
- 유닉스 시스템에서 사용하는 기본 셸
- 셸의 역할
- 자체 내장 명령어 제공
- 입출력, 오류에 대한 리다이렉션(redirection) 기능 제공
- 와일드카드(wildcard) 기능 제공
- 파이프라인 기능 제공
- 조건부, 무조건부 명령열(sequence) 작성 기능 제공
- 서브셸(subshell) 생성 기능 제공
- 후면 처리(background processing) 가능
- 셸 스크립트(shell script, 프로그램) 작성 가능
셸을 공부하는 이유
- 버퍼 오버플로우나 포맷 스트링 공격을 통해 얻고자 하는 것이 관리자 권한의 셸이기 때문
- 관리자 권한을 얻더라도 시스템에 어떤 명령을 입력할 인터페이스가 없으면 무용지물
- 결론적으로 획득한 관리자 권한을 이용한 셸이 필요
/bin/sh
- 위의 명령으로 셸을 실행하고 exit 명령으로 셸을 빠져나올 수 있음