본문 바로가기
반응형

80864

Buffer Overflow 원리 - 프로그램 구동시의 segment (2) EIP는 main()함수의 시작점을, ESP는 스텍의 맨 꼭대기를 가리킨다. ESP가 스텍의 맨 꼭대기를 가리키는 이유는 피로그램이 수행되면서 수많은 PUSH와 POP 명령을 할 것이기 때문이다. PUSH명령이 ESP가 가리키는 아래 지점에다 데이터를 넣을 것인지는 시스템 구조에 따라 다르다. 마찬가지로 POP명령이 ESP가 가리키는 지점의 데이터를 가져갈 것인지 아니면 ESP가 가리키는 지점 위의 데이터를 가져갈 것인지 역시 다르게 동작한다. ebp를 저장하는 이유는 이전에 수행하던 함수의 데이터를 보존하기 위해서이다. (이것을 base pointer라고도 부른다.) 함수가 시작될 때에는 이렇게 stack pointer와 base pointer를 새로 지정하는데 이러한 과정을 함수 프롤로그 과정이라고 .. 2021. 8. 6.
Buffer Overflow 원리 - 프로그램 구동시의 segment (1) 프로그램이 실행되어 프로세스가 메모리에 적재되고 메모리와 레지스터가 어떻게 동작하는지 알아보기 위하여 간단한 프로그램을 예제로 본다. gcc로 컴파일 해주고 gdb를 통해 disassamble을 해준다. 앞에 붙어 있는 주소는 logical address이다. 이 주소를 자세히 보면 function()함수가 아래에 자리 잡고 main()함수는 위에 자리잡고 있음을 알 수 있다. 위 그림과 같이 segment가 구성되었다. (메모리 주소는 임의로 적었습니다.) 이 프로그램에서는 전역변수를 지정하지 않았기 때문에 data segment에는 링크된 라이브러리의 전역변수 값만 들어있을 것이다. 이 프로그램이 시작되면 EIP 레지스터 즉, CPU가 수행할 명령이 있는 레지스터는 main()함수가 시작되는 코드를 .. 2021. 8. 6.
Buffer Overflow 원리 - 8086CPU 레지스터 구조 REGISTER 레지스터 명령어의 집합과 데이터들의 저장공간 범용 레지스터 논리 연산, 수리연산에 사용되는 피연산자, 주소를 계산하는데 사용되는 피연산자, 그리고 메모리 포인터가 저장되는 레지스터 세그먼트 레지스터 Code segment, Data segment, Stack segment를 가리키는 주소가 들어가 있는 레지스터 플래그 레지스터 프로그램의 현재 상태나 조건 등을 검사흔ㄴ데 사용되는 플래그들이 있는 레지스터 인스트럭션 포인트 다음 수행해야 하는 명령이 있는 메모리 상의 주소가 들어있는 레지스터 1. 범용 레지스터 프로그래머가 임의로 조작할 수 있게 허용되어 있는 레지스터. 일종의 4개의 32bit 변수라고 생각하면된다. 예전의 16bit 시절에는 각 레지스터를 AX, BX, CD, DX.. .. 2021. 8. 6.
Buffer Overflow 원리 - 8086 메모리구조 8086 메모리 구조 시스템이 초기화 되기 시작하면 시스템은 커널을 메모리에 적재시키고 가용 메모리 영역을 확인하게 된다. 기본적인 명령어 집합을 커널에서 찾기 때문에 반드시 저위치에 있어야한다. 기본적으로 커널은 64KByte 영역에 자리잡지만 이를 확장하여 오늘날의 운영체제들은 더 큰 영역을 사용한다. 32bit시스템에서는 한꺼번에 처리할 수 있는 데이터가 32bit단위로 되어 있기 때문에 메모리 영역에 주소를 할당할 수 있는 범위가 0~2^32-1이다. 64bit는 0~2^64-1의 범위를 가진다. 하나의 프로그램이 실행되기 위한 메모리 구조(운영체제는 하나의 프로세스를 실행시키면 이 프로세스를 segment라는 단위로 묶어서 가용 메모리에 저장시킨다. 이 그림과 같이 오늘날 시스템은 멀티태스킹이 .. 2021. 8. 6.
반응형