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 |