[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를 통제함으로써 함수가 '정상적인 흐름을 재개'하기 위해 사용할 리턴 어드레스를 변경할 수 있다. ㄷ. ...