티스토리 뷰

System/PLT&GOT

PLT, GOT

07VH 2012. 8. 30. 20:38

PLT와 GOT의 구조를 알아보기 위해 간단한 덧셈 소스코드를 만들어보자.

만든 다음, Section header만 띄우기 위해 readelf -S을 쳐보면 다음과 같다.

여기서 .plt와 .got.plt section을 볼 수 있다.

.plt 섹션은 Procedure Linkage Table의 약자로써 함수를 링크가능한 테이블로 프로그램이 호출하는 모든 함수가 나열되어 있다.

.got.plt 섹션은 Global Offset Table의 약자로 전역 offset을 가지는 테이블이다.

이제 gdb로 파일을 둘러보자.

main을 disassem 했을 경우 다음과 같다.

main을 보았을 때 첫 부분에서 printf가 호출되는 것을 볼 수 있다.

한 번 내용을 들여다보자.

어딘가로 점프를 하는 것을 볼 수 있다. 계속 따라가보자.

이번엔 got 영역으로 들어왔다. 원래 저 부분에 printf의 실질적 라이브러리 주소가 있어야 하지만 지금은 첫번째로 printf가 호출되는 상황이므로 아직 printf의 라이브러리 주소를 구해놓지 않은 상황이기 때문에 <printf@plt+6>으로 가는 것을 볼 수 있다.

그렇기 때문에 main에서 printf 다음 주소에 breaking point를 걸고 running을 시킨 다음에 got를 다시 확인해보자.

위를 보면 아까와는 값이 다른 것을 알 수 있다.

결론적으로 FSB를 이용해 GOt overwrite 기법에도 사용된다.

그리고 -static 옵션으로 컴파일하면 모든 함수들이 프로그램 내부에 들어와서 위에 내용이 전부 필요없다고 한다. 다만 용량이 많이 커진다는 단점이 존재한다는 점.

오늘은 여기서 그만 접고 자야 겠다.

'System > PLT&GOT' 카테고리의 다른 글

GOT Overwrite - 1  (0) 2012.09.14
동적, 정적 라이브러리의 차이점  (0) 2012.08.30
PLT&GOT에 대해서...  (0) 2012.08.30
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함