PLT VS GOT


PLT(Procedure Linkage Table)

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

(GOT와 연결해주는 역할, 실제 바이너리에서도 사용하고자 하는 함수/라이브러리 주소 대신 PLT를 호출함.)


GOT(Global Offset Table)

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

해당 주소로 점프한다. (GOT는 외부 라이브러리 함수의 주소를 저장한다.)



간단하게 설명을 했으니 이제 GOT overwrite를 실습할거다.


사정상 리눅스가 없어서 Fedora Core3 문제 가상머신에서 실습을 했다.


일단 위와 같이 소스를 짰다. pritnf함수의 인자로 /bin/sh을 넣었다. 이렇게 한 이유는 이따가 pritnf함수의 got를 변경하기 위해서다.


우선 BP를 메인함수 직전에 걸어버린다.


그리고 run한다.

run하면 system 함수의 주소를 확인할 수 있다. system함수의 주소는 0x7507c0이다.


main함수를 디스어셈블리하면 printf함수의 주소가 나온다.

(fedora core3에서 하니 이렇게 함수 이름이 안나오는데 _init+56은 pritntf가 맞다.)


해당 주소를 i를 써서 코드로 보면 *0x8049574로 점프하는 부분이 있다. 저기가 got다.

 

주소를 확인해보면 GOT가 맞다.


이제 set명령으로 printf의 got를 system함수의 주소로 바꿔버리고 계속 실행하면

printf("/bin/sh") -> system("/bin/sh")로 코드가 변경되어서 실행이 된다.


개신기..


'HACKING > System hacking' 카테고리의 다른 글

double free bug  (0) 2018.05.10
pwnable 풀 때 objdump  (0) 2018.02.25
CTF pwn 문제용 nc 서버 만들기  (0) 2018.02.15
GDB BP에 관한 것  (0) 2017.11.29
heapoverflow 문제 풀이3  (0) 2016.11.05

+ Recent posts