ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [02-21 공부정리(PLT & GOT 정리)]
    공부정리 2018.02.21 03:20

    오랜만에 쓰는 공부 정리 글이다...

    이번에는 그동안 ROP를 공부하면서 얻었던 지식들을 정리할 생각이다. 

    Chaining RTL이랑 비슷한 부분이 많이 있지만, PLT와 GOT 그리고 bss영역을 이용하는 점이 달랐다.

    자 그럼 정리를 시작해보겠다.




    [PLT & GOT]

    우선 이 글을 정리하는데 가장 도움이 되었던 블로그는 블랙펄 시큐리티 블로그였다.

    [블랙펄 시큐리티 PLT & GOT 정리글]

    굉장히 자세하고, 이해하기 쉽게 정리해주셨으니 참고하길 바란다.


    우선 PLT와 GOT를 알기전에 '링킹(Linking)'이라는 것을 알아야 한다.

    printf("Hello world") 라는 함수를 가진 소스파일이 컴파일 과정을 거치면 .OBJ 파일이 만들어진다.

    이 OBJ파일로는 printf( )가 어떤 동작을 하는 함수인지 알 수 없다.


    여기서 링킹과정을 거치는데, OBJ파일에 있는 printf( )와 라이브러리의 printf( )실행코드를 연결하는 작업이 이루어진다.

    이 링킹과정이 끝나면 실행파일이 생성되는 것이다.


    [Static Link / Dynamic Link]

    이 링크방식도 두가지로 나뉜다.

    우선 Static Link 방식은 실행파일을 생성할 때, 라이브러리 내용을 포함해서 파일을 생성한다.

    이 방식을 이용하면 실행파일에 모든 코드들이 포함되어 있기 때문에, 라이브러리 연동과정이 필요 없고

    라이브러리와 독립되어 실행파일을 관리하기 편해진다.

    하지만, 그만큼 파일의 크기가 커지고 여러프로그램이 동일한 라이브러리를 사용한다해도 

    각각 메모리에 매핑시켜줘야 하기 때문에 메모리 낭비가 발생한다.


    Dynamic Link방식은 Static Link와 다르게 라이브러리를 공유하여 사용한다.

    라이브러리를 하나의 메모리 공간에 매핑시켜놓고, 여러프로그램들에게 공유되어 사용된다.

    이렇게 되면, 실행파일의 크기가 훨씬 작아지고 메모리 낭비도 줄일 수 있다.

    하지만, 라이브러리가 없으면 실행이 불가능하기 때문에 의존성이 높아진다.


    PLT와 GOT는 Dynamic Link방식에서 사용된다.

    위에서 말한 것처럼 printf( )를 사용하려면 라이브러리에서 실제 코드내용을 알아와야 하기때문에

    그 역할을 PLT와 GOT로 나눠서 사용하고 있는 것이다.


    Dynamic Link방식에서 함수를 호출하면, 그 함수는 PLT를 참조 하는데 PLT는 GOT로 점프를 하게된다. 

    GOT에는 실제 함수주소가 저장되어 있어서 호출한 함수가 실행되는 것이다.


    여기서 첫 호출인지 아닌지에 따라서 동작 과정이 달라지는데, 첫 호출때는 GOT에 실제주소가 저장되어 있지 않다.

    이 때는 [_dl_runtime_resolve] -> [dl_fixup_] -> [dl_lookup_symbol_x] 순으로 실제주소를 알아오게 된다.

    이 첫 호출 과정이 지나면, GOT는 실제 주소를 저장하고 있다가 두 번째 호출때는 바로 실제주소로 넘어가게 되는 것이다.


    ROP공격기법에서는 이 점을 이용해서 [GOT Overwrite]공격을 사용한다.

    첫 호출과정이 끝난 함수의 GOT를 System( )의 주소로 덮어쓰기 해놓으면 

    다음에 해당 함수가 실행될 때, PLT -> GOT로 바로 참조하기 때문에 System( )가 실행되게 되는 것이다.


    다음 글에서 ROP공격을 실습해보면서 이해를 돕도록 하겠다.


    댓글 0

Designed by Tistory.