본문 바로가기

Hacking & Security/System

Buffer Overflow Basic 2

이번엔 프로그램이 실행되면 프로세스가 메모리에 적재되고 메모리와 레지스터의 동작을 간단한 프로그램을 통해 확인해보자.


위와같은 간단한 소스를 짜고 컴파일 ( 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