이번엔 프로그램이 실행되면 프로세스가 메모리에 적재되고 메모리와 레지스터의 동작을 간단한 프로그램을 통해 확인해보자.
위와같은 간단한 소스를 짜고 컴파일 ( gcc -s )까지 하자.
그 후 simple.c 프로그램이 컴파일 되어 실제 메모리상 어느위치에 존재하는지 확인해보기 위해 gdb를 이용하여 어셈블리 코드와 메모리에 적재될 logical address를 살펴보자. ( 각자 실행 )
살펴보면 function()함수가 아래에 자리잡고 main()함수는 위에 자리잡음을 확인할 수 있다.
따라서 메모리 주소를 바탕으로 생성될 이 프로그램의 segment 모양은 다음과 같다.
이 소스에는 전역변수를 지정하지 않았기 때문에 data segment에는 링크된 라이브러리의 전역변수값만 들어있을 것이다.
이제 프로그램이 실행되면 EIP 레지스터 ( CPU가 수행할 명령이 있는 레지스터 ) 는 main()함수가 시작되는 코드를 가리킬 것이다.
그리고 ESP는 스택의 맨 꼭대기를 가리키고 있다. ( 그 이유는 프로그램이 수행되면서 수많은 PUSH&POP 명령을 이 지점에다 해야하기 떄문 )
main에 ebp를 저장하는 이유는 이전에 수행하던 함수의 데이터를 보존하기 위해서다. 이것을 base pointer라고 부른다.
그리고 함수가 시작될 때는 이렇게 sp와 bp를 새로 지정하는데 이러한 과정을 함수 프롤로그 과정이라고 한다.
<main> push %ebp를 수행하여 이전 함수의 bp를 저장하면 sp는 4바이트 아래를 가리킬 것이다.
<main+1> move %esp,%ebp를 수행하여 ESP값을 EBP에 복사하였다. 따라서 함수의 bp와 sp는 같은 지점을 가리키게 된다.
<main+3> sub $0x8,%esp 는 ESP에서 8을 빼는 명령이다. 따라서 ESP는 8바이트 아래 지점을 가리킬 것이고 스택에 8바이트 공간이 생긴다.
<main+6> and $0xffffff0,%esp는 ESP와 AND연산을 한다. 이것은 ESP의 주소값의 맨 뒤 4bit를 0으로 만들기 위함이다.
<main+9> EAX 레지스터에 0을 넣고
<main+14> ESP에서 EAX값 만큼을 뺀다. 이것은 스택 포인터를 EAX만큼 확장시키려 하는거지만 0이니 의미없음.
<main+16> ESP에서 4를 뺀다. -> 스택을 4바이트 확장한다. 여태 ESP는 총 12바이트 이동했다.
<main+19 ~ 23> 이건 function(1,2,3)을 수행하기 위해 인자값 1,2,3을 차례로 넣어준다. 순서가 3,2,1 거꾸로 되어있는 이유는 스택에서 끄집어 낼때는 거꾸로 나오기 때문이다.
<main+25> 0x80482f4에 있는 명령을 수행하라는 의미다. 저 주소는 function 함수가 자리잡은 위치다.
call 명령은 함수를 호출할 때 사용되고 함수 실행이 끝난 다음 다시 명령을 계속 수행할 수 있도록 이후 명령이 있는 주소를 스택에 넣은다음 EIP에 함수의 시작지점의 주소를 넣는다.
함수 수행이 끝나고나면 이제 어느 명령을 수행해야 하는가를 스택에서 POP하여 알 수 있게된다. 이것이 바로 BOF에서 가장 중요한 return address이다.
이제 EIP에는 function함수가 있는 0x80482f4 주소값이 들어가게 된다. 이제 EIP는 함수 function함수 시작지점을 가리키고있고 , 스택에는 main() 함수에서 넣었던 값들이 차곡차곡 쌓여있다.
<function ~ +1> function함수에서도 마찬가지로 함수 프롤로그 수행, main()함수에서 사용하던 bp가 저장되고 sp를 function()함수의 bp로 삼는다.
<function+3> 스택을 40바이트 확장한다. ( 스택은 word (4byte) 단위로 자란다. )
그 이후 leave instruction을 수행해서 프롤로그 작업을 되돌린다.
ret instruction은 이전 함수로 return하라는 의미다. EIP레지스터에 return address를 POP하여 집어넣는 역할을 한다.
'Hacking & Security > System' 카테고리의 다른 글
PLT & GOT (0) | 2018.10.31 |
---|---|
Linux 환경에서의 메모리 보호기법 (0) | 2018.08.21 |
환경변수란 ? (0) | 2018.01.30 |
Buffer Overflow Basic 3 (0) | 2018.01.16 |
Buffer Overflow Basic 1 (0) | 2018.01.16 |