[exploit writing] 1_스택 기반 오버플로우 (2)

공격코드를 작성하기 전에 지겨운 메모리에 대해 공부해야한다.

목표

오버 플로우를 일으킬 메모리에 대해 알아보자. 특히 EIP , ESP

1) 메모리의 구조

1. code segment : 프로세서가 실행하는 명령. EIP는 다음 명령의 트랙을 갖고 있음
2. data segment : 변수들, 동적 버퍼
3. stack segment : 함수에 데이터나 인자를 전달하기 위해 사용
(스택 메모리에 직접 접근하기 원한다면 ESP를 사용)

2) 프로세스 메모리 맵



1. text segment : 읽기 전용
2. data/bss segment : 쓰기 가능.고정된 크기로 전역 변수와 정적 변수를 저장하는 데 사용
       -data : 초기화 된 전역 변수,문자열, 상수 등
       -bss : 초기화 되지 않은 변수
3. stack : LIFO 구조를 가진 데이터 구조체

3) 스택 사용 예제



do_something (param1) 이 호출 될 경우 개략적으로 다음과 같은 과정이 발생
PUSH *param1 -> CALL do_something -> PUSH EIP -> PUSH EBP -> PUSH buffer[128]
특정함수의 작업이 끝나면 전체 흐름은 main 함수로 돌아오게 된다.

ㄱ. 버퍼 오버플로우를 발생시키기 위해 do_something::buffer 공간, 저장된 EBP, 그리고 최종적으로 저장된 EIP의 값을 덮어쓸 필요가 있다. buffer+EBP+EIP를 덮어쓴 후 스택 포인터는 저장된 EIP 다음 위치를 가리키게 된다.

ㄴ. 함수 do_something이 리턴한 뒤 EIP와 EBP는 스택으로부터 pop되고, 버퍼 오버플로우 시 설정된 값을 가지게 된다. 간단히 말해서, EIP를 통제함으로써 함수가 '정상적인 흐름을 재개'하기 위해 사용할 리턴 어드레스를 변경할 수 있다.

ㄷ. 만약 buffer, EBP, EIP를 덮어쓴 뒤, ptr 부분에 공격자의 코드를 놓을 수 있다면, 그리고 EIP가 공격자의 코드로 갈 수 있게 된다면 공격자는 통제권을 쥐게 된다.

4) CPU 범용 레지스터 

• EAX: accumulator: 계산을 위해 사용되며, 함수 호출의 리턴 값을 저장한다. 더하기, 빼기, 비교등과 같은 기본적인 연산은 이 범용 레지스터를 사용한다.
• EBX: base(base pointer와 관련 없음). 범용성은 없으며, 데이터를 저장하는데 사용될 수 있다.
• ECX: counter: 반복을 위해 사용되며, 아래쪽으로 카운트한다.
• EDX(data): 이것은 EAX 레지스터의 확장이며, 더 복잡한 계산(곱하기, 나누기)을 가능하게 한다.
ESP: stack pointer
EBP: base pointer
• ESI: source index: 입력 데이터의 위치를 가지고 있음
• EDI: destination index: 데이터 연산 결과가 저장되는 위치를 가리킴
EIP : instruction pointer


/*보충*/
ESP : 공부하다가 헷갈려 정확히 하자면, 스택의 크기를 조정할 때 사용되는 레지스터로 스택의 최상단 주소값을 가지고 있다. 즉, 스택의 크기를 나타냄.

출처 : Exploit Writing By Corelan

댓글

이 블로그의 인기 게시물

윈도우 설치에서 파티션 설정 오류(NTFS)

[exploit writing] 1_스택 기반 오버플로우 (1) First

하둡 설치 오류 정리