GOT overwrite란 dynamic link방식으로 컴파일된 바이너리가 공유 라이브러리를 호출할때 사용되는 PLT&GOT 중 GOT 값을 변조하여 내가 의도한 함수를 호출 하도록 하는 기법이다.

ex) printf -> system

 

간단한 예를 들어보자

#include <stdio.h>

int main()
{
	print("/bin/sh");
}

print 함수를 필요로하는 코드이다.

 

이 코드를 gdb로 확인해보면 printf를 plt로 호출하는 printf@plt 부분을 찾을수 있을 것이다.

gdb를 이용해 printf@plt부분을 디스어셈블 해보면

 

jmp   *0x00000000

push  $0x0

jmp    0x00000000

 

로 구성되어져 있는 것을 확인 할수 있다.

첫번째 jmp는 GOT안에 있는 값을 가리킨다.

*0x00000000 이값을 system 함수의 주소 값으로 바꿔주면 된다.

 

그렇게 jmp 부분값을 overwrite 하여 system 함수로 바꿔주고 실행시킨다면 PLT에서는 변조된 값을 불러오게 된다.

printf("/bin/sh"); -> system("/bin/sh");

 

이렇게 PLT&GOT과정에서 GOT값을 사용자가 덮어씌움으로써 GOT Overwrite가 일어난다.

직접 실습 해보는 걸 추천한다.

'Basic Concepts > System' 카테고리의 다른 글

메모리 영역  (0) 2020.04.26
PLT & GOT 정리  (0) 2020.04.24
RTL(Return to libc) & chaining  (0) 2020.04.23
Fake EBP  (0) 2020.04.22
SFPO(Stack Frame Pointer OverFlow)  (0) 2020.04.22

+ Recent posts