SYSTEM

(FSB)두가지 방법의 FSB

말뚝_2 2014. 7. 27. 18:44

FSB기법에는 여러가지 방법이 있는데, .dtor의 주소를 사용해서 함수의 RET를 바꿔주는 방법과 GOT주소를 이용하는 방법을 알아볼것이다.

일단 .dtors를 이용한 fsb에 대해 먼저 보자.

.dtors

GNU 컴파일러는 컴파일시에 .ctors, .dtors 두 세그먼트를 생성하는데, 

.ctors속성의 함수는 main() 전에 실행되고, .dtors 속성의 함수는 main() 종료 후에 실행된다

그러므로 main 함수가 종료된 다음 .dtors 속성의 함수가 실행되는 것을 이용해 .dtors 속성의 함수 내용을 얻어내면 해당 영역에서 호출되는 함수들의 주소값을 알아낼 수 있는것이다.

즉, .dtors성격을 가진 함수의 ret값을 가져와서 해당 ret 주소에 쉘코드가 담긴 환경변수의 주소값을 넣어주는 것이다.

이 방법은 해당 함수가 종료된 후에 쉘이 실행되도록 하는 방법이다.


그다음은 GOT주소를 이용한 fsb를 볼것인데, 일단 GOT주소가 무엇인고

PLT(Procedure Linkage Table)

PLT는 일종의 실제 호출 코드를 담고 있는 테이블로써 이 내용 참조를 통해 _dl_runtime_resolve가 수행되고, 실제 시스템 라이브러리 호출이 이루어지게 된다

GOT(Global Offset Table)

GOT는 PLT가 참조하는 테이블로써 프로시져들의 주소를 가지고 있는데, PLT가 어떤 외부 프로시져를 호출할 때 이 GOT를 참조해서 해당 주소로 점프하게 된다.

함수를 맨 처음 호출할때는 PLT로 이동해서 GOT를 참조, 다시 PLT로 이동해서 dl_runtime_resolve 를 수행해 GOT를 저장한후 실제 함수 주소로 점프하는데, 같은 함수를 다시 호출할 때는 이미 GOT에 실제 함수의 주소가 저장되어 있으므로 함수를 호출한 다음 PLT에서 바로 GOT를 참조하여 함수로 점프할 수 있게 된다.

즉, got주소를 이용한 fsb는 함수의 ret주소를 변조하는것이 아닌, 함수가 실행될 주소를 변조하는 방법이라고 할 수 있다.

이방법을 사용하기 위해서는 일단 프로그램 내에서 같은 함수가 두번 이상 호출되어야 한다. 그래야만 GOT에 실제 함수의 주소가 들어있어 PLT에서 GOT를 바로 참조할 수 있기 때문. 두번이상 호출되지 않은 함수를 사용한다면 함수로의 점프가 곧바로 이루어 지지 않아 원하는 결과를 얻을 수 없을것이다.

fsb를 할떄는 이 두번이상 호출된 함수의 GOT주소값을 불러와 해당 주소에 쉘코드가 담긴 환경변수의 주소값을 넣어준다.

이 방법은 해당 함수가 실행될때에 이동하는 주소를 바꿔서 함수대신 쉘코드가 실행되게 하는 방법이다. 해당 함수가 시작할때에 쉘이 실행된다.