[exploit writing] 1_스택 기반 오버플로우 (2)
공격코드를 작성하기 전에 지겨운 메모리에 대해 공부해야한다.
2. data segment : 변수들, 동적 버퍼
3. stack segment : 함수에 데이터나 인자를 전달하기 위해 사용
(스택 메모리에 직접 접근하기 원한다면 ESP를 사용)
1. text segment : 읽기 전용
2. data/bss segment : 쓰기 가능.고정된 크기로 전역 변수와 정적 변수를 저장하는 데 사용
-data : 초기화 된 전역 변수,문자열, 상수 등
-bss : 초기화 되지 않은 변수
3. stack : LIFO 구조를 가진 데이터 구조체
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가 공격자의 코드로 갈 수 있게 된다면 공격자는 통제권을 쥐게 된다.
• 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
목표
오버 플로우를 일으킬 메모리에 대해 알아보자. 특히 EIP , ESP1) 메모리의 구조
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
댓글
댓글 쓰기